[C++] CRAP

di il
17 risposte

[C++] CRAP

Salve, ho realizzato una semplice simulazione per un gioco di dadi chiamatoc crap.
Tutto funziona bene eccetto l'ultima parte.
Ovvero come si vede dal codice se quando lancio i dai esce un numero che è 4 5 6 8 9 o 10, il giocatore deve rilanciare i dadi fino a che non ottiene uno di questi numeri. Se esce un 7 perde.
Ho realizzato ciò con un do while ma va in loop infinito. Non capisco cosa sbaglio.
P.S. la condizione if del 7 la ho tolta momentaneamente.
grazie

#include<iostream>
using namespace std;
int main ()
{
    double puntata;
    cout<<"quanto vuoi puntare "<<endl;
    cin>>puntata;
    double budget=0;
    srand(time(0));
    int dado1;
    int dado2;
    int somma_iterata=0;
    dado1=rand()%6+1;
    cout<<"dado 1 risulta "<<dado1<<endl;
    dado2=rand()%6+1;
    cout<<"dado 2 risulta "<<dado2<<endl;
    int somma = dado1+dado2;
    cout<<"somma risulta "<<somma<<endl;
    if(somma==7||somma==11)
    {
     cout<<"hai vinto wow "<<endl;
     puntata=puntata*10;
     budget=budget+puntata;
     }
         else if (somma==2||somma==3||somma==12)
         {
         cout<<"hai perso wow "<<endl;
          budget=budget-puntata;
           }
           else if (somma==4||somma==5||somma==6||somma==8||somma==9||somma==10)
             {
              cout<<"ok ora si comincia a iterare "<<endl;
               do
                 {
                  int dado3=rand()%6+1;
                  cout<<"dado 3 risulta "<<dado1<<endl;
                  int dado4=rand()%6+1;
                   cout<<"dado 4 risulta "<<dado2<<endl;
                   int somma_iterata = dado3+dado4;  
                   cout<<"somma iterata risulta "<<somma_iterata<<endl;
                   }
                    while (somma_iterata!=somma); 
                     }
                     else
                     cout<<"non valido ";
             
             system("pause");
             return 0;
             }

17 Risposte

  • Re: [C++] CRAP

    Questo ciclo

    while (somma_iterata!=somma);

    non esegue nulla e se viene eseguito non termina mai.
  • Re: [C++] CRAP

    @oregon:c'è un do sopra... l'indetazione è pessima...

    Mi sa che il problema è che hai 2 diverse int somma_iterata...
  • Re: [C++] CRAP

    candaluar ha scritto:


    @oregon:c'è un do sopra... l'indetazione è pessima...
    Ah ... vero, ma è illeggibile ... per ora non ho tempo di metterlo a posto per controllarlo ...
  • Re: [C++] CRAP

    Il problema è la variabile somma_iterata che è definita all'interno del ciclo (oltre che nel main()) quindi nel test viene utilizzato il valore della variabile locale al main(), non locale al ciclo che evidentemente è stata correttamente calcolata.
  • Re: [C++] CRAP

    Anche io pensavo cosi ma se non dichiaro somma_iterata nel main il do while non gira
  • Re: [C++] CRAP

    Provo a indentare meglio
    
    #include<iostream>
    using namespace std;
    int main ()
    {
        double puntata;
        cout<<"quanto vuoi puntare "<<endl;
        cin>>puntata;
        double budget=0;
        srand(time(0));
        int dado1;
        int dado2;
        dado1=rand()%6+1;
        cout<<"dado 1 risulta "<<dado1<<endl;
        dado2=rand()%6+1;
        cout<<"dado 2 risulta "<<dado2<<endl;
        int somma = dado1+dado2;
        cout<<"somma risulta "<<somma<<endl;
      
        if(somma==7||somma==11)
        {
         cout<<"hai vinto wow "<<endl;
         puntata=puntata*10;
         budget=budget+puntata;
         }
         		else if (somma==2||somma==3||somma==12)
             	{
         		cout<<"hai perso wow "<<endl;
         		budget=budget-puntata;
        		 }
         			 else if (somma==4||somma==5||somma==6||somma==8||somma==9||somma==10)
         				{
         				 cout<<"ok ora si comincia a iterare "<<endl;
         					 do
          						{
                                 int dado3=rand()%6+1;
                                 cout<<"dado 3 risulta "<<dado1<<endl;
                                 int dado4=rand()%6+1;
                                 cout<<"dado 4 risulta "<<dado2<<endl;
                                 int somma_iterata = dado3+dado4;  
                                 cout<<"somma iterata risulta "<<somma_iterata<<endl;
                                 }
                                 while (somma_iterata!=somma); 
               												  }
      
                 						else
                 							cout<<"non valido ";
                 
                 						system("pause");
                						 return 0;
                										 }
    
  • Re: [C++] CRAP

    Io ho risolto il problema inserendo una variabile booleana chiamata flag per interrompere il ciclo...

    ti invio il codice.. ora però il ciclo si interrompe quando la variabile somma è uguale alla variabile somma_iterata.. spero volessi questo perchè non ho capito molto bene..
    soprattutto il codice è completamente illeggibile ti consiglio di inserire un po di commenti e di separare le righe di codice in modo da rendere leggibile tutto il codice anche a qualcuno che non lo abbia progettato fin dall'inizio..
    
    #include<iostream>
    using namespace std;
    int main ()
    {
        double puntata;
        bool flag = false; // variabile bandiera utilizzata per interrompere il ciclo 
        cout << "quanto vuoi puntare " << endl;
        cin >> puntata;
        
        double budget = 0;
        srand(time(0));
        int dado1;
        int dado2;
        int somma_iterata = 0;
        
        
        dado1 = rand() % 6+1;
        cout << "dado 1 risulta " << dado1 << endl;
        dado2 = rand()%6+1;
        cout<< "dado 2 risulta " << dado2 << endl;
        int somma = dado1 + dado2;
        cout << " somma risulta " << somma << endl;
        if(somma == 7 || somma == 11)
        {
            cout << "hai vinto wow " << endl;
            puntata = puntata*10;
            budget = budget + puntata;
        }
        else if (somma == 2||somma == 3||somma == 12)
        {
            cout << "hai perso wow " << endl;
            budget = budget-puntata;
        }
        else if (somma==4||somma==5||somma==6||somma==8||somma==9||somma==10)
        {
            cout << "ok ora si comincia a iterare " << endl;
            do
            {
                int dado3=(rand()+time(0))%6+1; // ho aggiunto la scrittura rand()+time(0)
                                                                 // serve per fare in modo di generare sempre un numero 
                                                                 // casuale ma diverso dal precedente (se non lo vuoi        
                                                                 // toglilo)
                cout<< "dado 3 risulta " << dado3 << endl;
                int dado4 = (rand()+time(0)) % 6+1;
                cout << "dado 4 risulta " << dado4 << endl;
                int somma_iterata = dado3+dado4;
                cout << "somma: " << somma << endl;
                cout << "somma iterata risulta " << somma_iterata << endl;
                
                if (somma == somma_iterata)
                    flag = true;
                getchar(); // questo serve unicamente come "blocca-programma" temporaneo per il debug
            }
            while (!flag);
        }
        else
            cout << "non valido ";
        
        getchar(); // funziona meglio del system("pause") soprattutto perchè lavoro su mac
        return 0;
    }
    ho tentato di rendere il tuo codice più leggibile ma con pessimi risultati, per quello dovresti quasi riscriverlo completamente..
  • Re: [C++] CRAP

    anche io pensavo cosi ma se non dichiaro somma_iterata nel main il do while non gira
    una variabile locale ad un blocco di un ciclo non può essere utilizzata per la condizione del ciclo; cosa vuol dire il do while non gira???
  • Re: [C++] CRAP

    una variabile locale ad un blocco di un ciclo non può essere utilizzata per la condizione del ciclo.
    ecco, qui volevo arrivare. Grazie.
    Puoi chiarirmi meglio questo concetto?
    In pratica la variabile somma iterata non potrebbe essere usata nella condizione del ciclo perchè è già stata definita come variabile locale ne ciclo giusto?
    Quindi io la dovevo ridichiarare nel main e il do while allora generava un loop infinito .
    E' questo il concetto?

    Nosba, grazie per la dritta, ora studio la tua soluzione
  • Re: [C++] CRAP

    !flag equivale a scrivere flag=false?
  • Re: [C++] CRAP

    Allora per chiarirti il concetto.. dovresti studiare dal libro sul quale studi o in rete l'ambito di visibilità di una variabile...

    la variabile int somma_iterata definita nella main e la variabile
    con lo stesso nome definita nel blocco del ciclo do... while sono per il compilatore due variabili completamente diverse... lui però deve decidere quale usare.. e usa quella che hai dichiarato dentro il blocco do... while perchè è la più "piccola" cioè è visibile solo dentro il blocco... quando tu usi la variabile nella condizione..

    do
    {
    ...
    }
    while (variabile)

    non usi quella del blocco ma quella che avevi dichiarato nella main.. che ha sempre il valore 0 dato che se non sbaglio l'avevi inizializzata.. quindi lui andava in loop infinito solo perche per lui la variabile di condizione era sempre 0..

    spero di essermi spiegato se vuoi approfondire vai su google


    troverai una guida più approfondita...
  • Re: [C++] CRAP

    In effetti guardando meglio il tuo codice ti basterebbe anche cancellare semplicemente la scritta int all'interno del blocco do.. while!!

    trasformando il codice da cosi:
    
    int dado3=(rand()+time(0))%6+1; // ho aggiunto la scrittura rand()+time(0)
                                                // serve per fare in modo di generare sempre un numero
                                                // casuale ma diverso dal precedente (se non lo vuoi
                                                // toglilo)
                cout<< "dado 3 risulta " << dado3 << endl;
                int dado4 = (rand()+time(0)) % 6+1;
                cout << "dado 4 risulta " << dado4 << endl;
                int somma_iterata = dado3+dado4;
                cout << "somma: " << somma << endl;
                cout << "somma iterata risulta " << somma_iterata << endl;
                getchar(); // questo serve unicamente come "blocca-programma" temporaneo per il debug
            }
            while (somma != somma_iterata);
    a cosi:
    
    int dado3=(rand()+time(0))%6+1; // ho aggiunto la scrittura rand()+time(0)
                                                // serve per fare in modo di generare sempre un numero
                                                // casuale ma diverso dal precedente (se non lo vuoi
                                                // toglilo)
                cout<< "dado 3 risulta " << dado3 << endl;
                int dado4 = (rand()+time(0)) % 6+1;
                cout << "dado 4 risulta " << dado4 << endl;
                somma_iterata = dado3+dado4;   // guarda qua manca l'int 
                cout << "somma: " << somma << endl;
                cout << "somma iterata risulta " << somma_iterata << endl;
                getchar(); // questo serve unicamente come "blocca-programma" temporaneo per il debug
            }
            while (somma != somma_iterata);
  • Re: [C++] CRAP

    Grazie, anche per il link
    Ma non ho capito perchè se nel programma toglio int funziona.
  • Re: [C++] CRAP

    Ho verificato ma togliendo int dal blocco do while non funziona comunque.
    Ho però risolto andando a dichiarare somma_iterata all'esterno del do while ma dentro la condizione else-if.
    Era un problema di visibilità variabili dunque.
    In questo modo la variabile somma iterata assume il valore corretto e non più quello del main che dava luogo a loop infinito.
    
    else if (somma==4||somma==5||somma==6||somma==8||somma==9||somma==10)
              {
               cout<<"ok ora si comincia a iterare "<<endl;
               int somma_iterata;
          
                do
                {
                     int dado3=rand()%6+1;
                     cout<<"dado 3 risulta "<<dado3<<endl;
                     int dado4=rand()%6+1;
                     cout<<"dado 4 risulta "<<dado4<<endl;
                     somma_iterata = dado3+dado4;  
                     cout<<"somma iterata risulta "<<somma_iterata<<endl;
                     
                         if(somma_iterata==7)
                         {
                          cout<<"hai perso ciao e grazie "<<endl;
                          budget=budget-puntata;
                          break;
                              }
                                 }
                   while (somma_iterata!=somma); 
    
    ho provato diverse combinazioni e sembra che tutto funzioni ora
Devi accedere o registrarti per scrivere nel forum
17 risposte