Tris

di il
5 risposte

Tris

Ciao, sono uno studente al primo anno di programmazione in C++ (terza superiore)

Sto facendo il programma del tris ma non mi riesce una cosa: vorrei che quando il programma riceve in input 'b' da tastiera, ripeta tutte le cose all'interno del case 1, quindi che inizi di nuovo la partita in modalità facile

Per fare ciò ho fatto un ciclo do while che parte dall'inizio del case 1 fino alla fine di quest'ultimo, ma non funziona come dovrebbe, ecco il codice:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>
#include <windows.h>
using namespace std;
int difficolta;
char vincitore;
char x[9];
void tris();
bool combinazione();
bool full();
bool terna(int, int, int);
void legenda();

int main(){
	system("color f0");
	int posizione,pc;
	char indietro;
	
	cout<<"---------- TRIS ----------"<<endl<<endl;
	cout<<"- Inserisci '1' per giocare in modalita' facile"<<endl;
	cout<<"- Inserisci '2' per giocare in modalita' media"<<endl;
	cout<<"- Inserisci '3' per giocare in modalita' difficile"<<endl<<endl;
	cin>>difficolta;
	for(int i=0;i<9;i++) x[i]=' ';
	
	switch(difficolta){
		
		case 1:{
			do{
			system("cls");
			srand(time(0)); 
			while(combinazione()==false and full()==false){
				legenda();
				tris();
				cout<<"\n\nInserisci posizione da 1 a 9\n	";
				cin>>posizione;
				
				while(posizione<1 or posizione >9 or x[posizione-1]!=' '){
					cout<<"Casella occupata\n"<<endl;
					cout<<"Inserisci di nuovo la posizione: ";
					cin>>posizione;
				}
				
				x[posizione-1]='x';
				
				
				if (full()==false and combinazione()==false){
					pc=rand()%9; 
				while(x[pc]!=' '){
					pc=rand()%9;
				}
					x[pc]='o';
				}
				tris();
				
				system("cls");
			}
			
			tris();
			cout<<endl;
			if(vincitore=='x') cout<<"	Hai vinto!\n";
			else if(vincitore=='o') cout<<"	Hai perso!\n";
			if (combinazione()==false) cout<<"	Pareggio!\n";
			cout<<"Se vuoi giocare di nuovo in modalita' facile, premi b.\n";
			cin>>indietro;
			}while(indietro=='b');
			break;
		}
		case 2:{
			
			system("cls");
			cout<<"---------- TRIS ----------"<<endl<<endl;
			cout<<"Lavori in corso\n";
			break;
		}
		case 3:{
			
			system("cls");
			cout<<"---------- TRIS ----------"<<endl<<endl;
			cout<<"Lavori in corso\n";
			break;
			
		}
	}
	
}
void tris(){
	cout<<"        "<<x[0]<<" | "<<x[1]<<" | "<<x[2]<<endl;
	cout<<"        "<<"---------\n";
	cout<<"        "<<x[3]<<" | "<<x[4]<<" | "<<x[5]<<endl;
	cout<<"        "<<"---------\n";
	cout<<"        "<<x[6]<<" | "<<x[7]<<" | "<<x[8]<<endl;
}

bool full(){
	for(int i=0;i<9;i++) if(x[i]==' ') return false;
	return true;
}

bool combinazione(){
	if(terna(0,1,2) or
	terna(3,4,5) or
	terna(6,7,8) or
	
	terna(0,3,6) or
	terna(1,4,7) or
	terna(2,5,8) or
	
	terna(0,4,8) or
	terna(2,4,6)) return true;
	return false;
	
	
	
}

bool terna(int a, int b, int c){
	if(x[a]==x[b] && x[b]==x[c] && x[a]!=' '){
		vincitore=x[a];
		return true;
	}
	return false;
	
	}
	
void legenda(){
	cout<<"\n";
	cout<<"\t\t\t\t\t\t\t\tSegui questo schema per l'inserimento:\n";
	cout<<"\n";
	cout<<"\t\t\t\t\t\t\t\t\t\t1  2  3"<<endl;
	cout<<"\t\t\t\t\t\t\t\t\t\t4  5  6"<<endl;
	cout<<"\t\t\t\t\t\t\t\t\t\t7  8  9"<<endl;
	
}

5 Risposte

  • Re: Tris

    Hai tralasciato il fatto che quando ritorni al gioco con b, il vettore x[] è ancora pieno, è sufficiente spostare l'inizializzazione:
    for(int i=0;i<9;i++) x[i]=' ';
    subito dopo il do
  • Re: Tris

    Rubik ha scritto:


    Hai tralasciato il fatto che quando ritorni al gioco con b, il vettore x[] è ancora pieno, è sufficiente spostare l'inizializzazione:
    for(int i=0;i<9;i++) x[i]=' ';
    subito dopo il do
    grazie!
  • Re: Tris

    Rubik ha scritto:


    Hai tralasciato il fatto che quando ritorni al gioco con b, il vettore x[] è ancora pieno, è sufficiente spostare l'inizializzazione:
    for(int i=0;i<9;i++) x[i]=' ';
    subito dopo il do
    ciao di nuovo, avrei un problema:
    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    #include <windows.h>
    using namespace std;
    int difficolta;
    char vincitore;
    char x[9];
    void tris();
    bool combinazione();
    bool full();
    bool terna(int, int, int);
    void legenda();
    
    int main(){
    	system("color f0");
    	int posizione,pc;
    	char indietro, cambio;
    	
    	cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
    	cout<<"- Inserisci '1' per giocare in modalita' facile"<<endl;
    	cout<<"- Inserisci '2' per giocare in modalita' media (work in progress)"<<endl;
    	cout<<"- Inserisci '3' per giocare in modalita' difficile (work in progress)"<<endl<<endl;
    	cin>>difficolta;
    	for(int i=0;i<9;i++) x[i]=' ';
    	
    	switch(difficolta){
    		
    		case 1:{
    			
    			system("color 20");
    			do{
    				for(int i=0;i<9;i++) x[i]=' ';
    			system("cls");
    			cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
    			srand(time(0));
    			while(combinazione()==false and full()==false){
    				legenda();
    				tris();
    				cout<<"\n\nInserisci posizione da 1 a 9\n	";
    				cin>>posizione;
    				
    				while(posizione<1 or posizione >9 or x[posizione-1]!=' '){
    					cout<<"Casella occupata\n"<<endl;
    					cout<<"Inserisci di nuovo la posizione: ";
    					cin>>posizione;
    				}
    				
    				x[posizione-1]='x';
    				
    				
    				if (full()==false and combinazione()==false){
    					pc=rand()%9; 
    				while(x[pc]!=' '){
    					pc=rand()%9;
    				}
    					x[pc]='o';
    				}
    				
    				tris();
    				
    				system("cls");
    				cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
    			}
    			
    			tris();
    			cout<<endl;
    			if(vincitore=='x') cout<<"	Hai vinto!\n";
    			else if(vincitore=='o') cout<<"	Hai perso!\n";
    			if (combinazione()==false) cout<<"	Pareggio!\n";
    			cout<<"Se vuoi giocare di nuovo in modalita' facile, premi b.\n";
    			cout<<"Premi qualsiasi altra lettera per uscire.\n";
    			cin>>indietro;
    			}while(indietro=='b');
    			break;
    	 }
    		//-----------------------------------------------------------------------------------------------------------------------
    		case 2:{
    			cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
    			system("color 60");
    			system("cls");
    			cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
    			cout<<"Lavori in corso\n";
    			break;
    		}
    		case 3:{
    			cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
    			system("color c0");
    			system("cls");
    			cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
    			cout<<"Lavori in corso\n";
    			break;
    			
    		}
    	}
    	
    }
    void tris(){
    	cout<<"        "<<x[0]<<" | "<<x[1]<<" | "<<x[2]<<endl;
    	cout<<"        "<<"---------\n";
    	cout<<"        "<<x[3]<<" | "<<x[4]<<" | "<<x[5]<<endl;
    	cout<<"        "<<"---------\n";
    	cout<<"        "<<x[6]<<" | "<<x[7]<<" | "<<x[8]<<endl;
    }
    
    bool full(){
    	for(int i=0;i<9;i++) if(x[i]==' ') return false;
    	return true;
    }
    
    bool combinazione(){
    	if(terna(0,1,2) or
    	terna(3,4,5) or
    	terna(6,7,8) or
    	
    	terna(0,3,6) or
    	terna(1,4,7) or
    	terna(2,5,8) or
    	
    	terna(0,4,8) or
    	terna(2,4,6)) return true;
    	return false;
    	
    	
    	
    }
    
    bool terna(int a, int b, int c){
    	if(x[a]==x[b] && x[b]==x[c] && x[a]!=' '){
    		vincitore=x[a];
    		return true;
    	}
    	return false;
    	
    	}
    	
    void legenda(){
    	cout<<"\n";
    	cout<<"\t\t\t\t\t\t\t\tSegui questo schema per l'inserimento:\n";
    	cout<<"\n";
    	cout<<"\t\t\t\t\t\t\t\t\t\t1  2  3"<<endl;
    	cout<<"\t\t\t\t\t\t\t\t\t\t4  5  6"<<endl;
    	cout<<"\t\t\t\t\t\t\t\t\t\t7  8  9"<<endl;
    	
    }
    
    Volevo fare che, una volta completata la partita (nel mio caso del case 1), il programma, dopo aver ricevuto in input una lettera diversa da b, ritorni a chiedere con quale difficoltà si vuole giocare...
    Per farlo avevo fatto un ciclo do while che partiva dalla scelta della difficoltà fino alla fine del case 1, ma la parentesi graffa che lo chiudeva, era come se andasse a "sovrapporsi" con le altre, come posso fare? Non so se mi spiego
  • Re: Tris

    Con il while funziona, ma le parentesi graffe devono essere giuste e non può stare alla fine del case 1, ma alla fine di switch, ti devi fare aiutare dall'ide per il conteggio, quando clicchi una parentesi graffa l'ide ti mostra la corrispondente di chiusura o apertura.
    
    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    #include <windows.h>
    using namespace std;
    int difficolta;
    char vincitore;
    char x[9];
    void tris();
    bool combinazione();
    bool full();
    bool terna(int, int, int);
    void legenda();
    
    int main(){
        while(true){
            system("color f0");
            int posizione,pc;
            char indietro, cambio;
    
            cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
            cout<<"- Inserisci '1' per giocare in modalita' facile"<<endl;
            cout<<"- Inserisci '2' per giocare in modalita' media (work in progress)"<<endl;
            cout<<"- Inserisci '3' per giocare in modalita' difficile (work in progress)"<<endl<<endl;
            cin>>difficolta;
            for(int i=0;i<9;i++) x[i]=' ';
    
            switch(difficolta){
    
                case 1:{
    
                    system("color 20");
                    do{
                    for(int i=0;i<9;i++) x[i]=' ';
                    system("cls");
                    cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
                    srand(time(0));
                    while(combinazione()==false and full()==false){
                        legenda();
                        tris();
                        cout<<"\n\nInserisci posizione da 1 a 9\n	";
                        cin>>posizione;
    
                        while(posizione<1 or posizione >9 or x[posizione-1]!=' '){
                            cout<<"Casella occupata\n"<<endl;
                            cout<<"Inserisci di nuovo la posizione: ";
                            cin>>posizione;
                        }
    
                        x[posizione-1]='x';
    
    
                        if (full()==false and combinazione()==false){
                            pc=rand()%9;
                        while(x[pc]!=' '){
                            pc=rand()%9;
                        }
                            x[pc]='o';
                        }
    
                        tris();
    
                        system("cls");
                        cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
                    }
    
                    tris();
                    cout<<endl;
                    if(vincitore=='x') cout<<"	Hai vinto!\n";
                    else if(vincitore=='o') cout<<"	Hai perso!\n";
                    if (combinazione()==false) cout<<"	Pareggio!\n";
                    cout<<"Se vuoi giocare di nuovo in modalita' facile, premi b.\n";
                    cout<<"Premi qualsiasi altra lettera per riscegliere.\n";
                    cin>>indietro;
                    }while(indietro=='b');
                    break;
             }
                //-----------------------------------------------------------------------------------------------------------------------
                case 2:{
                    cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
                    system("color 60");
                    system("cls");
                    cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
                    cout<<"Lavori in corso\n";
                    break;
                }
                case 3:{
                    cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
                    system("color c0");
                    system("cls");
                    cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
                    cout<<"Lavori in corso\n";
                    break;
                }
            }
        }
    }
    
    void tris(){
    	cout<<"        "<<x[0]<<" | "<<x[1]<<" | "<<x[2]<<endl;
    	cout<<"        "<<"---------\n";
    	cout<<"        "<<x[3]<<" | "<<x[4]<<" | "<<x[5]<<endl;
    	cout<<"        "<<"---------\n";
    	cout<<"        "<<x[6]<<" | "<<x[7]<<" | "<<x[8]<<endl;
    }
    
    bool full(){
    	for(int i=0;i<9;i++) if(x[i]==' ') return false;
    	return true;
    }
    
    bool combinazione(){
    	if(terna(0,1,2) or
    	terna(3,4,5) or
    	terna(6,7,8) or
    
    	terna(0,3,6) or
    	terna(1,4,7) or
    	terna(2,5,8) or
    
    	terna(0,4,8) or
    	terna(2,4,6)) return true;
    	return false;
    }
    
    bool terna(int a, int b, int c){
    	if(x[a]==x[b] && x[b]==x[c] && x[a]!=' '){
    		vincitore=x[a];
    		return true;
    	}
    	return false;
    }
    
    void legenda(){
    	cout<<"\n";
    	cout<<"\t\t\t\t\t\t\t\tSegui questo schema per l'inserimento:\n";
    	cout<<"\n";
    	cout<<"\t\t\t\t\t\t\t\t\t\t1  2  3"<<endl;
    	cout<<"\t\t\t\t\t\t\t\t\t\t4  5  6"<<endl;
    	cout<<"\t\t\t\t\t\t\t\t\t\t7  8  9"<<endl;
    }
    
    Non sono entrato nel merito del codice, ma per la modalità difficile si può rendere il computer imbattibile.
  • Re: Tris

    Rubik ha scritto:


    Con il while funziona, ma le parentesi graffe devono essere giuste e non può stare alla fine del case 1, ma alla fine di switch, ti devi fare aiutare dall'ide per il conteggio, quando clicchi una parentesi graffa l'ide ti mostra la corrispondente di chiusura o apertura.
    
    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    #include <windows.h>
    using namespace std;
    int difficolta;
    char vincitore;
    char x[9];
    void tris();
    bool combinazione();
    bool full();
    bool terna(int, int, int);
    void legenda();
    
    int main(){
        while(true){
            system("color f0");
            int posizione,pc;
            char indietro, cambio;
    
            cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
            cout<<"- Inserisci '1' per giocare in modalita' facile"<<endl;
            cout<<"- Inserisci '2' per giocare in modalita' media (work in progress)"<<endl;
            cout<<"- Inserisci '3' per giocare in modalita' difficile (work in progress)"<<endl<<endl;
            cin>>difficolta;
            for(int i=0;i<9;i++) x[i]=' ';
    
            switch(difficolta){
    
                case 1:{
    
                    system("color 20");
                    do{
                    for(int i=0;i<9;i++) x[i]=' ';
                    system("cls");
                    cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
                    srand(time(0));
                    while(combinazione()==false and full()==false){
                        legenda();
                        tris();
                        cout<<"\n\nInserisci posizione da 1 a 9\n	";
                        cin>>posizione;
    
                        while(posizione<1 or posizione >9 or x[posizione-1]!=' '){
                            cout<<"Casella occupata\n"<<endl;
                            cout<<"Inserisci di nuovo la posizione: ";
                            cin>>posizione;
                        }
    
                        x[posizione-1]='x';
    
    
                        if (full()==false and combinazione()==false){
                            pc=rand()%9;
                        while(x[pc]!=' '){
                            pc=rand()%9;
                        }
                            x[pc]='o';
                        }
    
                        tris();
    
                        system("cls");
                        cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
                    }
    
                    tris();
                    cout<<endl;
                    if(vincitore=='x') cout<<"	Hai vinto!\n";
                    else if(vincitore=='o') cout<<"	Hai perso!\n";
                    if (combinazione()==false) cout<<"	Pareggio!\n";
                    cout<<"Se vuoi giocare di nuovo in modalita' facile, premi b.\n";
                    cout<<"Premi qualsiasi altra lettera per riscegliere.\n";
                    cin>>indietro;
                    }while(indietro=='b');
                    break;
             }
                //-----------------------------------------------------------------------------------------------------------------------
                case 2:{
                    cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
                    system("color 60");
                    system("cls");
                    cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
                    cout<<"Lavori in corso\n";
                    break;
                }
                case 3:{
                    cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
                    system("color c0");
                    system("cls");
                    cout<<"---------- TRIS [Work in progress] ----------"<<endl<<endl;
                    cout<<"Lavori in corso\n";
                    break;
                }
            }
        }
    }
    
    void tris(){
    	cout<<"        "<<x[0]<<" | "<<x[1]<<" | "<<x[2]<<endl;
    	cout<<"        "<<"---------\n";
    	cout<<"        "<<x[3]<<" | "<<x[4]<<" | "<<x[5]<<endl;
    	cout<<"        "<<"---------\n";
    	cout<<"        "<<x[6]<<" | "<<x[7]<<" | "<<x[8]<<endl;
    }
    
    bool full(){
    	for(int i=0;i<9;i++) if(x[i]==' ') return false;
    	return true;
    }
    
    bool combinazione(){
    	if(terna(0,1,2) or
    	terna(3,4,5) or
    	terna(6,7,8) or
    
    	terna(0,3,6) or
    	terna(1,4,7) or
    	terna(2,5,8) or
    
    	terna(0,4,8) or
    	terna(2,4,6)) return true;
    	return false;
    }
    
    bool terna(int a, int b, int c){
    	if(x[a]==x[b] && x[b]==x[c] && x[a]!=' '){
    		vincitore=x[a];
    		return true;
    	}
    	return false;
    }
    
    void legenda(){
    	cout<<"\n";
    	cout<<"\t\t\t\t\t\t\t\tSegui questo schema per l'inserimento:\n";
    	cout<<"\n";
    	cout<<"\t\t\t\t\t\t\t\t\t\t1  2  3"<<endl;
    	cout<<"\t\t\t\t\t\t\t\t\t\t4  5  6"<<endl;
    	cout<<"\t\t\t\t\t\t\t\t\t\t7  8  9"<<endl;
    }
    
    Non sono entrato nel merito del codice, ma per la modalità difficile si può rendere il computer imbattibile.
    grazie di nuovo, la cosa dell'imbattibilità l'avevo pensata pure io
Devi accedere o registrarti per scrivere nel forum
5 risposte