Problema con funzione in C++

di il
6 risposte

Problema con funzione in C++

Ho scritto questo programma di briscola con annessa strategia.

void strategia ()
{
	if (manoU[N-1].s == br.s) 
	{
		if (manoU[N-1].p == 0) //se ha punteggio 0 cerca di rispondere con la carta di minor valore
		{
			if (manoC[0].p == 0 && manoC[0].s != br.s)
			n = 0;
			else if (manoC[1].p == 0 && manoC[0].s != br.s)
			n = 1;
			else if (manoC[2].p == 0 && manoC[0].s != br.s)
			n = 2;
			else if (manoC[0].p == 2 && manoC[0].s != br.s)
			n = 0;
			else if (manoC[1].p == 2 && manoC[1].s != br.s)
			n = 1;
			else if (manoC[2].p == 2 && manoC[2].s != br.s)
			n = 2;
			else if (manoC[0].s != 'n')
	                n = 0;
	                else if (manoC[1].s != 'n')
	                n = 1; 
	                else n = 2;
			
		}
		 
		else if (manoU[N-1].p == 10) 
		{
		    if (manoU[N-1].s == manoC[0].s && manoC[0].p == 11)
	 	    n = 0;
	        else if (manoU[N-1].s == manoC[1].s && manoC[1].p == 11)
	        n = 1;
	        else if (manoU[N-1].s == manoC[2].s && manoC[2].p == 11)
	        n = 2;
		         
			else if (manoC[0].p == 0 && manoC[0].s != br.s)
			n = 0;
			else if (manoC[1].p == 0 && manoC[0].s != br.s)
			n = 1;
			else if (manoC[2].p == 0 && manoC[0].s != br.s)
			n = 2;
			else if (manoC[0].p == 2 && manoC[0].s != br.s)
			n = 0;
			else if (manoC[1].p == 2 && manoC[1].s != br.s)
			n = 1;
			else if (manoC[2].p == 2 && manoC[2].s != br.s)
			n = 2;
			else if (manoC[0].s != 'n')
	        n = 0;
	        else if (manoC[1].s != 'n')
	        n = 1; 
	        else n = 2;
		    
		}
		
		else {
	    if (manoC[0].p == 0 && manoC[0].s != br.s) //void
		n = 0;
		else if (manoC[1].p == 0 && manoC[1].s != br.s)
		n = 1;
		else if (manoC[2].p == 0 && manoC[2].s != br.s)
		n = 2;
		else if (manoC[0].p == 2 && manoC[0].s != br.s) 
		n = 0;
		else if (manoC[1].p == 2 && manoC[1].s != br.s)
		n = 1;
		else if (manoC[2].p == 2 && manoC[2].s != br.s)
		n = 2;
		else if (manoC[0].s != 'n')
	    n = 0;
	    else if (manoC[1].s != 'n')
	    n = 1; 
	    else n = 2;
		}
		 
	}
	 
	
	
	else if (manoU[N-1].p == 10 || manoU[N-1].p == 11) // se ha un 10 o un tre cerca di tirare la briscola o vai liscio
	{                                              //si sa già che non possono essere di briscola perché sarebbero rientrati nel caso precedente
		if (manoC[0].p > manoU[N-1].p && manoC[0].s == manoU[N-1].s)
		n = 0;
		else if (manoC[1].p > manoU[N-1].p && manoC[1].s == manoU[N-1].s)
		n = 1;
		else if (manoC[2].p > manoU[N-1].p && manoC[2].s == manoU[N-1].s)
		n = 2;  
		else if (manoC[0].s == br.s)
		n = 0;
		else if (manoC[1].s == br.s)
		n = 1;
		else if (manoC[2].s == br.s)
		n = 2;
		else if (manoC[0].p == 0 && manoC[0].s != br.s) //se ho una carta liscia che non sia briscola
		n = 0;
		else if (manoC[1].p == 0 && manoC[1].s != br.s)
		n = 1;
		else if (manoC[2].p == 0 && manoC[2].s != br.s)
		n = 2;
		else if (manoC[0].s != 'n')
	    n = 0;
	    else if (manoC[1].s != 'n')
	    n = 1; 
	    else n = 2;
	}
	
	else if (manoU[N-1].p == 2) //se tira una donna
	{
		asso (); //cerca di prendela prima con asso, tre, re o cavallo ed eventualmente entra nelle void lorenzo per tirare la carta di minor valore;
	    tre ();
	    re ();
	    cavallo ();
		lorenzo ();
	}
	
	else if (manoU[N-1].p == 3) //se tira un cavallo
	{
		asso ();
	    tre ();
	    re ();
	    lorenzo ();
	}
	
	else if (manoU[N-1].p == 4) //se tira un re
	{
		asso ();
	    tre ();
	    lorenzo ();
	}
	 
	else 
	{
	    asso ();
	    tre ();
	    re ();
	    cavallo ();
	    donna ();
	    
		if (manoC[0].p == 0 && manoC[0].s != br.s) //senò cerca una carta che non sia briscola liscia
		n = 0;
		else if (manoC[1].p == 0 && manoC[1].s != br.s)
		n = 1;
		else if (manoC[2].p == 0 && manoC[2].s != br.s)
		n = 2;
	    else if (manoC[0].s != 'n' && manoC[0].s != br.s && manoC[0].p < 10) //punteggio più basso che non si briscola
	    n = 0;
	    else if (manoC[1].s != 'n' && manoC[1].s != br.s && manoC[1].p < 10)
	    n = 1; 
	    else if (manoC[2].s != 'n' && manoC[2].s != br.s && manoC[2].p < 10)
		n = 2;
		else if (manoC[0].s != 'n')
	    n = 0;
	    else if (manoC[1].s != 'n')
	    n = 1; 
	    else n = 2;
	 }
	
}
Le funzioni asso, tre, cavallo, donna e re, sono scritte tutte in questa forma

void asso ()
{
	         if (manoC[0].v == 1 && manoC[0].s == manoU[N-1].s) //vedi poi se puoi farlo con un dieci
	 	n = 0;
	    else if (manoC[1].v == 1 && manoC[1].s == manoU[N-1].s)
	    n = 1;
	    else if (manoC[2].v == 1 && manoC[2].s == manoU[N-1].s)
	    n = 2;
}
e servono a far sì che, se il computer può prendere, lo faccia con la carta più alta possibile diversa da briscola. Sono scritte nello stesso modo di tutto il resto del codice solo che non funzionano. Non riconosce le condizioni.

Es. Se U: 8spade - 2mazze - 3mazze ___ Br. 8danari ___ C: 9coppe - 4coppe - 1spade

SE le mani sono queste, se U (umano, da input) tira 8s, C dovrebbe rispondere 1s, perché ho detto che se hai seme uguale e valore == 1, devi tirare quella carta. Ma surclassa completamente sia la void asso e sia le successive, per entrare nella void lorenzo e tirare di solito una carta liscia o comunque facendo quello che questa prevede.

C'è una spiegazione ragionevole a questo? Io non riesco a trovarla. Spero di essere stata chiara e che il codice sia comprensibile (e che questa sia ora la sezione giusta). Grazie in anticipo.

6 Risposte

  • Re: Problema con funzione in C++

    
    #include <iostream>
    #include <time.h>
    #include <stdlib.h>
    using namespace std;
    
    int puntiU = 0; 
    int puntiC = 0;
    int tiraU = 0;
    int tiraC = 0;
    
    int prendeU = 0;
    int prendeC = 0;
    
    struct carta //ok
    {
    	char s;
    	int v;
    	int p;
    } br;
    
    carta mazzo[40]; 
    carta manoU[3];
    carta manoC[3];
    
    int punteggio_carte (int v) //ok
    {
    	int p;
    	if (v==1)
    	p =11;
    	else if (v==3)
    	p=10;
    	else if (v==8)
    	p=2;
    	else if (v==9)
    	p=3;
    	else if (v==10)
    	p=4;
    	else p=0;
    	return p;
    }
    
    void crea_mazzo () //ok
    {
    	 int i;
    	 for (i=0; i<10; i++)
    	 {
    	 	mazzo[i].s = 'd';
    	 	mazzo[i].v = i+1;
    	 	mazzo[i].p = punteggio_carte(mazzo[i].v);
    	 }
    	 for (i=10; i<20; i++)
    	 {
    	 	mazzo[i].s = 'c';
    	 	mazzo[i].v = i-9;
    	 	mazzo[i].p = punteggio_carte(mazzo[i].v);
    	 }
    	 for (i=20; i<30; i++)
    	 {
    	 	mazzo[i].s = 'm';
    	 	mazzo[i].v = i-19;
    	 	mazzo[i].p = punteggio_carte(mazzo[i].v);
    	 }
    	 for (i=30; i<40; i++)
    	 {
    	 	mazzo[i].s = 's';
    	 	mazzo[i].v = i-29;
    	 	mazzo[i].p = punteggio_carte(mazzo[i].v);
    	 }	 
    }
    
    void bubble_sort () //ordina le carte in base al punteggio nell array delle carte del pc
    {
    	int ausV, ausP;
    	char ausS;
    	for (int t=0; t<3; t++)
    	{
    		for (int s=2; s>t; s--)
    		{
    			if (manoC[s-1].p > manoC[s].p)
    			{
    				ausP = manoC[s-1].p;
    				ausS = manoC[s-1].s;
    				ausV = manoC[s-1].v;
    				manoC[s-1].p = manoC[s].p;
    				manoC[s-1].s = manoC[s].s;
    				manoC[s-1].v = manoC[s].v;
    				manoC[s].p = ausP;
    				manoC[s].s = ausS;
    				manoC[s].v = ausV;
    			}
    		}
    	}
    }
    
    void stampa_mazzo () //ok
    {
    	for (int i=0; i<40; i++)
    	{
    		cout << mazzo[i].v << mazzo[i].s << "\tpunteggio = " << mazzo[i].p << "\n";
    	}
    }
    
    void mescola_mazzo () //ok
    {
    	int pos1, pos2, volte;
    	int ausV, ausP;
    	char ausS;
    	srand(time(NULL));
    	int i;
    	
    	cout << "Quante volte devo mischiare? ";
    	cin >> volte;
    	
    	for (i=0; i<volte; i++)
    	{
    	   pos1 = rand()%40;
    	   pos2 = rand()%40;
    	
    	   ausV = mazzo[pos1].v;
    	   ausP = mazzo[pos1].p;
    	   ausS = mazzo[pos1].s;
    	
    	   mazzo[pos1].v = mazzo[pos2].v;
    	   mazzo[pos1].p = mazzo[pos2].p;
    	   mazzo[pos1].s = mazzo[pos2].s;
    	
    	   mazzo[pos2].v = ausV;
    	   mazzo[pos2].p = ausP;
    	   mazzo[pos2].s = ausS;
    	}  
    	
    	stampa_mazzo();
    }
    
    void chi_deve_dare_le_carte_per_primo () //ok
    {
    	int c1, c2; //c1 indica l'umano, c2 il computer;
    	int v1, v2;
    	char s1, s2;
    	//cout << "Tirerà per primo colui a cui sarà assegnata la carta con valore maggiore\n";
    	
    	
    	c1 = rand()%40; //estrazione di due carte casuali dal mazzo;
        c2 = rand()%40;
    
    	while (c1==c2) //ripetere se i numeri random sono uguali se i numeri sono uguali!
    	{
    	   c1 = rand()%40; 
    	   c2 = rand()%40;
    	} 
    	
    	v1 = mazzo[c1].v; 
    	s1 = mazzo[c1].s;
    	
    	v2 = mazzo[c2].v;
    	s2 = mazzo[c2].s;
    	
    	do //da rifare tutto se i valori delle carte estratte sono uguali;
    	{
    	   c1 = rand()%40; //estrazione di due carte casuali dal mazzo
           c2 = rand()%40;
        
    	do //ripetere la cosa se i numeri sono uguali!
    	{
    	   c1 = rand()%40; 
    	   c2 = rand()%40;
    	} while (c1==c2);
    	
    	v1 = mazzo[c1].v; 
    	s1 = mazzo[c1].s;
    	
    	v2 = mazzo[c2].v;
    	s2 = mazzo[c2].s;
    		
    	} while (v1 == v2);
    	
    	cout <<"La carta dell'umano è un " << v1 << s1 << "\n";  
    	cout <<"La carta del computer è un " << v2 << s2 << "\n";
    	
    	if (v1 > v2) 
    	{
    		tiraC = 1; //perché il primo a tirare una carta sarà il computer! 
    		cout<<"L'umano dà le carte\n\n";
    		//stampa_situazione ();
    	}
    	
    	else if (v2 > v1)
    	{
    		tiraU = 1; //perché il primo a tirare una carta sarà l'umano!
    		cout<<"Il computer dà le carte\n\n";
    		//stampa_situazione ();
    	}
    	
    }
    
    void stampa_situazione () //ok
    {
    	cout << "U: "<< manoU[0].v << manoU[0].s << "-" << manoU[1].v << manoU[1].s << "-" << manoU[2].v << manoU[2].s << " __ Br: " << br.v << br.s << " __ C: " << manoC[0].v << manoC[0].s << "-" << manoC[1].v << manoC[1].s << "-" << manoC[2].v << manoC[2].s << "\n\n";
    }
    
    int n, N; //posso farlo con la stessa variabile? 
    
    int j = 1;
    void pesca_carta () //ok
    {
      	if (prendeC == 1) //ha preso il computer e deve tirare il computer, e quindi prende anche prima la carta!
    	{
    		manoC[n].v = mazzo[6+(j-1)].v; //la settima carta, in sesta posizione nell'array.
    		manoC[n].s = mazzo[6+(j-1)].s; 
    		manoC[n].p = mazzo[6+(j-1)].p;
    		
    		manoU[N-1].v = mazzo[6+j].v; 
    		manoU[N-1].s = mazzo[6+j].s; 
    		manoU[N-1].p = mazzo[6+j].p; 
    
    	}
    	
    	else if (prendeU == 1) //idem 
    	{
    	    manoU[N-1].v = mazzo[6+(j-1)].v; 
    		manoU[N-1].s = mazzo[6+(j-1)].s; 
    		manoU[N-1].p = mazzo[6+(j-1)].p;
    		
    		manoC[n].v = mazzo[6+j].v; 
    		manoC[n].s = mazzo[6+j].s; 
    		manoC[n].p = mazzo[6+j].p;
    	
    	}
    	
        bubble_sort();
    	cout<<"\n\n";
    	stampa_situazione ();
    	
    	
    } 
    
    void presa_briscola () //ok
    {
    	if (manoU[N-1].s == manoC[n].s)
    	{
    		if (manoU[N-1].p > manoC[n].p)
    		{cout << "Prende l'umano\n";
    		 prendeU = 1;
    		 prendeC = 0;} //chi tirerà per primo!
    		 
    		else if (manoU[N-1].p < manoC[n].p)
    		{
    		cout << "Prende il computer\n";
    		prendeC = 1;
    		prendeU = 0;}
    		
    		else if (manoU[N-1].p == manoC[n].p)
    		{
    			if (manoU[N-1].v > manoC[n].v)
    			{
    				cout << "Prende l'umano\n";
    		        prendeU = 1;
    		        prendeC = 0;
    			}
    			else { //mai potranno essere uguali perchè non esistono due carte con uguale punteggio e uguale valore
    			       //dello stesso seme;
    				cout << "Prende il computer\n";
    		        prendeC = 1;
    		        prendeU = 0;
    			}
    			
    		}
    	}
    	
    	else //se i semi sono diversi
    	{
    		if (manoU[N-1].s == br.s) //se l'umano ha la briscola;
    		{
    			cout << "Prende l'umano\n";
    			prendeU = 1;
    			prendeC = 0;
    		}
    		else if (manoC[n].s == br.s) //se il computer ha la briscola
    		{
    				cout << "Prende il computer\n";
    				prendeC = 1;
    		        prendeU = 0;
    				
    		}
    		else //se nessuno dei due ha la briscola
    		{
    			if (tiraU == 1 || prendeU == 1) //primo giocatore umano 
    			{
    				if (manoU[N-1].s != manoC[n].s  &&  manoC[n].s != br.s) //se i semi sono diversi e il secondo giocatore (cioè il computer) non ha la briscola
    				{
    					cout << "Prende l'umano\n";
    					prendeU = 1; 
    					prendeC = 0;
    				}
    				else 
    				{
    					cout <<"Prende il computer\n";
    					prendeC = 1;
    				    prendeU = 0;
    				}
    			}	
    			else if (tiraC == 1 || prendeC == 1) //primo giocatore computer
    			{
    			    if (manoC[n].s != manoU[N-1].s  &&  manoU[N-1].s != br.s) //idem
    			    {
    				    cout << "Prende il computer\n";
    				    prendeC = 1;
    					prendeU = 0; 
    			    }
    			    else 
    			    {
    			    	cout <<"Prende l'umano\n";
    			    	prendeU = 1; 
    					prendeC = 0;
    			    }
    			}
    			
    		}
    		         
    	}
    }
    
    int punt = 0;
    void punteggio () 
    {
    	if (prendeC == 1) //se ha preso il computer nella funzione "presa_briscola";
    	{
    		puntiC = puntiC + manoU[N-1].p + manoC[n].p;
    		puntiU = puntiU;	
    	}
    	else if (prendeU == 1) //se ha preso l'umano nella funzione "presa_briscola";
    	{
    		puntiU = puntiU + manoU[N-1].p + manoC[n].p;
    		puntiC = puntiC;
    	}
    	punt = puntiU + puntiC;
    	
    }
    
    void asso ()
    {
    	         if (manoC[0].v == 1 && manoC[0].s == manoU[N-1].s) //vedi poi se puoi farlo con un dieci
    	 	n = 0;
    	    else if (manoC[1].v == 1 && manoC[1].s == manoU[N-1].s)
    	    n = 1;
    	    else if (manoC[2].v == 1 && manoC[2].s == manoU[N-1].s)
    	    n = 2;
    	    else cout << "no";
    }
    void tre ()
    {
    	        if (manoC[0].v == 3 && manoC[0].s == manoU[N-1].s) //vedi poi se puoi farlo con un dieci
    	 	n = 0;
    	    else if (manoC[1].v == 3 && manoC[1].s == manoU[N-1].s)
    	    n = 1;
    	    else if (manoC[2].v == 3 && manoC[2].s == manoU[N-1].s)
    	    n = 2;
    	    else cout << "no";
    }
    void re ()
    {
                 if (manoC[0].v == 10 && manoC[0].s == manoU[N-1].s) //vedi poi se puoi farlo con un dieci
    	 	n = 0;
    	    else if (manoC[1].v == 10 && manoC[1].s == manoU[N-1].s)
    	    n = 1;
    	    else if (manoC[2].v == 10 && manoC[2].s == manoU[N-1].s)
    	    n = 2;
    	    else cout << "no";
    }
    void cavallo ()
    {
    	         if (manoC[0].v == 9 && manoC[0].s == manoU[N-1].s) //vedi poi se puoi farlo con un dieci
    	 	n = 0;
    	    else if (manoC[1].v == 9 && manoC[1].s == manoU[N-1].s)
    	    n = 1;
    	    else if (manoC[2].v == 9 && manoC[2].s == manoU[N-1].s)
    	    n = 2;
    	    else cout << "no";
    }
    void donna ()
    {
    	         if (manoC[0].v == 8 && manoC[0].s == manoU[N-1].s) //vedi poi se puoi farlo con un dieci
    	 	n = 0;
    	    else if (manoC[1].v == 8 && manoC[1].s == manoU[N-1].s)
    	    n = 1;
    	    else if (manoC[2].v == 8 && manoC[2].s == manoU[N-1].s)
    	    n = 2;
    	    else cout << "no";
    }
    
    void prugna () //funzione da applicare quando è il computer a tirare per primo
    {
    	if (manoC[0].p == 0 && manoC[0].s != br.s) //prima cerca una carta con liscia che non sia briscola
    	n = 0;
    	else if (manoC[1].p == 0 && manoC[1].s != br.s)
    	n = 1;
    	else if (manoC[2].p == 0 && manoC[2].s != br.s)
    	n = 2; 
    	else if (manoC[0].s != 'n' && manoC[0].s != br.s &&  manoC[0].p < 10) //poi una carta che non sia briscola
    	                                                                      //e che abbia un punteggio minore di 10
    	                                                                      //il diverso da n si riferisce alle ulrime
    	                                                                      //mano, per evitare che alla fine tiri una
    	                                                                      //carta nulla; infatti nella void no pesca
    	                                                                      //
    	n = 0;
        else if (manoC[1].s != 'n' && manoC[1].s != br.s &&  manoC[1].p < 10)
        n = 1; 
        else if (manoC[2].s != 'n' && manoC[2].s != br.s &&  manoC[2].s < 10)
        n = 2;
        else if (manoC[0].s != 'n')
    	n = 0;
        else if (manoC[1].s != 'n')
        n = 1; 
        else n = 2;
    	 //perchè se le prime due sono -7 per forza la terza devi tirare! E se tutte e tre sono così la 
    	            //partita dovrebbe essere già finita;
    
    			if (manoC[0].v == 2 || (manoC[0].v > 3 && manoC[0].v < 6))
    			n = 0;
    			else if (manoC[1].v == 2 || (manoC[1].v > 3 && manoC[1].v < 6))
    			n = 1;
    			else if (manoC[2].v == 2 || (manoC[2].v > 3 && manoC[0].v < 6))
    			n = 2;
    		}
    
    void lorenzo ()
    {
    		if (manoC[0].s == br.s)
    		{
    			     if (manoC[0].v == 2 || (manoC[0].v > 3 && manoC[0].v < 6))
    			n = 0;
    			else if (manoC[1].v == 2 || (manoC[1].v > 3 && manoC[1].v < 6))
    			n = 1;
    			else if (manoC[2].v == 2 || (manoC[2].v > 3 && manoC[0].v < 6))
    			n = 2;
    		}
    		
    	    else if (manoC[0].p == 0 && manoC[0].s != br.s) 
    		n = 0;
    		else if (manoC[1].p == 0 && manoC[1].s != br.s)
    		n = 1;
    		else if (manoC[2].p == 0 && manoC[2].s != br.s)
    		n = 2;
    		else if (manoC[0].p == 2 && manoC[0].s != br.s) 
    		n = 0;
    		else if (manoC[1].p == 2 && manoC[1].s != br.s)
    		n = 1;
    		else if (manoC[2].p == 2 && manoC[2].s != br.s)
    		n = 2;
    		else if (manoC[0].s != 'n')
    	    n = 0;
    	    else if (manoC[1].s != 'n')
    	    n = 1; 
    	    else n = 2;
    }
    
    void strategia ()
    {
    	if (manoU[N-1].s == br.s) //se butta una briscola vai liscio, ma cerca di non farla essere una briscola
    	{
    		if (manoU[N-1].p == 0)
    		{
    			if (manoC[0].p == 0 && manoC[0].s != br.s)
    			n = 0;
    			else if (manoC[1].p == 0 && manoC[0].s != br.s)
    			n = 1;
    			else if (manoC[2].p == 0 && manoC[0].s != br.s)
    			n = 2;
    			else if (manoC[0].p == 2 && manoC[0].s != br.s)
    			n = 0;
    			else if (manoC[1].p == 2 && manoC[1].s != br.s)
    			n = 1;
    			else if (manoC[2].p == 2 && manoC[2].s != br.s)
    			n = 2;
    			else if (manoC[0].s != 'n')
    	        n = 0;
    	        else if (manoC[1].s != 'n')
    	        n = 1; 
    	        else n = 2;
    			
    		}
    		 
    		else if (manoU[N-1].p == 10)
    		{
    		    if (manoU[N-1].s == manoC[0].s && manoC[0].p == 11) //se liscio e puoi prende, vedi prima se puoi farlo con un asso!
    	 	    n = 0;
    	        else if (manoU[N-1].s == manoC[1].s && manoC[1].p == 11)
    	        n = 1;
    	        else if (manoU[N-1].s == manoC[2].s && manoC[2].p == 11)
    	        n = 2;
    		         
    			else if (manoC[0].p == 0 && manoC[0].s != br.s)
    			n = 0;
    			else if (manoC[1].p == 0 && manoC[0].s != br.s)
    			n = 1;
    			else if (manoC[2].p == 0 && manoC[0].s != br.s)
    			n = 2;
    			else if (manoC[0].p == 2 && manoC[0].s != br.s)
    			n = 0;
    			else if (manoC[1].p == 2 && manoC[1].s != br.s)
    			n = 1;
    			else if (manoC[2].p == 2 && manoC[2].s != br.s)
    			n = 2;
    			else if (manoC[0].s != 'n')
    	        n = 0;
    	        else if (manoC[1].s != 'n')
    	        n = 1; 
    	        else n = 2;
    		    
    		}
    		
    		else {
    	    if (manoC[0].p == 0 && manoC[0].s != br.s) //void
    		n = 0;
    		else if (manoC[1].p == 0 && manoC[1].s != br.s)
    		n = 1;
    		else if (manoC[2].p == 0 && manoC[2].s != br.s)
    		n = 2;
    		else if (manoC[0].p == 2 && manoC[0].s != br.s) 
    		n = 0;
    		else if (manoC[1].p == 2 && manoC[1].s != br.s)
    		n = 1;
    		else if (manoC[2].p == 2 && manoC[2].s != br.s)
    		n = 2;
    		else if (manoC[0].s != 'n')
    	    n = 0;
    	    else if (manoC[1].s != 'n')
    	    n = 1; 
    	    else n = 2;
    		}
    		 
    	}
    	 
    	 //se c'è una carta con punti e io ho punti con cui posso prenderla, la devo prendere;
    	
    	
    	else if (manoU[N-1].p == 10 || manoU[N-1].p == 11) // se ha un 10 o un tre cerca di tirare la briscola o vai liscio
    	{                                              //si sa giò che non possono essere di briscola perché sarebbero rientrati nel caso preceden
    		if (manoC[0].p > manoU[N-1].p && manoC[0].s == manoU[N-1].s)
    		n = 0;
    		else if (manoC[1].p > manoU[N-1].p && manoC[1].s == manoU[N-1].s)
    		n = 1;
    		else if (manoC[2].p > manoU[N-1].p && manoC[2].s == manoU[N-1].s)
    		n = 2;  
    		else if (manoC[0].s == br.s)
    		n = 0;
    		else if (manoC[1].s == br.s)
    		n = 1;
    		else if (manoC[2].s == br.s)
    		n = 2;
    		else if (manoC[0].p == 0 && manoC[0].s != br.s) //se ho una carta liscia che non sia briscola
    		n = 0;
    		else if (manoC[1].p == 0 && manoC[1].s != br.s)
    		n = 1;
    		else if (manoC[2].p == 0 && manoC[2].s != br.s)
    		n = 2;
    		else if (manoC[0].s != 'n')
    	    n = 0;
    	    else if (manoC[1].s != 'n')
    	    n = 1; 
    	    else n = 2;
    	}
    	
    	else if (manoU[N-1].p == 2) //se tira una donna
    	{
    		asso ();
    	    tre ();
    	    re ();
    	    cavallo ();
    		lorenzo ();
    	}
    	
    	else if (manoU[N-1].p == 3) //se tira un cavallo
    	{
    		asso ();
    	    tre ();
    	    re ();
    	    lorenzo ();
    	}
    	
    	else if (manoU[N-1].p == 4) //se tira un re
    	{
    		asso ();
    	    tre ();
    	    lorenzo ();
    	}
    	 
    	else 
    	{
    	    asso ();
    	    tre ();
    	    re ();
    	    cavallo ();
    	    donna ();
    	    
    		if (manoC[0].p == 0 && manoC[0].s != br.s) //senò cerca una carta che non sia briscola liscia
    		n = 0;
    		else if (manoC[1].p == 0 && manoC[1].s != br.s)
    		n = 1;
    		else if (manoC[2].p == 0 && manoC[2].s != br.s)
    		n = 2;
    	    else if (manoC[0].s != 'n' && manoC[0].s != br.s && manoC[0].p < 10) //punteggio più basso che non si briscola
    	    n = 0;
    	    else if (manoC[1].s != 'n' && manoC[1].s != br.s && manoC[1].p < 10)
    	    n = 1; 
    	    else if (manoC[2].s != 'n' && manoC[2].s != br.s && manoC[2].p < 10)
    		n = 2;
    		else if (manoC[0].s != 'n')
    	    n = 0;
    	    else if (manoC[1].s != 'n')
    	    n = 1; 
    	    else n = 2;
    	 }
    	
    }
    
    void tira1umano ()
    {
    	cout << "Il primo a dover scegliere una carta da tirare è ora l'umano\n\n"; //perché le carte sono state date dal computer;
    	cout << "Quale carta scegli di tirare? La 1, la 2 o la 3? ";
    	/*la 1 corrisponde a manoU[0], la 2 a manoU[1] e la 3 a manoU[2];*/
    	cin >> N;
    	 while (((N != 1) && (N != 2) && (N != 3)) || (manoU[N-1].s == 'h'))
    	{
    		cout << "Mossa non valida, rinserire valore: ";
    		cin >> N;
    	}
    	cout <<"\n";
    	cout << "Hai tirato: " << manoU[N-1].v << manoU[N-1].s << "\n"; 
     	strategia ();
    	cout << "PC risponde: " << manoC[n].v << manoC[n].s << "\n\n";
    	presa_briscola ();
    }
    
    void tira1computer ()
    {
    	cout << "Il primo a dover scegliere una carta da tirare è ora il computer\n\n"; //perché le carte sono state date dall'umano;
        prugna ();
    	//se il computer tira per primo, la carta che tirerà sempre per prima sarà la carta con punteggio minore;
    	cout << "PC tira: " << manoC[n].v << manoC[n].s << "\n";
    	cout << "Umano, con cosa rispondi? La 1, la 2 o la 3? "; 
    	cin >> N;
        while (((N != 1) && (N != 2) && (N != 3)) || (manoU[N-1].s == 'h'))
    	{
    		cout << "Mossa non valida, rinserire valore: ";
    		cin >> N;
    	}
    	cout <<"\n";
    	cout << "Hai tirato: " << manoU[N-1].v << manoU[N-1].s << "\n\n"; 
    	presa_briscola ();
    }
    
    void dai_le_prime_tre_carte () //ok
    {
    	int i;
    	void chi_deve_dare_le_carte_per_primo (); //si danno tre carte tutte insieme. Le da colui che estrae la carta maggiore. E le da per primo all'altro. 
    	if (tiraU == 1) //il computer dà le carte prima all'umano e quindi il primo a tirare la carta successiva sarà l'UMANO;
    	{
    		for (i=0; i<3; i++)
    		{
    			manoU[i] = mazzo[i];
    		    manoC[i] = mazzo[i+3];
    		}
    	}
    	
    	
    	else if (tiraC == 1) //quindi l'umano dà le carte prima al computer e quindi il primo a tirare la carta successiva sarà il COMPUTER;
    	{
    		for (i=0; i<3; i++)
    		{
    			manoC[i] = mazzo[i];
    		    manoU[i] = mazzo[i+3];
    		}
    	}
    	
    	bubble_sort ();
    	
    	
    	br.v = mazzo[39].v;
    	br.p = mazzo[39].p;
    	br.s = mazzo[39].s; //l'ultima carta a essere presa! Esiste un modo per far sì che sia la sesta?? Mi sembra una forzatura del gioco!
    	stampa_situazione ();
    }
    
    void no_pesca () //quando si tira una carta e ne rimangono due in mano! Quindi il valore della terza carta deve essere annullato per applicaer la void pippo();
    {
    	manoC[n].v = 0;
    	manoC[n].s = 'n';
    	manoC[n].p = -7;
    	
        manoU[N-1].v = 0;
        manoU[N-1].s = 'h';
        manoU[N-1].p = 0;
        
        bubble_sort();
    	cout<<"\n\n";
    	stampa_situazione ();
    }
    
    int raggioU = 0;
    int raggioC = 0;
    
    void partita () 
    {   
        cout << "\n\n";     
        cout << "Ecco il mazzo";  
    	crea_mazzo ();
    	//stampa_mazzo ();
    	cout<<"\n";
    	mescola_mazzo();
    	cout<<"\n";
    	chi_deve_dare_le_carte_per_primo ();
    	dai_le_prime_tre_carte (); 
    	cout <<"\n";
    	
    	//Da vedere chi tira per primo. Tira per primo chi non ha dato le carte; 
    	//tiraU, tiraC, prende carta, prende carta. non scalare l'array del mazzo, ma bensì impostare che prenda da un certo indice diminuito (?). 
    	//Sistemare le carte prese negli array dei punti. Fare tutto finché la somma dei punti dei due punteggi non è 120.
    
        
    		while (j<=33) 
    		{
    		   if (tiraU == 1 || prendeU == 1) 
    	       {
    	       	   tira1umano ();
    			   tiraU = 0;
    	       }
    	       else if (tiraC == 1 || prendeC == 1)
    	       {
    	       	  tira1computer ();
    			  tiraC = 0;
    	       }
    	       cout <<"\n";
    	       punteggio ();
    	       pesca_carta ();
    	       j = j + 2;
    	       
    		   if (j == 33)
    		   {
    		   	cout <<"\n\n";
    	        cout << "La prossima è l'ultma pescata!\n\n";
    		   }
    		}
    	    
    	    while (punt < 120)
    	    {
    	    	 if (prendeU == 1) //non si considera più la variabile tira perchè ormai è già annullata
    	       {
    		       tira1umano ();
    	       }
    	       else if (prendeC == 1)
    	       {
    		      tira1computer ();
    	       }
    	       cout <<"\n";
    	       punteggio ();
    	       no_pesca ();
    	    }
    	    
    	cout << "Fine\n\n"; 
    	if (puntiU > puntiC)
    	{
    		cout << "Ha vinto l'umano\n\n";
    		raggioU++;
    	}
    	
    	else if (puntiU == puntiC)
    	cout << "Avete pareggiato\n\n";
    	else {
    		cout<< "Ha vinto il computer\n\n";
    		raggioC++;
    	}
    	
    	cout << "Il punteggio dell'umano: " << puntiU << endl;
    	cout << "Il punteggio del computer: " << puntiC << endl;
    } 
    
    int main ()
    {
    	while ((raggioU != 2) && (raggioC != 2))
    	{
    		partita();
    		
    		if (raggioU != 2 && raggioC != 2)
    		{
    			cout <<"Nessuno ha ancora vinto, si deve fare un'altro raggio!\n";
    			puntiC = 0;
    			puntiU = 0;
    			punt = 0;
    			j = 1;
    			tiraC = 0;
    			tiraU = 0;
    			prendeU = 0;
                prendeC = 0;
    		}
    	}
    	
    	cout <<"Fine\n\n";
    	if (raggioU == 2)
    	cout <<"Complimenti umano, mi hai battuto!";
    	else if (raggioC == 2)
    	cout <<"Sapevo che non ce l'avresti mai fatta, byeee umano!";
    	
    	system("PAUSE");
    	return 0;
    	
    }
    
  • Re: Problema con funzione in C++

    Non avendo esaminato e compreso tutto il codice, posso darti solo risposte generiche, ma:

    Gwen ha scritto:


    SE le mani sono queste, se U (umano, da input) tira 8s, C dovrebbe rispondere 1s, perché ho detto che se hai seme uguale e valore == 1, devi tirare quella carta. Ma surclassa completamente sia la void asso e sia le successive, per entrare nella void lorenzo e tirare di solito una carta liscia o comunque facendo quello che questa prevede.
    piazzando dei controlli come
    cout << "\n [DEBUG] void asso() init \n";
    puoi notare che esegue queste funzioni.
    Però poi eseguirà sempre lorenzo(), dato che il programma nn sa il risultato di asso(),re(),ecc...
    asso ();
    tre ();
    re ();
    lorenzo ();
    se vuoi eseguire lorenzo solo quando asso(),tre(),ecc... non restituiscono niente( non cambiano il valore di n), allora dichiarale "bool" e imposta una condizione tipo questa
    if(asso()==false && tre()==false && re()==false && cavallo==false)
       lorenzo();
    ovviamente le funzioni restituiranno "true" se modificano n e "false" se nn fanno niente
    bool asso()
    {
    
        ...codice...
    
        else {
            cout << "no";
            return false;
        }
        return true;


    Inoltre ti consiglio di scrivere tutti i prototipi delle funzioni all'inizio del file( o in un header) e di scrivere istruzioni che stampano un messaggio all'avvio e al termine di ogni funzione (così identifichi subito il problema).
  • Re: Problema con funzione in C++

    Grazie mille, ci provo subito!
  • Re: Problema con funzione in C++

    A quanto pare funziona, non so davvero come ringraziarti
    Ps. Perché prima non andava???
  • Re: Problema con funzione in C++

    Prima funzionava come adesso, solo che non avendo avuto un controllo eseguiva ogni volta lorenzo () sovrascrivendo il risultato di asso (), ecc....

    Pensaci... come faceva a sapere quando doveva eseguire lorenzo () e quando no?
  • Re: Problema con funzione in C++

    Io non capisco questa funzione:

    void prugna () //funzione da applicare quando è il computer a tirare per primo
    {
    if (manoC[0].p == 0 && manoC[0].s != br.s) //prima cerca una carta con liscia che non sia briscola
    n = 0;
    else if (manoC[1].p == 0 && manoC[1].s != br.s)
    n = 1;
    else if (manoC[2].p == 0 && manoC[2].s != br.s)
    n = 2;
    else if (manoC[0].s != 'n' && manoC[0].s != br.s && manoC[0].p < 10)
    n = 0;
    else if (manoC[1].s != 'n' && manoC[1].s != br.s && manoC[1].p < 10)
    n = 1;
    else if (manoC[2].s != 'n' && manoC[2].s != br.s && manoC[2].s < 10)
    n = 2;
    else if (manoC[0].s != 'n')
    n = 0;
    else if (manoC[1].s != 'n')
    n = 1;
    else n = 2;
    //perchè se le prime due sono -7 per forza la terza devi tirare! E se tutte e tre sono così la
    //partita dovrebbe essere già finita;

    if (manoC[0].v == 2 || (manoC[0].v > 3 && manoC[0].v < 6))
    n = 0;
    else if (manoC[1].v == 2 || (manoC[1].v > 3 && manoC[1].v < 6))
    n = 1;
    else if (manoC[2].v == 2 || (manoC[2].v > 3 && manoC[0].v < 6))
    n = 2;

    l'istruzione " !='n' " a cosa serve?
Devi accedere o registrarti per scrivere nel forum
6 risposte