Come posso far funzionare questo mini gioco

di il
56 risposte

56 Risposte - Pagina 4

  • Re: Come posso far funzionare questo mini gioco

    oregon ha scritto:


    Posta nuovamente il codice che tu ritieni corretto ... se c'è un comportamento anomalo vedrai che c'è ancora un errore ...
    Perdona il ritardo
    
    #include<iostream>
    #include<limits>
    #include<stdlib.h>
    #include<time.h>
    using namespace std;
    
    int main()
    {
        bool flag;
        int a, b, dice;
        char war;
        char again = 's';
        
        while ((cout << "Numero cowboys: ") && !(cin >> a))
        {
            cout << "\nSi prega di immettere un numero" << endl;
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        while ((cout << "Numero cowgirls: ") && !(cin >> b))
        {
            cout << "\nSi prega di immettere un numero\n";
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        srand (time(NULL));
        dice = rand() % 10;
        flag = true;
        while (again == 's' || again == 'S')
        {
            cout << "Roll the dice \n";
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cin.get();
            if ( dice>0 && dice<=5 )
            {
                cout << "I cowboys attaccano per primi, le cheerleaders perdono una unità." << endl;
                b--;
                if (b == 0)
                {
                    cout << "Game over per le cheerleaders." << endl << endl;
                    cout << "Premi enter per chiudere." << endl;
                    cin.ignore(numeric_limits<streamsize>::max(), '\n');
                    cin.get();
                    return 0;
                }
                cout << "Numero cowboys " << a << endl << "Numero Cheerleaders " << b << endl;
            }
            else if ( dice>5 && dice<=10 )
            {
                cout << "Le cheerleaders attaccano per prime, i cowboys perdono una unità." << endl;
                a--;
                if (a == 0)
                {
                    cout << "Game over per i cowboys." << endl << endl;
                    cout << "Premi enter per chiudere." << endl;
                    cin.get();
                    return 0;
                }
                cout << "Numero cwboys " << a << endl << "Numero cheerleaders " << b << endl;
            }
            else 
            {
                cout << "Input errato, riprova." << endl;
                flag = false;
            }
            if (flag)
            {
                cout << "Vuoi attaccare ancora? (s/n)" << endl;
                cin.ignore(numeric_limits<streamsize>::max(), '\n');
                cin >> again;
            }
        }
    }
    
  • Re: Come posso far funzionare questo mini gioco

    Ciao,
    ho dato un'occhiata piuttosto veloce al codice e inoltre ammetto di non aver avuto il tempo di leggere tutta la discussione. Però alcune cose mi saltano all'occhio: tu assegni a "dice" un valore casuale compreso tra 0 e 9. Poi fai
    
    if(dice > 0 && dice <=5)
    {
        ...
    }
    else if(dice > 5 && dice <= 10)
    {
        ...
    }
    else
    {
        input errato
    }
    
    Innanzitutto il <=10 è inutile perché sarà sempre vero. Poi perché trascuri lo zero? Se "dice" viene 0 ti darà input errato!

    Invece farei così:
    
    dice = rand() % 10;
    
    ...
    
    if(dice <= 5)    /* cioe' 0, 1, 2, 3, 4 */
    {
        ...
    }
    else    /* cioe' 5, 6, 7, 8, 9 */
    {
        ...
    }
    
    Infatti tu sorteggi un numero compreso tra 0 e 9: o è minore-uguale a 5, o è maggiore di 5. Non vedo altre possibilità.

    Ciao.
  • Re: Come posso far funzionare questo mini gioco

    EDIT

    Ho visto un altro errore: l'assegnazione
    
    dice = rand() % 10;
    
    è fuori dal ciclo while, quindi il valore non cambia mai.
  • Re: Come posso far funzionare questo mini gioco

    minomic ha scritto:


    EDIT

    Ho visto un altro errore: l'assegnazione
    
    dice = rand() % 10;
    
    è fuori dal ciclo while, quindi il valore non cambia mai.
    grazie veramente non l'avevo nemmeno pensato in quei termini il <=5 e l'else usato così, non avevo nemmeno pensato che fosse necessario tenere la variabile dentro, correggo molto volentieri grazie ancora
  • Re: Come posso far funzionare questo mini gioco

    In base a quanto abbiamo detto, proporrei qualcosa del genere:
    
    #include<iostream>
    #include<limits>
    #include<stdlib.h>
    #include<time.h>
    using namespace std;
    
    int main()
    {
    	int a, b, dice;
    	char again = 's';
    
    	while ((cout << "Numero cowboys: ") && !(cin >> a))
    	{
    		cout << "\nSi prega di immettere un numero" << endl;
    		cin.clear();
    		cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	}
    	cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	while ((cout << "Numero cowgirls: ") && !(cin >> b))
    	{
    		cout << "\nSi prega di immettere un numero\n";
    		cin.clear();
    		cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	}
    	cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	srand (time(NULL));
    	while (again == 's' || again == 'S')
    	{
    		cout << "Roll the dice \n";
    		cin.ignore(numeric_limits<streamsize>::max(), '\n');
    		cin.get();
    		dice = rand() % 10;
    		
    		/* per controllo */
    		cout << "Dice = " << dice << endl;
    		
    		if ( dice <= 5 )
    		{
    			cout << "I cowboys attaccano per primi, le cheerleaders perdono una unità." << endl;
    			b--;
    			if (b == 0)
    			{
    				cout << "Game over per le cheerleaders." << endl << endl;
    				cout << "Premi enter per chiudere." << endl;
    				cin.ignore(numeric_limits<streamsize>::max(), '\n');
    				cin.get();
    				return 0;
    			}
    			cout << "Numero cowboys " << a << endl << "Numero cheerleaders " << b << endl;
    		}
    		
    		else if ( dice > 5 )		/* basterebbe anche solo "else" */
    		{
    			cout << "Le cheerleaders attaccano per prime, i cowboys perdono una unità." << endl;
    			a--;
    			if (a == 0)
    			{
    				cout << "Game over per i cowboys." << endl << endl;
    				cout << "Premi enter per chiudere." << endl;
    				cin.get();
    				return 0;
    			}
    			cout << "Numero cowboys " << a << endl << "Numero cheerleaders " << b << endl;
    		}
    		
    		cout << "Vuoi attaccare ancora? (s/n)" << endl;
    		cin >> again;
    	}
    }
    
    Tu provalo, poi ci fai sapere se riscontri altri problemi.
  • Re: Come posso far funzionare questo mini gioco

    Tutto perfettamente funzionante, rimane però il fatto che devo premere due volte enter quando aggiungo cin.ignore, come dovrei modificare la linea così posso evitare quel passaggio in più?
  • Re: Come posso far funzionare questo mini gioco

    Prova così:
    
    #include<iostream>
    #include<limits>
    #include<stdlib.h>
    #include<time.h>
    using namespace std;
    
    int main()
    {
    	int a, b, dice;
    	char again = 's';
    
    	while ((cout << "Numero cowboys: ") && !(cin >> a))
    	{
    		cout << "\nSi prega di immettere un numero" << endl;
    		cin.clear();
    		cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	}
    	cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	while ((cout << "Numero cowgirls: ") && !(cin >> b))
    	{
    		cout << "\nSi prega di immettere un numero\n";
    		cin.clear();
    		cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	}
    	cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	srand (time(NULL));
    	while (again == 's' || again == 'S')
    	{
    		cout << "Roll the dice \n";
    		cin.get();
    		cin.ignore(numeric_limits<streamsize>::max(), '\n');
    		dice = rand() % 10;
    		
    		/* per controllo */
    		cout << "Dice = " << dice << endl;
    		
    		if ( dice <= 5 )
    		{
    			cout << "I cowboys attaccano per primi, le cheerleaders perdono una unità." << endl;
    			b--;
    			if (b == 0)
    			{
    				cout << "Game over per le cheerleaders." << endl << endl;
    				cout << "Premi enter per chiudere." << endl;
    				cin.get();
    				return 0;
    			}
    			cout << "Numero cowboys " << a << endl << "Numero cheerleaders " << b << endl;
    		}
    		
    		else if ( dice > 5 )		/* basterebbe anche solo "else" */
    		{
    			cout << "Le cheerleaders attaccano per prime, i cowboys perdono una unità." << endl;
    			a--;
    			if (a == 0)
    			{
    				cout << "Game over per i cowboys." << endl << endl;
    				cout << "Premi enter per chiudere." << endl;
    				cin.get();
    				return 0;
    			}
    			cout << "Numero cowboys " << a << endl << "Numero cheerleaders " << b << endl;
    		}
    		
    		cout << "Vuoi attaccare ancora? (s/n)" << endl;
    		cin >> again;
    	}
    }
    
    
  • Re: Come posso far funzionare questo mini gioco

    Purtroppo si comporta identicamente
  • Re: Come posso far funzionare questo mini gioco

    In effetti io avevo seguito la struttura che avevi postato tu, pur senza capirla molto, nel senso che alcune cose mi sembravano poco sensate.

    Questo mi sembra un comportamento migliore:
    
    #include<iostream>
    #include<limits>
    #include<stdlib.h>
    #include<time.h>
    using namespace std;
    
    int main()
    {
    	int a, b, dice;
    	char again = 's';
    
    	while ((cout << "Numero cowboys: ") && !(cin >> a))
    	{
    		cout << "\nSi prega di immettere un numero" << endl;
    		cin.clear();
    		cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	}
    	cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	while ((cout << "Numero cowgirls: ") && !(cin >> b))
    	{
    		cout << "\nSi prega di immettere un numero\n";
    		cin.clear();
    		cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	}
    	cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	srand (time(NULL));
    	while (again == 's' || again == 'S')
    	{
    		cout << "Roll the dice \n";
    		dice = rand() % 10;
    		
    		/* per controllo */
    		cout << "Dice = " << dice << endl;
    		
    		if ( dice <= 5 )
    		{
    			cout << "I cowboys attaccano per primi, le cheerleaders perdono una unità." << endl;
    			b--;
    			if (b == 0)
    			{
    				cout << "Game over per le cheerleaders." << endl << endl;
    				cout << "Premi enter per chiudere." << endl;
    				cin.get();
    				return 0;
    			}
    			cout << "Numero cowboys " << a << endl << "Numero cheerleaders " << b << endl;
    		}
    		
    		else if ( dice > 5 )		/* basterebbe anche solo "else" */
    		{
    			cout << "Le cheerleaders attaccano per prime, i cowboys perdono una unità." << endl;
    			a--;
    			if (a == 0)
    			{
    				cout << "Game over per i cowboys." << endl << endl;
    				cout << "Premi enter per chiudere." << endl;
    				cin.clear();
    				cin.ignore(numeric_limits<streamsize>::max(), '\n');
    				cin.get();
    				return 0;
    			}
    			cout << "Numero cowboys " << a << endl << "Numero cheerleaders " << b << endl;
    		}
    		
    		cout << "Vuoi attaccare ancora? (s/n)" << endl;
    		cin >> again;
    	}
    }
    
    Prova e vedi se così va bene. Altrimenti ormai dovresti aver capito dove mettere le mani per modificare quello che non ti piace.
  • Re: Come posso far funzionare questo mini gioco

    Capisco che era un passaggio inutile avere un cin.get() per il roll, stavo semplicemente provando un po' di funzioni, almeno ho capito che funzionano ha cin.ignore() e cin.clear() dove cancella il dato dal buffer impedendo al programma di proseguire da solo, però appunto pare che usandolo chieda due volte l'input, ho notato che nel tuo codice pur essendo assente nella sezione finale "again" ogni volta richieda comunque ogni volta se riattaccare, questo è perchè è presente
    
       cin.ignore(numeric_limits<streamsize>::max(), '\n');
       srand (time(NULL));
       while (again == 's' || again == 'S')
    
    cin.ignore() dopo l'again?

    Altro dubbio che posso anche dire finale ormai per il thread, nel mio codice non ancora alterato
    
    #include<iostream>
    #include<limits>
    #include<stdlib.h>
    #include<time.h>
    using namespace std;
    
    int main()
    {
        bool flag;
        int a, b, dice;
        char war;
        char again = 's';
        
        while ((cout << "Numero cowboys: ") && !(cin >> a))
        {
            cout << "\nSi prega di immettere un numero" << endl;
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        while ((cout << "Numero cowgirls: ") && !(cin >> b))
        {
            cout << "\nSi prega di immettere un numero\n";
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        srand (time(NULL));
        while (again == 's' || again == 'S')
        {
            cout << "Roll the dice \n";
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cin.get();
            dice = rand() % 10;
            cout << "Dice = " << dice << endl;
            if ( dice <= 5 )
            {
                cout << "\nI cowboys attaccano per primi, le cheerleaders perdono una unità." << endl;
                b--;
                if (b == 0)
                {
                    cout << "Game over per le cheerleaders." << endl << endl;
                    cout << "Premi enter per chiudere." << endl;
                    cin.ignore(numeric_limits<streamsize>::max(), '\n');
                    cin.get();
                    return 0;
                }
                cout << "Numero cowboys " << a << endl << "Numero Cheerleaders " << b << endl;
            }
            
            else
            {
                cout << "\nLe cheerleaders attaccano per prime, i cowboys perdono una unità." << endl;
                a--;
                if (a == 0)
                {
                    cout << "Game over per i cowboys." << endl << endl;
                    cout << "Premi enter per chiudere." << endl;
                    cin.get();
                    return 0;
                }
                cout << "Numero cwboys " << a << endl << "Numero cheerleaders " << b << endl;
            }
    
                cout << "Vuoi attaccare ancora? (s/n)" << endl;
                cin.ignore(numeric_limits<streamsize>::max(), '\n');
                cin >> again;
        }
    }
    
    Seppure la prima volta chieda due volte l'input quando vogliamo fare il roll alla seconda basta fare enter una sola volta, sapresti spiegarmi questo comportamento?
  • Re: Come posso far funzionare questo mini gioco

    Comportamento del clear ed ignore su stream (nel nostro caso std::cin)
    clear() cancella lo stato fail/oef dello stream che può essere derivato dall'inserimento errato del tipo di variable. Esempio: tu chiedi un int e l'utente mette un char, lo stato va in fail e dovresti riportarlo allo stato normale con clear.

    ignore(a,b) elimina dal buffer, o quanti elementi specificati in a, oppure finche non trova l'elemento b. Se l'elemento b è trovato più volte nel buffer, ignore elimina solo il primo. Quindi se il buffer contiene due '\n' consecutivi ignore ti eliminerà solo il primo lasciandoti il secondo nel buffer.
    Dovresti essere tu con la tua logica di programmazione a far si che questa funzione lavori in modo giusto.

    Fine della lezione.
  • Re: Come posso far funzionare questo mini gioco

    skynet ha scritto:


    Comportamento del clear ed ignore su stream (nel nostro caso std::cin)
    clear() cancella lo stato fail/oef dello stream che può essere derivato dall'inserimento errato del tipo di variable. Esempio: tu chiedi un int e l'utente mette un char, lo stato va in fail e dovresti riportarlo allo stato normale con clear.

    ignore(a,b) elimina dal buffer, o quanti elementi specificati in a, oppure finche non trova l'elemento b. Se l'elemento b è trovato più volte nel buffer, ignore elimina solo il primo. Quindi se il buffer contiene due '\n' consecutivi ignore ti eliminerà solo il primo lasciandoti il secondo nel buffer.
    Dovresti essere tu con la tua logica di programmazione a far si che questa funzione lavori in modo giusto.

    Fine della lezione.
    Non potevo chiedere di meglio da questo forum, da te, e da tutti quelli che hanno contribuito, grazie a tutti.
Devi accedere o registrarti per scrivere nel forum
56 risposte