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!!