Bug in der Tic Tac Toe implementierung
-
ein paar gedanken dazu, die meisten sicherlich schlecht. es geht nur ums ausloten.
#include<iostream> #include<iomanip> using namespace std; struct feld { feld(){isEmpty=true;} char ch;//Zeichen bool isEmpty; }; //ch überladen und dreiwertig machen /*struct feld { feld(){ch='.';) char ch; };*/ class tic_tac_toe { private: feld Spielfeld[3][3];//andere anordnung, wie bereits gesagt // int anzahl; public: void zug(char ch); void anzeigen(); bool gewonnen(char ch); tic_tac_toe(); bool unentschieden(); }; bool tic_tac_toe::unentschieden() { //return anzahl==9 for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { if(Spielfeld[i][j].isEmpty) return false; } } return true; } tic_tac_toe::tic_tac_toe() { //passiert schon im ctor von feld Spielfeld[0][0].ch='.'; Spielfeld[0][1].ch='.'; Spielfeld[0][2].ch='.'; Spielfeld[1][0].ch='.'; Spielfeld[1][1].ch='.'; Spielfeld[1][2].ch='.'; Spielfeld[2][0].ch='.'; Spielfeld[2][1].ch='.'; Spielfeld[2][2].ch='.'; } //bool range(int min,int x,int max){return min<=x && x<=max) void tic_tac_toe::zug(char ch) { int reihe=0; int spalte=0; do { cout<<"Spalte: "; cin>>spalte; cout<<"Reihe: "; cin>>reihe; }while(reihe<1 || reihe>3 || spalte<1 || spalte>3 || !Spielfeld[spalte-1][reihe-1].isEmpty); //while(range(1,reihe,3) || range(1,spalte,3) || Spielfeld[spalte-1][reihe-1]!='.'); Spielfeld[spalte-1][reihe-1].ch=ch; //weg Spielfeld[spalte-1][reihe-1].isEmpty=false; //++anzahl } void tic_tac_toe::anzeigen() { // int i; // int y; for(/*int */i=0;i<3;i++)//besser x? { for(/*int */y=0;y<3;y++) { cout<<setw(2)<<Spielfeld[y][i].ch; } cout<<"\n\n"; } } bool tic_tac_toe::gewonnen(char ch) {//einfacher machen, das return ist viel guter als exit if(Spielfeld[0][0].ch==ch && Spielfeld[0][1].ch==ch && Spielfeld[0][2].ch==ch) { return true; } if(Spielfeld[1][0].ch==ch && Spielfeld[1][1].ch==ch && Spielfeld[1][2].ch==ch) { return true; } if(Spielfeld[2][0].ch==ch && Spielfeld[2][1].ch==ch && Spielfeld[2][2].ch==ch) { return true; } if(Spielfeld[0][1].ch==ch && Spielfeld[1][1].ch==ch && Spielfeld[2][1].ch==ch) { return true; } if(Spielfeld[0][0].ch==ch && Spielfeld[1][0].ch==ch && Spielfeld[2][0].ch==ch) { return true; } if(Spielfeld[0][2].ch==ch && Spielfeld[1][2].ch==ch && Spielfeld[2][2].ch==ch) { return true; } if(Spielfeld[0][0].ch==ch && Spielfeld[1][1].ch==ch && Spielfeld[2][2].ch==ch) { return true; } if(Spielfeld[0][2].ch==ch && Spielfeld[1][1].ch==ch && Spielfeld[2][0].ch==ch) { return true; } return false; } int main() { tic_tac_toe tic; while(true)//for(;;) { tic.anzeigen(); tic.zug('x'); if(tic.gewonnen('x')) { cout<<"Spieler 1 hat gewonnen!"<<endl; //wirkungslos void anzeigen(); break; //return statt break, also diese schleife aus der main() raus } if(tic.unentschieden()) { cout<<"Unentschieden!"<<endl; void anzeigen(); break; } tic.anzeigen(); tic.zug('o'); if(tic.gewonnen('o')) { cout<<"Spieler 2 hat gewonnen!"<<endl; void anzeigen(); break; } if(tic.unentschieden()) { cout<<"Unentschieden!"<<endl; void anzeigen(); break; } } cin.ignore(); getchar(); return 0; }
-
Warum for(;;) statt while(true) ???
Sonst ja ok man konnte es noch verbessern. Wir könnten für ch auch ein enum machen zb: enum eCh{X,O,no};
aber ist dann geschmakssache
-
Dumme Smileys meinte for( ; ; )
-
Karldin schrieb:
Warum for(;;) statt while(true) ???
for(;;)
nur um zu zeigen, daß man nicht pascal schreibt.Wir könnten für ch auch ein enum machen zb: enum eCh{X,O,no};
oder char const KREUZ='X'; char const KREIS='O'; char const LEER=' ';
sowas war ganz fein in nem 4-gewinnt-spiel, das ich mal schrieb.