OOP Tic Tac Toe
-
Hallo,
ich poste hier meine Umsetzung des Spiels Tic Tac Toe. Ein Vorwort, meine Umsetzung zur Auswertung des Siegers ist für den Arsch, wenn jemand eine Site kennt die Theorien auflistet zum Auswerten von solchen Minigames (etc), dann währe es nett wenn er die hier Linken könnte..An einigen Stellen hätte ich auch den Code mit der Übergabe von Arrays einfacher gestalten können, aber daher ich Pointer als ein eher verwirrendes Werkzeug empfinde (was nach meinem Wissen nötig ist um ein Array zu übergeben)habe ich die Probleme anders gelöst.
#include <iostream> class gamefield { private: char mspielfeld[3][3]; void zeichne(); public: void neuspielfeld(); bool setzen(int spieler,int feld); int sieger(); }; int gamefield::sieger() { int i, k, b; int spieler; spieler = 0; if(mspielfeld[0][0] == 'X' && mspielfeld[0][1] == 'X' && mspielfeld[0][2] == 'X'){spieler = 1;} else if(mspielfeld[1][0] == 'X' && mspielfeld[1][1] == 'X' && mspielfeld[1][2] == 'X'){spieler = 1;} else if(mspielfeld[2][0] == 'X' && mspielfeld[2][1] == 'X' && mspielfeld[2][2] == 'X'){spieler = 1;} else if(mspielfeld[0][0] == 'X' && mspielfeld[1][0] == 'X' && mspielfeld[2][0] == 'X'){spieler = 1;} else if(mspielfeld[0][1] == 'X' && mspielfeld[1][1] == 'X' && mspielfeld[2][1] == 'X'){spieler = 1;} else if(mspielfeld[0][2] == 'X' && mspielfeld[1][2] == 'X' && mspielfeld[2][2] == 'X'){spieler = 1;} else if(mspielfeld[0][0] == 'X' && mspielfeld[1][1] == 'X' && mspielfeld[2][2] == 'X'){spieler = 1;} else if(mspielfeld[2][0] == 'X' && mspielfeld[1][1] == 'X' && mspielfeld[0][2] == 'X'){spieler = 1;} if(mspielfeld[0][0] == '0' && mspielfeld[0][1] == '0' && mspielfeld[0][2] == '0'){spieler = 2;} else if(mspielfeld[1][0] == '0' && mspielfeld[1][1] == '0' && mspielfeld[1][2] == '0'){spieler = 2;} else if(mspielfeld[2][0] == '0' && mspielfeld[2][1] == '0' && mspielfeld[2][2] == '0'){spieler = 2;} else if(mspielfeld[0][0] == '0' && mspielfeld[1][0] == '0' && mspielfeld[2][0] == '0'){spieler = 2;} else if(mspielfeld[0][1] == '0' && mspielfeld[1][1] == '0' && mspielfeld[2][1] == '0'){spieler = 2;} else if(mspielfeld[0][2] == '0' && mspielfeld[1][2] == '0' && mspielfeld[2][2] == '0'){spieler = 2;} else if(mspielfeld[0][0] == '0' && mspielfeld[1][1] == '0' && mspielfeld[2][2] == '0'){spieler = 2;} else if(mspielfeld[2][0] == '0' && mspielfeld[1][1] == '0' && mspielfeld[0][2] == '0'){spieler = 2;} b = 0; for(i=0; i<3;i++) { for(k=0; k<3;k++) { if(mspielfeld[i][k] == 'X' ||mspielfeld[i][k] == '0'){b++;} } } if(b==9){spieler = 3;} return spieler; } bool gamefield::setzen(int spieler, int feld) { int i, j; switch(feld) { case(1): i = 0; j = 0; break; case(2): i = 0; j = 1; break; case(3): i = 0; j = 2; break; case(4): i = 1; j = 0; break; case(5): i = 1; j = 1; break; case(6): i = 1; j = 2; break; case(7): i = 2; j = 0; break; case(8): i = 2; j = 1; break; case(9): i = 2; j = 2; break; default: return false; break; } if(mspielfeld[i][j] == 'X' || mspielfeld[i][j] == '0'){return false;} else { switch (spieler) { case 1: mspielfeld[i][j] = 'X'; break; case 2: mspielfeld[i][j] = '0'; break; } gamefield::zeichne(); return true; } } void gamefield::zeichne() { system("cls"); std::cout << std::endl; std::cout << " " << mspielfeld[0][0] << "|" << mspielfeld[0][1] << "|" << mspielfeld[0][2] << std::endl; std::cout << " " << "-" << "|" << "-" << "|" << "-" << std::endl; std::cout << " " << mspielfeld[1][0] << "|" << mspielfeld[1][1] << "|" << mspielfeld[1][2] << std::endl; std::cout << " " << "-" << "|" << "-" << "|" << "-" << std::endl; std::cout << " " << mspielfeld[2][0] << "|" << mspielfeld[2][1] << "|" << mspielfeld[2][2] << std::endl; std::cout << std::endl; } void gamefield::neuspielfeld() { int i, k, j; i = 0; k = 48; j = 0; for(i=0;i<3;i++) { for(j=0;j<3;j++) { k++; mspielfeld[i][j] = k; } } gamefield::zeichne(); } class player { private: int spieler; int zuege; public: int zug(int Spieler); void nextplayer(); void neu(); int atmspieler(); }; void player::neu() { spieler = 1; zuege = 0; } int player::atmspieler() { return spieler; } int player::zug(int Spieler) { int feld; std::cout << "Spieler" << Spieler << ": Welches Feld wollen sie Waehlen -> "; std::cin >> feld; std::cout << std::endl; return feld; } void player::nextplayer() { zuege++; if(spieler == 1){spieler = 2;} else if(spieler == 2){spieler = 1;} } int main() { int spieler; int feld = 0; int ende; bool end; int gamewahl; player Spieler; gamefield Spielfeld; do{ Spielfeld.neuspielfeld (); Spieler.neu(); do{ end = false; spieler = Spieler.atmspieler(); do{feld = Spieler.zug(spieler);}while(!Spielfeld.setzen(spieler, feld)); ende = Spielfeld.sieger(); if(ende == 0){end = false;} else if(ende == 1){end = true;} else if(ende == 2){end = true;} else if(ende == 3){end = true;} Spieler.nextplayer(); }while(!end); if(ende == 1 || ende == 2){std::cout << "Spieler " << ende << " hat gewonnen!" << std::endl;} else{std::cout << "Unentschieden!" << std::endl;} std::cout << "Noch ein Spiel(1) oder wollen Sie beenden(2)?: "; std::cin >> gamewahl; std::cout << std::endl; }while(gamewahl==1); return 0; }
-
Sieht gut aus, nur würde es mit normalen Arrays leichter gehen, zbsp bei der Vergleichung:
if(field[1] == 'X' && field[5] == 'X' && field[9] == 'X') { //.. }
Ersetz mal 0 durch O, sieht besser aus