Tic-Tac-Toe lädt keine Dateien.
-
Hallo zusammen!
Ich kabe ein kleines Game namens Tic-Tac-Toe geschrieben (kennt sicher jeder). Hier kann man Spielstände auch speichern und laden. Bei mir Funktioniert nir leider das Laden nicht.
Hier mein source-Code:
//--------------------------------------------------------------------------- #include <iostream.h> #include <conio.h> #include <io.h> #include <fcntl.h> #include <sys\stat.h> //--------------------------------------------------------------------------- char Alpha; char Num; char Wahl; char Matrix[3][3]; char Filename[256]; char Game[10]; int Handle; int Player; int Bytes; //--------------------------------------------------------------------------- void Paint_Matrix(void) { cout << "\n Tic-Tac-Toe\n"; cout << " îîîîîîîîîîî\n\n"; cout << " ÉÍÍÍËÍÍÍËÍÍÍËÍÍÍ»\n"; cout << " º º A º B º C º\n"; cout << " ÌÍÍÍÎÍÍÍÎÍÍÍÎÍÍ͹\n"; cout << " º 1 º " << Matrix[0][0] << " º " << Matrix[0][1] << " º " << Matrix[0][2] << " º\n"; cout << " ÌÍÍÍÎÍÍÍÎÍÍÍÎÍÍ͹\n"; cout << " º 2 º " << Matrix[1][0] << " º " << Matrix[1][1] << " º " << Matrix[1][2] << " º\n"; cout << " ÌÍÍÍÎÍÍÍÎÍÍÍÎÍÍ͹\n"; cout << " º 3 º " << Matrix[2][0] << " º " << Matrix[2][1] << " º " << Matrix[2][2] << " º\n"; cout << " ÈÍÍÍÊÍÍÍÊÍÍÍÊÍÍͼ\n"; } //--------------------------------------------------------------------------- bool Player_1_Wins(void) { if((Matrix[0][0] == 'X' && Matrix[0][1] == 'X' && Matrix[0][2] == 'X') || (Matrix[1][0] == 'X' && Matrix[1][1] == 'X' && Matrix[1][2] == 'X') || (Matrix[2][0] == 'X' && Matrix[2][1] == 'X' && Matrix[2][2] == 'X') || (Matrix[0][0] == 'X' && Matrix[1][0] == 'X' && Matrix[2][0] == 'X') || (Matrix[0][1] == 'X' && Matrix[1][1] == 'X' && Matrix[2][1] == 'X') || (Matrix[0][2] == 'X' && Matrix[1][2] == 'X' && Matrix[2][2] == 'X') || (Matrix[0][0] == 'X' && Matrix[1][1] == 'X' && Matrix[2][2] == 'X') || (Matrix[0][3] == 'X' && Matrix[1][1] == 'X' && Matrix[3][0] == 'X')) return true; else return false; } //--------------------------------------------------------------------------- bool Player_2_Wins(void) { if((Matrix[0][0] == 'O' && Matrix[0][1] == 'O' && Matrix[0][2] == 'O') || (Matrix[1][0] == 'O' && Matrix[1][1] == 'O' && Matrix[1][2] == 'O') || (Matrix[2][0] == 'O' && Matrix[2][1] == 'O' && Matrix[2][2] == 'O') || (Matrix[0][0] == 'O' && Matrix[1][0] == 'O' && Matrix[2][0] == 'O') || (Matrix[0][1] == 'O' && Matrix[1][1] == 'O' && Matrix[2][1] == 'O') || (Matrix[0][2] == 'O' && Matrix[1][2] == 'O' && Matrix[2][2] == 'O') || (Matrix[0][0] == 'O' && Matrix[1][1] == 'O' && Matrix[2][2] == 'O') || (Matrix[0][3] == 'O' && Matrix[1][1] == 'O' && Matrix[3][0] == 'O')) return true; else return false; } //--------------------------------------------------------------------------- int main() { start: for(int x = 0; x < 3; x++) for(int y = 0; y < 3; y++) Matrix[x][y] = ' '; start1: clrscr(); Paint_Matrix(); if(Player_1_Wins()) { cout << "\n Player 1 wins.\n\n Press any key to start a new game..."; getch(); goto start; } if(Player_2_Wins()) { cout << "\n Player 2 wins.\n\n Press any key to start a new game..."; getch(); goto start; } cout << "\n Player 1: Choose a field (Or press X for the Menu): "; Alpha = getche(); Player = 1; if (Alpha == 'X' || Alpha == 'x') goto menu; if (Alpha != 'A' && Alpha != 'B' && Alpha != 'C') Alpha = Alpha - 32; if (Alpha != 'A' && Alpha != 'B' && Alpha != 'C') goto start1; Alpha = Alpha - 65; Num = getche(); if (Num != '1' && Num != '2' && Num != '3') goto start1; Num = Num - 49; if (Matrix[Num][Alpha] == 'O' || Matrix[Num][Alpha] == 'X') goto start1; Matrix[Num][Alpha] = 'X'; start2: clrscr(); Paint_Matrix(); if(Player_1_Wins()) { cout << "\n Player 1 wins.\n\n Press any key to start a new game..."; getch(); goto start; } if(Player_2_Wins()) { cout << "\n Player 2 wins.\n\n Press any key to start a new game..."; getch(); goto start; } if(Matrix[0][0] != ' ' && Matrix[0][1] != ' ' && Matrix[0][2] != ' ' && Matrix[1][0] != ' ' && Matrix[1][1] != ' ' && Matrix[1][2] != ' ' && Matrix[2][0] != ' ' && Matrix[2][1] != ' ' && Matrix[2][2] != ' ') { cout << "\n Nobody wins.\n\n Press any key to start a new game..."; getch(); goto start; } cout << "\n Player 2: Choose a field (Or press X for the Menu): "; Alpha = getche(); Player = 2; if (Alpha == 'X' || Alpha == 'x') goto menu; if (Alpha != 'A' && Alpha != 'B' && Alpha != 'C') Alpha = Alpha - 32; if (Alpha != 'A' && Alpha != 'B' && Alpha != 'C') goto start2; Alpha = Alpha - 65; Num = getche(); if (Num != '1' && Num != '2' && Num != '3') goto start2; Num = Num - 49; if (Matrix[Num][Alpha] == 'X' || Matrix[Num][Alpha] == 'O') goto start2; Matrix[Num][Alpha] = 'O'; goto start1; //--------------------------------------------------------------------------- menu: clrscr(); cout << "\n Menu\n"; cout << " îîîî\n"; cout << "\n What do you want to do?\n\n"; cout << " 1. Loading a game\n"; cout << " 2. Saveing the game\n"; cout << " 3. Exit the game\n"; cout << " 4. Back to the game\n\n"; cout << " Press a number: "; Wahl = getche(); if (Wahl == '4') { if(Player == 1) goto start1; if(Player == 2) goto start2; } if (Wahl == '3') goto end; if (Wahl == '2') { cout << "\n\n Filename: "; cin >> Filename; Handle = open(Filename, O_RDWR | O_CREAT | O_TRUNC | O_BINARY); if (Handle == -1) { perror("\n Error"); cout << "\n Press any key to continue the game..."; getch(); if(Player == 1) goto start1; if(Player == 2) goto start2; } Game[0] = Player; Game[1] = Matrix[0][0]; Game[2] = Matrix[1][0]; Game[3] = Matrix[2][0]; Game[4] = Matrix[0][1]; Game[5] = Matrix[1][1]; Game[6] = Matrix[2][1]; Game[7] = Matrix[0][2]; Game[8] = Matrix[1][2]; Game[9] = Matrix[2][2]; Bytes = write(Handle, Game, 10); close(Handle); if(Bytes == -1) { perror("\n Error"); cout << "\n Press any key to continue the game..."; getch(); if(Player == 1) goto start1; if(Player == 2) goto start2; } if(Player == 1) goto start1; if(Player == 2) goto start2; } if (Wahl == '1') { cout << "\n\n Filename: "; cin >> Filename; Handle = open(Filename, O_RDWR | O_BINARY); if (Handle == -1) { perror("\n Error"); cout << "\n Press any key to continue the game..."; getch(); if(Player == 1) goto start1; if(Player == 2) goto start2; } Bytes = read(Handle, Game, 10); close(Handle); if(Bytes == -1) { perror("\n Error"); cout << "\n Press any key to continue the game..."; getch(); if(Player == 1) goto start1; if(Player == 2) goto start2; } Player = Game[0]; Matrix[0][0] = Game[1]; Matrix[1][0] = Game[2]; Matrix[2][0] = Game[3]; Matrix[0][1] = Game[4]; Matrix[1][1] = Game[5]; Matrix[2][1] = Game[6]; Matrix[0][2] = Game[7]; Matrix[1][2] = Game[8]; Matrix[2][2] = Game[9]; if(Player == 1) goto start1; if(Player == 2) goto start2; } goto menu; end: return 0; } //---------------------------------------------------------------------------
EditBy SideWinder: Bitte Code-Tags verwenden!
[ Dieser Beitrag wurde am 05.08.2002 um 11:15 Uhr von SideWinder editiert. ]
-
So klappts:
if (Wahl == '1') { cout << "\n\n Filename: "; cin >> Filename; Handle = _open(Filename, _O_RDONLY | O_BINARY);
ps:
typedef int Zug;//jetzt habe ich einen Typ gebaut mit Namen Zug, der eigentlich nur ein int ist typedef int Stein;//jetzt habe ich einen Typ gebaut mit Namen Stein, der eigentlich nur ein int ist Stein const LEER=0; Stein const WEISS=1; Stein const SCHWARZ=-1; typedef int Reihe[3];//jetzt habe ich einen Typ gebaut mit Namen Reihe, der eigentlich nur ein Array //mit 3 ints ist //Ne Reihe ist eine Zeile oder Spalte oder Diagonale, also was, wo drei in einer Reihe vorkommen können Reihe alleReihen[8]={ //Zuordnung der Ziffern siehe Nummerntastatur //waagerecht {1,2,3}, {4,5,6}, {7,8,9}, //senkrecht {1,4,7}, {2,5,8}, {3,6,9}, //diagonal {1,5,9}, {3,5,7}}; //Jetzt habe ich ein Array mit 8 Reihen gebaut, es heißt alleReihen //int alleReihen[8][3];//Wäre eigentlich das selbe, mag ich aber net Zug const KEINZUG=0; // TODO: Zug und Feld zu Typen machen, nicht plattes int nehmen struct TicTacToeSpiel { Stein feld[10];//Indizes von feld[0] bis feld[9], sind 10 stück //aber die feld[0] benutze ich nicht, sind also feld[1] bis ferd[9], //die ich benutzen will. void starteSpiel() { for(int i=1;i<10;++i) feld[i]=LEER; } char steinBild(Stein stein) { if(stein==LEER) return ' '; if(stein==WEISS) return 'X'; if(stein==SCHWARZ) return 'O'; cout<<"Scheiße programmiert!"<<endl; return 'S'; } void spielfeldAusgabe() { unsigned char a=197; // kreuz Strich unsigned char b=196; // horizontaler Strich unsigned char c=179; // vertikaler Strich cout<<'\t'<<steinBild(feld[7])<<c<<steinBild(feld[8])<<c<<steinBild(feld[9])<<endl; cout<<'\t'<<b<<a<<b<<a<<b<<endl; cout<<'\t'<<steinBild(feld[4])<<c<<steinBild(feld[5])<<c<<steinBild(feld[6])<<endl; cout<<'\t'<<b<<a<<b<<a<<b<<endl; cout<<'\t'<<steinBild(feld[1])<<c<<steinBild(feld[2])<<c<<steinBild(feld[3])<<endl<<endl; } void zugMensch() { spielfeldAusgabe(); Zug eingabe; cin>>eingabe; feld[eingabe]=SCHWARZ; } Zug findeGewinnZugInReihe(Reihe reihe,int farbe) { if(berechneReihenSumme(reihe)==2*farbe) { int a=reihe[0];if(feld[a]==LEER) return a; int b=reihe[1];if(feld[b]==LEER) return b; int c=reihe[2];if(feld[c]==LEER) return c; } return KEINZUG; } /* Noch ne Lösung, diemal ohne Zwischenvariablen Zug findeGewinnZugInReihe(Reihe reihe,int farbe) { if(feld[reihe[0]]+feld[reihe[1]]+feld[reihe[2]]==2*farbe) { if(feld[reihe[0]]==LEER) return reihe[0]; if(feld[reihe[1]]==LEER) return reihe[1]; if(feld[reihe[2]]==LEER) return reihe[2]; } return KEINZUG; } */ /* Die hier macht das gleiche und war ein Versuch, das mit Schleifen zu machen. Man sieht, daß Schleifen machmal einfach nur schlechter sind, also totel unleserlichen Code bauen im Vergleich zur anderen Lösung Zug findeGewinnZugInReihe(Reihe reihe,int farbe) { int summe=0; for(int i=0;i<3;++i) summe=summe+reihe[i]; if(summe==2*farbe) for(int i=0;i<3;++i) if(feld[i]==LEER) return i; return KEINZUG; }*/ Zug findeGewinnZugInAllenReihen(int farbe) { for(int i=0;i<8;++i) { Zug z=findeGewinnZugInReihe(alleReihen[i],farbe); if(z!=KEINZUG) return z; } return KEINZUG; } Zug findeZufallsZug() { /*nochmal: Zug wunschZug=rand()%9;//zufallzahl von 0 bis 8 wunschZug=wunschZug+1;//jetzt zufallzahl von 1 bis 9 if(feld[wunschZug]!=LEER) goto nochmal; return wunschZug;*/ Zug wunschZug; do { wunschZug=rand()%9;//zufallzahl von 0 bis 8 wunschZug=wunschZug+1;//jetzt zufallzahl von 1 bis 9 }while(feld[wunschZug]!=LEER); return wunschZug; } Zug berechneRechnerZug() { //1. wenn er gewinnen kann, soll er's tun int z=findeGewinnZugInAllenReihen(WEISS); if(z!=KEINZUG) return z; //2. wenn er abwehren kann, soll er's tun z=findeGewinnZugInAllenReihen(SCHWARZ); if(z!=KEINZUG) return z; //3. zufall z=findeZufallsZug(); return z; } void zugRechner() { Zug z=berechneRechnerZug(); feld[z]=WEISS; } int berechneReihenSumme(Reihe reihe) { int a=reihe[0]; int b=reihe[1]; int c=reihe[2]; return feld[a]+feld[b]+feld[c]; } bool gewonnen() { for(int i=0;i<8;++i) if(abs(berechneReihenSumme(alleReihen[i]))==3) return true; return false; /* //TODO: klingt nach Schleife! if(abs(feld[7]+feld[8]+feld[9])==3) return true; if(abs(feld[4]+feld[5]+feld[6])==3) return true; if(abs(feld[1]+feld[2]+feld[3])==3) return true; if(abs(feld[7]+feld[4]+feld[1])==3) return true; if(abs(feld[8]+feld[5]+feld[2])==3) return true; if(abs(feld[9]+feld[6]+feld[3])==3) return true; if(abs(feld[7]+feld[5]+feld[3])==3) return true; if(abs(feld[9]+feld[5]+feld[1])==3) return true; return false;*/ } bool unentschieden() {//funktioniert nur sicher, wenn nicht gleichzeitig gewonnen for(int i=1;i<10;++i) if(feld[i]==LEER) return false; return true; } }; int main() { //TODO: wer mogelt, verliert! srand(time(0)); TicTacToeSpiel spiel; for(int i=0;i<25;++i) cout<<endl; spiel.starteSpiel(); for(;;)//endlosschleife { spiel.zugRechner(); if(spiel.gewonnen()) { cout<<"Rechner hat gewonnen!"<<endl; break; } if(spiel.unentschieden()) { cout<<"unentschieden!"<<endl; break; } spiel.zugMensch(); if(spiel.gewonnen()) { cout<<"Mensch hat gewonnen!"<<endl; break; } if(spiel.unentschieden()) { cout<<"unentschieden!"<<endl; break; } } spiel.spielfeldAusgabe(); return 0; }