Come posso far funzionare questo mini gioco

di il
56 risposte

56 Risposte - Pagina 3

  • Re: Come posso far funzionare questo mini gioco

    Sembrava fosse perfetto, ma gli errori più ricorrenti sono

    expected ')' before ';' token
    expected ';' before ')' token

    però non riesco a vedere dove ho dimenticato le semicolonne o le parentesi, leggendo indica che sia anche sinonimo di doverne togliere alcune, ma confrontando i codici non mi pare vi sia grande differenza, tendo a precisare di nuovo che ho riscritto il codice da 0, ma al posto dello switch ho continuato ad usare esclusivamente if else e while, non vi sono errori grammaticali, ma esclusivamente quelli che ho indicato sopra con qualche eccezione
    
    #include<iostream>
    #include<limits>
    using namespace std
    
    int main()
    {
        bool flag;
        int a, b;
        char war;
        char again = 's';
        
        while ((cout << "Numero cowboys: ") && !(cin >> a))
        {
            cout << "Si prega di immettere un numero ";
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(); '\n');
        }
        cin.ignore(numeric_limits<streamsize>::max(); '\n');
        while ((cout << "Numero cowgirls: ") && !(cin >> b))
        {
            cout << "Si prega di immettere un numero ";
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(); '\n');
        }
        cin.ignore(numeric_limits<streamsize>::max(); '\n');
        
        flag = true;
        while (again == 's' || again == 'S')
        {
            cout << "Chi attacca per primo? (s\n) \n";
            cin.ignore(numeric_limits<streamsize>::max(); '\n');
            cin >> war;
            if (war == 's')
            {
                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;
            }
            if ( war == 'n' )
            {
                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 << "Numero cheerleaders " << b << endl;
            }
            if 
            {
                cout << "Input errato, riprova." << endl;
                flag = false;
            }
            if
            {
                cout << "Vuoi attaccare ancora? (s\n)" << endl;
                cin.ignore(numeric_limits<streamsize>:.max(); '\n');
                cin >> again;
            }
        }
    }
    
    mi sa che non ho ancora capito perfettamente come la funzione booleana sia richiamata, i piaceri dello scrivere
  • Re: Come posso far funzionare questo mini gioco

    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    Dopo max() c'è la virgola non punto e virgola.
  • Re: Come posso far funzionare questo mini gioco

    skynet ha scritto:


    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    Dopo max() c'è la virgola non punto e virgola.
    Mamma che errore idiota scusami, ora rimangono 3 robe

    expected ';' before 'int'
    e due
    expected '(' before '{' token

    spero che almeno la struttura sia giusta perchè ancora una volta non vedo nulla
  • Re: Come posso far funzionare questo mini gioco

    using namespace std
    Manca il punto e virgola.

    Controlla anche gli if alla fine che sono vuoti
  • Re: Come posso far funzionare questo mini gioco

    #include<iostream>
    #include<limits>
    using namespace std;
    
    int main()
    {
    	bool flag;
    	int a, b;
    	char war;
    	char again = 's';
    
    	while ((cout << "Numero cowboys: ") && !(cin >> a))
    	{
    		cout << "Si prega di immettere un numero ";
    		cin.clear();
    		cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	}
    	cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	while ((cout << "Numero cowgirls: ") && !(cin >> b))
    	{
    		cout << "Si prega di immettere un numero ";
    		cin.clear();
    		cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	}
    	cin.ignore(numeric_limits<streamsize>::max(), '\n');
    
    	flag = true;
    	while (again == 's' || again == 'S')
    	{
    		cout << "Chi attacca per primo? (s\n) \n";
    		cin.ignore(numeric_limits<streamsize>::max(), '\n');
    		cin >> war;
    		if (war == 's')
    		{
    			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 (war == 'n')
    		{
    			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 << "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;
    		}
    	}
    }
    
    Correzione completa
  • Re: Come posso far funzionare questo mini gioco

    Grazie ancira domani studio meglio
  • Re: Come posso far funzionare questo mini gioco

    Alla fine ho notato un altro errore stupido in uno dei cin.ignore dato che li scrivevo a mano per memorizzarli, comunque completato, unico problema è che con la linea cin.ignore mi chiede due volte l'input, sinceramente non riesco a trovare qualcosa su internet che risponda a questo problema, almeno però funziona tutto.
    
    #include<iostream>
    #include<limits>
    using namespace std;
    
    int main()
    {
        bool flag;
        int a, b;
        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');
        
        flag = true;
        while (again == 's' || again == 'S')
        {
            cout << "Chi attacca per primo? (s/n) \n";
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cin >> war;
            if (war == 's')
            {
                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 ( war == 'n' )
            {
                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;
            }
        }
    }
    
    Inoltre avevo una domanda, ma quindi cin.ignore fa un lavoro simile a fflush dove praticamente libera lo stream alla fine del programma oltre a pulire così l'inpunt non rimane lo stesso di prima?
  • Re: Come posso far funzionare questo mini gioco

    Dopo questo ho provato a creare un gioco effetto "Roll the dice", così premendo invio in base al random creato o una squadra attacca o l'altra attacca, ovviamente come seed ho usato srand(time(NULL)); però sembra che in certe fasce di orario funzioni mentre in altre no, cioè ad un certo tempo attacca mentre all'altro da input errato, incollando il codice capirete meglio credo
    
    #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;
            }
        }
    }
    
    Ho messo come variabile dice, e come codice "dice = rand() % 10;" cosicchè mi dia numeri piccoli ed interi, non l'ho mai visto superare il 10 provando questo codice
    
    #include<iostream>
    #include<time.h>
    #include<stdlib.h>
    
    int main()
    {
        int dice;
        
        srand (time(NULL));
        dice = rand() % 10;
        std::cout<< dice;
        if ( std::cin.get())
        {
            return 0;
        }
    }
    
    allora come mai da input errato? Se tolgo il "% 10" inoltre mi da numeri come 5800 e così via, ora provate a capirmi, x e y sono numeri a caso, 58xy per esempio, questa x sembra si comporti come i secondi, e y i millisecondi, il resto non riesco a capire cosa sia ( 58 ), avete una spiegazione? Internet dice solo che prende il seed dal tempo, ma non riesco a spiegarmi questo numero a 4 cifre, ah inoltre nel secondo codice seppure abbia messo <iostream> non mi riconosceva cout e cin stavolta, strano, ho dovuto aggiungere std::
  • Re: Come posso far funzionare questo mini gioco

    Ma questa if

    if ( dice>5 && dice>=10 )

    che vuol dire?

    Perché non controlli le if dopo che le scrivi ?
  • Re: Come posso far funzionare questo mini gioco

    oregon ha scritto:


    Ma questa if

    if ( dice>5 && dice>=10 )

    che vuol dire?

    Perché non controlli le if dopo che le scrivi ?
    Si vede che ho copiato il vecchio codice per errore perché ricordo di averlo corretto

    edit
    confermo per errore ho incollato quello vecchio, manca anche un cin.get dentro l'if cosicché quando premo invio fa partire questo bivio, e decide in base all'output random
  • Re: Come posso far funzionare questo mini gioco

    Cioè? Qual è il codice corretto che esegui?
  • Re: Come posso far funzionare questo mini gioco

    Inoltre, ragiona, ma se 'dice>=10' e true potrebbe avere un valore >= a 5?

    In altri termini: perche' scrivi

    dice>5 && dice>=10

    ?

    E' come dire: di che colore e' il cavallo bianco di Napoleone?
  • Re: Come posso far funzionare questo mini gioco

    Seconda parte:

    fare copia/incolla di codice a casaccio non e' molto utile.

    Inoltre la programmazione non e' un'attivita' miracolosa: basta leggere la documentazione!
    E fare quella pratica assolutamente innaturale che si chiama studiare!

    time(): funzione che ritorna un timestamp, cioe' un numero che rappresenta l'istante in cui la funzione e' stata chiamata
    srand(): inizializza il generatore di numeri pseudocasuali
    rand(): ritorna il prossimo numero pseudocasuale, compreso tra un valore minimo (0) e massimo (2^31-1)
    a % b: ritorna il resto della divisione tra a e b

    Quindi, ora ti dovrebbe essere chiaro che cosa vuol dire
    
    srand(time(NULL));
    dice = rand() % 10;
    
    Che cosa e' un generatore di numeri pseudocasuali?

    Studia!

    Dove? Un po' di immaginazione, suvvia!
  • Re: Come posso far funzionare questo mini gioco

    migliorabile ha scritto:


    Inoltre, ragiona, ma se 'dice>=10' e true potrebbe avere un valore >= a 5?

    In altri termini: perche' scrivi

    dice>5 && dice>=10

    ?

    E' come dire: di che colore e' il cavallo bianco di Napoleone?
    era un errore come precedentemente detto, doveva essere un numero compreso tra 6 e 10 praticamente, mentre l'altro mentre l'altro tra 1 e 5, corretti entrambi

    migliorabile ha scritto:


    rand(): ritorna il prossimo numero pseudocasuale, compreso tra un valore minimo (0) e massimo (2^31-1)

    era questa la parte che mi mancava da capire, il resto mi era chiaro, che srand() inizializzava il generatore e cosa è la funzione modulo, non è che mi limito ad incollare.
    Rimane il fatto che non riesco a capire perchè in certe fascie di orario l'input sia errato mentre in un'altro no.
  • Re: Come posso far funzionare questo mini gioco

    Posta nuovamente il codice che tu ritieni corretto ... se c'è un comportamento anomalo vedrai che c'è ancora un errore ...
Devi accedere o registrarti per scrivere nel forum
56 risposte