Problema scrittura array su file

di il
9 risposte

Problema scrittura array su file

Sono appena entrato quindi intanto salve a tutti! Passiamo al mio problema..il codice per un' "intelligenza artificiale" del gioco del tris non mi scrive su un file il vettore che contiene gli stati delle varie caselle. Il codice compila correttamente ma non scrive comunque. Metto il codice e spero che possiate aiutarmi a capire dove ho sbagliato. Chiedo inoltre se qualcuno è disponibile ogni tanto a fornire qualche consiglio o aiuto in privato magari, senza disturbare qui. Ecco il codice:
#include <iostream>
#include <string>
#include <fstream>
 
using namespace std;
 
/*
Classe giocatore
*/
class Giocatore{
	string nome;
	char simbolo;
public:
	// Costruttore del giocatore. Prevede nome e simbolo
	Giocatore(string, char);
	// Restituisce il nome del giocatore
	string getNome();
	// Ritorna il simbolo del giocatore
	char getSimbolo();
};

/*
Classe relativa al gioco
*/
class Tris{
	// Attributi
protected:	
	// Griglia
	int n[9];
	
	// Giocatori
	Giocatore a;
	Giocatore b;
	
	// Stato di fine del gioco
	bool fine;
	// 0 se gioca il giocatore 1, 1 se gioca il giocatore 2	
	int turno;
	// 1 se ha vinto il giocatore 1, 2 se ha vinto il giocatore 2, 3 se pareggio
	int risultato;
	
	// Metodi
public:	
	// Costruttore che necessita dei due giocatori
	Tris(Giocatore, Giocatore);	
	// Avvia il gioco e ritorna 1, 2 o 3 (1 se vince il giocatore 1, 2 se vince il giocatore 2 o 3 se pareggio.
	// Richiede un parametro 1 o 2 per definire quale giocatore deve iniziare
	int inizia_gioco(int);
protected:
	// Mostro a video la legenda
	void visualizza_legenda();
	// Mostro la griglia
	void visualizza_tris();
	// Controllo se la tabella è piena	
	void controllo_se_tabella_piena();
	// Controllo se c'è stata una vittoria
	void controllo_vittoria();
	// Gestisco l'input del giocatore
	void input(int giocatore);
	// Cambia il giocatore che deve giocare
	void cambia_turno();
	// Stampa chi ha vinto
	void stampa_risultato();
	// Pulisci stato del gioco
	void pulisci_stato_del_gioco();
};
 
 /*
 Classe TrisIA
 */
 class TrisIA: public Tris{
 public:
 	TrisIA(Giocatore,Giocatore);
 	int inizia_gioco(int);
 private:
    void input(int);
    
 };
 
int main(){
    string nome;
	char simbolo;
    
    // INIZIO inizializzazione dei giocatori
    cout<<"Inserisci il nome del primo giocatore: ";
	cin>>nome;
	cout<<"Inserisci il simbolo del primo giocatore: ";
	cin>>simbolo;
	Giocatore a(nome, simbolo);
		
	cout<<"Inserisci il nome del sercondo giocatore: ";
    cin>>nome;
	cout<<"Inserisci il simbolo del primo giocatore: ";
	cin>>simbolo;
	Giocatore b(nome, simbolo);
	// FINE inizializzazione dei giocatori
    
    // Creo il gioco che necessita dei 2 giocatori
    TrisIA tris(a,b);
    // Avvio il gioco
    tris.inizia_gioco(1); 

    cout<<endl<<endl;
    
    //system("pause");
    return 0;
}

// Tris -----------------------------------------
int Tris::inizia_gioco(int chi_inizia){
	
	turno = chi_inizia;
	
	cout<<"TRIS\n\n";
	cout<<"Si stanno per sfidare "<<a.getNome()<<" e "<<b.getNome()<<endl;
	
	// mostra la legenda
	visualizza_legenda(); 
	
	while(fine == false)
    {
    	// stampa a video chi deve giocare
    	if(turno == 1){
    		cout<<"E' il turno di "<<a.getNome()<<"\n\n";
	    	input(1);	
		}else{
			cout<<"E' il turno di "<<b.getNome()<<"\n\n";
            input(2);		
		}      
		
		// visualizza la griglia
		visualizza_tris();

    	// se la tabella è stata riempita allora fine == true
        controllo_se_tabella_piena();
        
        // controlla se c'è stata una vittoria con l'ultima mossa
    	controllo_vittoria();	
		
		// cambio il giocatore che dovrà giocare la prossima mossa
		cambia_turno();	 
    }
    
    // stampa il risultato a video
    stampa_risultato();
    
    // salva il risultato da ritornare prima che venga cancellato
    int r = risultato;
    
    // ripulisci lo stato del gioco per un'altra partita
	pulisci_stato_del_gioco();
	
	// ritorna il risultato
    return r;
}

void Tris::input(int giocatore){
	int scelta;
    cout<<"Inserisci la tua scelta [1-9]: ";
    cin>>scelta;
    while(n[scelta-1]!=0 || scelta > 9 || scelta < 1){
    	if(scelta > 9 || scelta < 1)
    		cout<<"Valore non valido"<<endl;
    	else
    		cout<<"Casella gia' occupata"<<endl;
    	cin>>scelta;
	}
    scelta = scelta - 1;
    n[scelta]=giocatore;
}

//controllo se la tabella è piena
void Tris::controllo_se_tabella_piena(){
    int ctrl=0;
    for(int i=0;i<9;i++)
    {
        if(n[i]!=0)
            ctrl++;
    }
    if(ctrl==9)
    	fine=true;
}
 
// Controllo vincita
void Tris::controllo_vittoria(){
	if ((n[0]!=0 && n[0]==n[1] && n[1]==n[2]) || (n[3]!=0 && n[3]==n[4] && n[4]==n[5]) || (n[6]!=0 && n[6]==n[7] && n[7]==n[8]) || (n[0]!=0 && n[0]==n[3] && n[3]==n[6]) || (n[1]!=0 && n[1]==n[4] && n[4]==n[7]) || (n[2]!=0 && n[2]==n[5] && n[5]==n[8]) || (n[0]!=0 && n[0]==n[4] && n[4]==n[8]) || (n[2]!=0 && n[2]==n[4] && n[4]==n[6]))
	{
		fine=true;
		if(turno == 2){
	    	risultato = 2;	
		}else{
			risultato = 1;	
		}
	}
}

// visualizza il campo
void Tris::visualizza_tris(){
	
	cout<<endl;
	cout<<"---+---+---+"<<endl;	
	for(int i=0; i < 9; i++){
		
		if(i%3==0 && i != 0){
		    cout<<endl;
        	cout<<"---+---+---+"<<endl;	
		}
					
		if(n[i] == 0)
			cout<<"   |";
		else if(n[i] == 1)
				cout<<" "<<a.getSimbolo()<<" |";
			else
				cout<<" "<<b.getSimbolo()<<" |";
	}
	cout<<endl<<"---+---+---+"<<endl;
	cout<<endl;	
}

Tris::Tris(Giocatore g1, Giocatore g2):a(g1),b(g2){
    for(int i=0;i<9;i++){
    	n[i] = 0;
	}
	
	fine = false;		
	turno = 1;
	risultato = 0; 
}

void Tris::visualizza_legenda(){
    cout<<"LEGENDA:"<<endl<<endl;
    cout<<"---+---+---+"<<endl;
	cout<<" 1 | 2 | 3 |"<<endl;
    cout<<"---+---+---+"<<endl;
    cout<<" 4 | 5 | 6 |"<<endl;
    cout<<"---+---+---+"<<endl;
    cout<<" 7 | 8 | 9 |"<<endl;
    cout<<"---+---+---+"<<endl;
}

void Tris::cambia_turno(){
		// Se sta giocando il giocatore 1 allora al prossimo turno gioca il giocatore 2
		// e viceversa
    	if(turno == 1){
	    	turno = 2;		
		}else{
			turno = 1;		
		}      
}

// Stampa chi ha vinto
void Tris::stampa_risultato(){
    if(risultato == 1)
    {
    	cout<<"Ha vinto "<<a.getNome()<<"!";
	}else{
		if(risultato == 2){
            cout<<"Ha vinto "<<b.getNome()<<"!";
        }else{
            cout<<"Pareggio";
    	}
    }	
    cout<<endl<<endl;
}

// Pulisci stato del gioco
void Tris::pulisci_stato_del_gioco(){
    // Ripulisci stato del gioco	
	for(int i = 0; i<9; i++){
    	n[i] = 0;	
	}
	
	// Stato di fine del gioco
	fine = false;
	risultato = 0;	
}
	
// Giocatore -----------------------------------------

Giocatore::Giocatore(string n, char s):nome(n), simbolo(s){
	cout<<"Creato giocatore "<<n<<" con simbolo "<<s<<endl;
}

string Giocatore::getNome(){
	return nome;
}

char Giocatore::getSimbolo(){
	return simbolo;
}

// TrisIA --------------------------------------------

TrisIA::TrisIA(Giocatore g1,Giocatore g2):Tris(g1,g2)
{
}
void TrisIA:: input(int giocatore){
	Tris::input(giocatore);
	fstream file;
	;if(turno==1){
	 file.open("IATris.txt",ios::app);
	 if(!file.is_open())
	  cout<<"Il file non si è aperto correttamente.";
	 else
	  for(int i=0; i<10, i++;){
	  	file<<n[i];
	  }
	 file<<endl;
	 file.close();
    }
}



int TrisIA::inizia_gioco(int chi_inizia){
	
	turno = chi_inizia;
	
	cout<<"TRIS\n\n";
	cout<<"Si stanno per sfidare "<<a.getNome()<<" e "<<b.getNome()<<endl;
	
	// mostra la legenda
	visualizza_legenda(); 
	
	while(fine == false)
    {
    	// stampa a video chi deve giocare
    	if(turno == 1){
    		cout<<"E' il turno di "<<a.getNome()<<"\n\n";
	    	input(1);	
		}else{
			cout<<"E' il turno di "<<b.getNome()<<"\n\n";
            input(2);		
		}      
		
		// visualizza la griglia
		visualizza_tris();

    	// se la tabella è stata riempita allora fine == true
        controllo_se_tabella_piena();
        
        // controlla se c'è stata una vittoria con l'ultima mossa
    	controllo_vittoria();	
		
		// cambio il giocatore che dovrà giocare la prossima mossa
		cambia_turno();	 
    }
    
    // stampa il risultato a video
    stampa_risultato();
    
    // salva il risultato da ritornare prima che venga cancellato
    int r = risultato;
    
    // ripulisci lo stato del gioco per un'altra partita
	pulisci_stato_del_gioco();
	
	// ritorna il risultato
    return r;
}

Grazie in anticipo!!

9 Risposte

  • Re: Problema scrittura array su file

    In quale parte di codice dovrebbe avvenire la scrittura?
  • Re: Problema scrittura array su file

    Nella funzione input della classe TrisIA
  • Re: Problema scrittura array su file

    DadoStar ha scritto:


    Nella funzione input della classe TrisIA
    La for è scritta in modo sbagliato. Deve essere

    for(int i=0; i<10; i++){
  • Re: Problema scrittura array su file

    Ops un errore nella riscrittura veloce di quella parte. Comunque non è quello il problema perché anche così non scrive nulla sul file
  • Re: Problema scrittura array su file

    E' quello perché a me scrive ...

    E c'è anche un ; inutile davanti alla if
  • Re: Problema scrittura array su file

    Adesso riprovo ma giuro che non mi scrive! Ti tengo informato grazie mille comunque
  • Re: Problema scrittura array su file

    Niente, continua a compilare correttamente e a creare anche il file ma di scrivere non ne vuole sapere
  • Re: Problema scrittura array su file

    Posta nuovamente il codice corretto
  • Re: Problema scrittura array su file

    #include <iostream>
    #include <string>
    #include <fstream>
     
    using namespace std;
     
    /*
    Classe giocatore
    */
    class Giocatore{
    	string nome;
    	char simbolo;
    public:
    	// Costruttore del giocatore. Prevede nome e simbolo
    	Giocatore(string, char);
    	// Restituisce il nome del giocatore
    	string getNome();
    	// Ritorna il simbolo del giocatore
    	char getSimbolo();
    };
    
    /*
    Classe relativa al gioco
    */
    class Tris{
    	// Attributi
    protected:	
    	// Griglia
    	int n[9];
    	
    	// Giocatori
    	Giocatore a;
    	Giocatore b;
    	
    	// Stato di fine del gioco
    	bool fine;
    	// 0 se gioca il giocatore 1, 1 se gioca il giocatore 2	
    	int turno;
    	// 1 se ha vinto il giocatore 1, 2 se ha vinto il giocatore 2, 3 se pareggio
    	int risultato;
    	
    	// Metodi
    public:	
    	// Costruttore che necessita dei due giocatori
    	Tris(Giocatore, Giocatore);	
    	// Avvia il gioco e ritorna 1, 2 o 3 (1 se vince il giocatore 1, 2 se vince il giocatore 2 o 3 se pareggio.
    	// Richiede un parametro 1 o 2 per definire quale giocatore deve iniziare
    	int inizia_gioco(int);
    protected:
    	// Mostro a video la legenda
    	void visualizza_legenda();
    	// Mostro la griglia
    	void visualizza_tris();
    	// Controllo se la tabella è piena	
    	void controllo_se_tabella_piena();
    	// Controllo se c'è stata una vittoria
    	void controllo_vittoria();
    	// Gestisco l'input del giocatore
    	void input(int giocatore);
    	// Cambia il giocatore che deve giocare
    	void cambia_turno();
    	// Stampa chi ha vinto
    	void stampa_risultato();
    	// Pulisci stato del gioco
    	void pulisci_stato_del_gioco();
    };
     
     /*
     Classe TrisIA
     */
     class TrisIA: public Tris{
     public:
     	TrisIA(Giocatore,Giocatore);
     	int inizia_gioco(int);
     private:
        void input(int);
        
     };
     
    int main(){
        string nome;
    	char simbolo;
        
        // INIZIO inizializzazione dei giocatori
        cout<<"Inserisci il nome del primo giocatore: ";
    	cin>>nome;
    	cout<<"Inserisci il simbolo del primo giocatore: ";
    	cin>>simbolo;
    	Giocatore a(nome, simbolo);
    		
    	cout<<"Inserisci il nome del sercondo giocatore: ";
        cin>>nome;
    	cout<<"Inserisci il simbolo del primo giocatore: ";
    	cin>>simbolo;
    	Giocatore b(nome, simbolo);
    	// FINE inizializzazione dei giocatori
        
        // Creo il gioco che necessita dei 2 giocatori
        TrisIA tris(a,b);
        // Avvio il gioco
        tris.inizia_gioco(1); 
    
        cout<<endl<<endl;
        
        //system("pause");
        return 0;
    }
    
    // Tris -----------------------------------------
    int Tris::inizia_gioco(int chi_inizia){
    	
    	turno = chi_inizia;
    	
    	cout<<"TRIS\n\n";
    	cout<<"Si stanno per sfidare "<<a.getNome()<<" e "<<b.getNome()<<endl;
    	
    	// mostra la legenda
    	visualizza_legenda(); 
    	
    	while(fine == false)
        {
        	// stampa a video chi deve giocare
        	if(turno == 1){
        		cout<<"E' il turno di "<<a.getNome()<<"\n\n";
    	    	input(1);	
    		}else{
    			cout<<"E' il turno di "<<b.getNome()<<"\n\n";
                input(2);		
    		}      
    		
    		// visualizza la griglia
    		visualizza_tris();
    
        	// se la tabella è stata riempita allora fine == true
            controllo_se_tabella_piena();
            
            // controlla se c'è stata una vittoria con l'ultima mossa
        	controllo_vittoria();	
    		
    		// cambio il giocatore che dovrà giocare la prossima mossa
    		cambia_turno();	 
        }
        
        // stampa il risultato a video
        stampa_risultato();
        
        // salva il risultato da ritornare prima che venga cancellato
        int r = risultato;
        
        // ripulisci lo stato del gioco per un'altra partita
    	pulisci_stato_del_gioco();
    	
    	// ritorna il risultato
        return r;
    }
    
    void Tris::input(int giocatore){
    	int scelta;
        cout<<"Inserisci la tua scelta [1-9]: ";
        cin>>scelta;
        while(n[scelta-1]!=0 || scelta > 9 || scelta < 1){
        	if(scelta > 9 || scelta < 1)
        		cout<<"Valore non valido"<<endl;
        	else
        		cout<<"Casella gia' occupata"<<endl;
        	cin>>scelta;
    	}
        scelta = scelta - 1;
        n[scelta]=giocatore;
    }
    
    //controllo se la tabella è piena
    void Tris::controllo_se_tabella_piena(){
        int ctrl=0;
        for(int i=0;i<9;i++)
        {
            if(n[i]!=0)
                ctrl++;
        }
        if(ctrl==9)
        	fine=true;
    }
     
    // Controllo vincita
    void Tris::controllo_vittoria(){
    	if ((n[0]!=0 && n[0]==n[1] && n[1]==n[2]) || (n[3]!=0 && n[3]==n[4] && n[4]==n[5]) || (n[6]!=0 && n[6]==n[7] && n[7]==n[8]) || (n[0]!=0 && n[0]==n[3] && n[3]==n[6]) || (n[1]!=0 && n[1]==n[4] && n[4]==n[7]) || (n[2]!=0 && n[2]==n[5] && n[5]==n[8]) || (n[0]!=0 && n[0]==n[4] && n[4]==n[8]) || (n[2]!=0 && n[2]==n[4] && n[4]==n[6]))
    	{
    		fine=true;
    		if(turno == 2){
    	    	risultato = 2;	
    		}else{
    			risultato = 1;	
    		}
    	}
    }
    
    // visualizza il campo
    void Tris::visualizza_tris(){
    	
    	cout<<endl;
    	cout<<"---+---+---+"<<endl;	
    	for(int i=0; i < 9; i++){
    		
    		if(i%3==0 && i != 0){
    		    cout<<endl;
            	cout<<"---+---+---+"<<endl;	
    		}
    					
    		if(n[i] == 0)
    			cout<<"   |";
    		else if(n[i] == 1)
    				cout<<" "<<a.getSimbolo()<<" |";
    			else
    				cout<<" "<<b.getSimbolo()<<" |";
    	}
    	cout<<endl<<"---+---+---+"<<endl;
    	cout<<endl;	
    }
    
    Tris::Tris(Giocatore g1, Giocatore g2):a(g1),b(g2){
        for(int i=0;i<9;i++){
        	n[i] = 0;
    	}
    	
    	fine = false;		
    	turno = 1;
    	risultato = 0; 
    }
    
    void Tris::visualizza_legenda(){
        cout<<"LEGENDA:"<<endl<<endl;
        cout<<"---+---+---+"<<endl;
    	cout<<" 1 | 2 | 3 |"<<endl;
        cout<<"---+---+---+"<<endl;
        cout<<" 4 | 5 | 6 |"<<endl;
        cout<<"---+---+---+"<<endl;
        cout<<" 7 | 8 | 9 |"<<endl;
        cout<<"---+---+---+"<<endl;
    }
    
    void Tris::cambia_turno(){
    		// Se sta giocando il giocatore 1 allora al prossimo turno gioca il giocatore 2
    		// e viceversa
        	if(turno == 1){
    	    	turno = 2;		
    		}else{
    			turno = 1;		
    		}      
    }
    
    // Stampa chi ha vinto
    void Tris::stampa_risultato(){
        if(risultato == 1)
        {
        	cout<<"Ha vinto "<<a.getNome()<<"!";
    	}else{
    		if(risultato == 2){
                cout<<"Ha vinto "<<b.getNome()<<"!";
            }else{
                cout<<"Pareggio";
        	}
        }	
        cout<<endl<<endl;
    }
    
    // Pulisci stato del gioco
    void Tris::pulisci_stato_del_gioco(){
        // Ripulisci stato del gioco	
    	for(int i = 0; i<9; i++){
        	n[i] = 0;	
    	}
    	
    	// Stato di fine del gioco
    	fine = false;
    	risultato = 0;	
    }
    	
    // Giocatore -----------------------------------------
    
    Giocatore::Giocatore(string n, char s):nome(n), simbolo(s){
    	cout<<"Creato giocatore "<<n<<" con simbolo "<<s<<endl;
    }
    
    string Giocatore::getNome(){
    	return nome;
    }
    
    char Giocatore::getSimbolo(){
    	return simbolo;
    }
    
    // TrisIA --------------------------------------------
    
    TrisIA::TrisIA(Giocatore g1,Giocatore g2):Tris(g1,g2)
    {
    }
    void TrisIA:: input(int giocatore){
    	Tris::input(giocatore);
    	fstream file;
    	if(turno==1){
    	 file.open("IATris.txt", ios::app);
    	 if(!file.is_open())
    	  cout<<"Il file non si è aperto correttamente.";
    	 else
    	  for(int i=0; i<10; i++){
    	  	file<<n[i];
    	  }
    	 file<<endl;
    	 file.close();
        }
    }
    
    
    
    int TrisIA::inizia_gioco(int chi_inizia){
    	
    	turno = chi_inizia;
    	
    	cout<<"TRIS\n\n";
    	cout<<"Si stanno per sfidare "<<a.getNome()<<" e "<<b.getNome()<<endl;
    	
    	// mostra la legenda
    	visualizza_legenda(); 
    	
    	while(fine == false)
        {
        	// stampa a video chi deve giocare
        	if(turno == 1){
        		cout<<"E' il turno di "<<a.getNome()<<"\n\n";
    	    	input(1);	
    		}else{
    			cout<<"E' il turno di "<<b.getNome()<<"\n\n";
                input(2);		
    		}      
    		
    		// visualizza la griglia
    		visualizza_tris();
    
        	// se la tabella è stata riempita allora fine == true
            controllo_se_tabella_piena();
            
            // controlla se c'è stata una vittoria con l'ultima mossa
        	controllo_vittoria();	
    		
    		// cambio il giocatore che dovrà giocare la prossima mossa
    		cambia_turno();	 
        }
        
        // stampa il risultato a video
        stampa_risultato();
        
        // salva il risultato da ritornare prima che venga cancellato
        int r = risultato;
        
        // ripulisci lo stato del gioco per un'altra partita
    	pulisci_stato_del_gioco();
    	
    	// ritorna il risultato
        return r;
    }
    
Devi accedere o registrarti per scrivere nel forum
9 risposte