Problema probabilmente stupido

di il
3 risposte

Problema probabilmente stupido

Sono uno studente 15enne delle scienze applicate che ha iniziato da qualche giorno a programmare in c++, siccome per me una lezione di informatica a settimana è troppo poco mi sono portato avanti con il programma ed ho sperimentato varie funzioni (il massimo che abbiamo fatto in classe è stato l'introduzione alle variabili) essendo stato auto didatta non poso effettivamente capire quale errore io abbia compiuto nel programmare un tamagochi (non so come si scriva) quindi vi incollo la copia dello script del programma ed allego una foto di come viene eseguito il caso numero 4 (gli altri funzionano)


#include <iostream>
#include <stdlib.h>
using namespace std;

int main()
{
int v=10,f=1,s=1,p=1,g=1,i,d,t1,t2;
/* cout<<"Benvenuto nel tuo tamagochi."<<endl;
_sleep (2000);
cout<<"Devi prenderti cura del tuo animaletto artificiale dandogli cibo, da bere e pulendolo."<<endl;
_sleep (4200);
cout<<"All'aumentare delle necessita' del tamagochi i suoi indicatori di bisogno aumenteranno fino ad un massimo di 10."<<endl;
_sleep (4200);
cout<<"Quando anche solo uno degli indicatori arriva a 10 la vita iniziera' a calare lentamente fino al game over."<<endl;
_sleep (4200);*/

for (i=v; v!=0;)
{
cout<<"Vita="<<v<<"/10"<<endl;

cout<<endl;

cout<<"Bisogni:"<<endl;
cout<<"Fame="<<f<<"/10"<<endl;
cout<<"Sete="<<s<<"/10"<<endl;
cout<<"Pulizia="<<p<<"/10"<<endl;
cout<<"Felicita'="<<g<<"/10"<<endl;

cout<<endl;

cout<<"Azioni:"<<endl;
cout<<"1. Sfama"<<endl;
cout<<"2. Disseta"<<endl;
cout<<"3. Lava"<<endl;
cout<<"4. Gioca"<<endl;

cout<<endl;

cout<<"Digita il numero dell'azione che vuoi compiere"<<endl;

cout<<endl;

cin>>d;

switch (d)
{
case 1:
cout<<endl;
if (f=1) f=f-1;
else if (f!=0) f=f-2;
if (g!=0) g=g-1;
if (p!=10) p=p+1;
if (s!=10) s=s+1;
_sleep (2000);
cout<<endl;
break;

case 2:
cout<<endl;
if (s=1) s=s-1;
else if (s!=0) s=s-2;
if (g!=10) g=g+1;
if (f!=10) f=f+1;
_sleep (2000);
cout<<endl;
break;

case 3:
if (p=1) p=p-1;
else if (p!=0) p=p-2;
if (g!=0) g=g-1;
if (s!=10) s=s+1;
if (f!=10) f=f+1;
_sleep (2000);
cout<<endl;
break;

case 4:
if (f=9) f=f+1;
else if (f!=10) f=f+2;
if (s=9) s=s+1;
else if (s!=10) s=s+2;
if (p=9) p=p+1;
else if (p!=10) p=p+2;
if (g=1) g=g-1;
else if(g!=0) g=g-2;
_sleep (2000);
cout<<endl;
break;

default:
cout<<endl;
cout<<"l'azione selezionata non esiste."<<endl;
_sleep (2000);
cout<<endl;
break;
}

if (f==10 || s==10 || p==10 || g==10)
{
v=v-1;
t2=0;
}

else if (v!=10)
{
for (t1=t2; t2++;)
{
if (t1=3)
{
t1=2;
v=v+1;
}
}
}
}

cout<<"Game over";
_sleep (5000);

return 0;
}


P.S. se avete consigli su come ottimizzare, funzioni più comode da utilizzare etc ditemelo pure. Sto scrivendo in questo forum non per trovare la soluzione e basta ma per imparare

3 Risposte

  • Re: Problema probabilmente stupido

    Controlla bene le if:
    
    if (f = 9) f = f + 1;
    ...
    if (s = 9) s = s + 1;
    
    Quelli dentro le parentesi non sono confronti, sono ASSEGNAZIONI! Stai assegnando il valore 9 alla variabile f... essendo che l'espressione è un valore diverso da 0 (il valore è 9), verrà eseguita l'istruzione corrispondente. Lo stesso per tutte quelle dopo.
    Il confronto si fa con l'operatore ==
    
    if (f == 9) f = f + 1;
    
    PS: Abituati fin da subito a dare alle variabili dei nomi significativi... v, s, f, p, g... ora che sei fresco di listato non ci sono problemi... tra un mesetto ti sfido a ricordarti che "g" sta per "felicita", ma la "f" l'avevi già utilizzata per la "fame" senza doverti per forza andare a rileggere il codice dall'inizio. Siccome la leggibilità del codice è parte fondamentale per la manutenzione, usa nomi significativi.
    
    int vita = 10;
    int felicita = 1;
    int pulizia = 1;
    ...
    
    Ciao.
  • Re: Problema probabilmente stupido

    Volevo ringraziarti per non avermi insultato data la stupidità del problema ma a questo punto mi sorge un dubbio.
    Nella parte di codice "if (f==10 || s==10 || p==10 || g==10)" se invece che mettere == metto = il programma mi da errore di sintassi ma perché dove dici tu prende il significato di assegnazione l'= e non di errore? e poi perché funziona nei casi precedenti mentre nel quarto no?
  • Re: Problema probabilmente stupido

    Pattone ha scritto:


    Volevo ringraziarti per non avermi insultato data la stupidità del problema ma a questo punto mi sorge un dubbio.
    Nella parte di codice "if (f==10 || s==10 || p==10 || g==10)" se invece che mettere == metto = il programma mi da errore di sintassi ma perché dove dici tu prende il significato di assegnazione l'= e non di errore? e poi perché funziona nei casi precedenti mentre nel quarto no?
    L'istruzione di assegnazione (in C come in C++ come in altri linguaggi) è un'operazione che è vista anche come un'espressione. Il valore di tale espressione è uguale al valore che viene assegnato alla variabile (cioè, il valore di ciò che sta a destra dell'uguale) e viene sempre valutata da destra verso sinistra.

    Esempietto:
    
    int a = 0;
    int b = 10;
    int c = 11;
    a = b + c;
    
    Con l'istruzione di assegnazione che c'è alla fine del listato, alla variabile "a" viene assegnato il valore dell'espressione che sta a destra dell'uguale. L'espressione viene quindi valutata da destra verso sinistra: prima viene valutata "c", poi viene valutata "b", quindi viene fatta la somma e il risultato viene assegnato alla variabile "a".

    L'intera espressione quindi ha valore 21.

    In C / C++ tutte le espressioni di tipo intero sono valutate in modo booleano a seconda del loro valore: se valgono 0 sono interpretate come FALSO, altrimenti sono sempre interpretate come VERO.

    Questo significa che all'interno della guardia dell'istruzione if (ma anche del while o del for, ecc) posso scrivere qualsiasi espressione che sia valutabile come numero intero.

    Detto questo, bisogna capire cosa hai scritto in quell'espressione perchè ti venga dato errore di sintassi. La seguente istruzione, infatti, è perfettamente lecita (seppur semanticamente sbagliatissima):
    
    if ((f=10 || s=10 || p=10 || g=10)) { ... }
    
    Quel che accade è che "inaspettatamente" il valore della variabile "f" verrà impostato a 10, mentre le variabili "s", "p" e "g" non verranno toccate. Questo, però, ha a che fare con la short-circuit evaluation (che ti consiglio di studiare).

    Non avevo visto gli altri casi in cui hai commesso lo stesso errore (assegnazione invece di confronto). Non capisco cos'è che non ti torna del funzionamento.


    Ciao.
Devi accedere o registrarti per scrivere nel forum
3 risposte