Brauche Hilfe bei einem Tic Tac Toe Spiel
-
Guten Tag
Ich lerne zurzeit C++ , mit dem Buch C++ für Spieleprogrammierer von Heiko Kalista. Dort habe ich gerade Kapitel 5 beendet, bei dem es um Arrays ging. Nun dachte ich mir, könnte ich doch mit meinen neu gewonnenen Kenntnissen ein kleines Tic Tac Toe (Mulitplayer, KI zu programmieren war mir erstmal zu schwierig) Spiel programmieren. Tja, soweit so gut, ich hab mal angefangen und bin dann auch zu einem Schluss gekommen.
Nun als allererstes mal meinen Quellcode:
//TIC TAC TOE MULTIPLAYER // // #include <iostream> using namespace std; struct S_Feldinfo { bool Besetzt; bool Besetzt2; }; struct S_Spieler { char Name[40]; }; struct S_Gewinner { bool Gewonnen; char Name[30]; }; const int Breite = 3; const int Höhe = 3; S_Spieler Spieler1; S_Spieler Spieler2; S_Feldinfo Spielfeld[Breite][Höhe]; S_Gewinner GewinnerErmittlung; void GewinnerErmitteln (); void LoescheSpielfeld (); void Spielen (); void ZeigeFeld (); void Spielzug1 (); void Spielzug2 (); int main () { int Auswahl = 0; LoescheSpielfeld (); do { // Menü ausgeben // cout << "Tic Tac Toe Menue" << endl; cout << "1 - Spielen" << endl; cout << "2 - Beenden" << endl; // Eingabe abfragen cout << "Auswahl: "; cin >> Auswahl; // Je nach Eingabe verzweigen switch (Auswahl) { case (1): { Spielen (); } break; case (2): { cout << "Das Spiel wird beendet!\n"; } break; // Falsche Eingabe? default: { cout << "Falsche Eingabe!\n\n"; } } } while (Auswahl != 2 ); // Spiel beenden? cout << "Bis zum naechsten Mal" << endl; return 0; } // main void LoescheSpielfeld () { for (int y=0;y<Höhe;y++) { for (int x=0;x<Breite;x++) { Spielfeld[x][y].Besetzt = false; } } } void Spielen () { //Abfrage der Spielernamen cout <<"Willkommen im Tic Tac Toe-Multiplayer!"<<endl; cout <<"Spieler 1, waehle deinen Namen: " << endl; cin.ignore (); cin.get(Spieler1.Name, 19); cout <<"Spieler 2, waehle deinen Namen: " << endl; cin.ignore (); cin.get(Spieler2.Name, 19); cout << endl; //Matchankündigung cout <<"Naechstes Match: "<<endl; cout << Spieler1.Name <<" vs. "<< Spieler2.Name << endl; cout <<endl; cout << endl; do { cout << "Los gehts, "<< Spieler1.Name <<" faengt an!"<<endl; { ZeigeFeld (); Spielzug1 (); ZeigeFeld (); } cout << "Jetzt ist "<< Spieler2.Name << " dran!"<<endl; { Spielzug2 (); cout << endl; ZeigeFeld (); } cout << Spieler1.Name << " ist an der Reihe!"<<endl; { Spielzug1 (); cout << endl; ZeigeFeld (); GewinnerErmitteln (); } cout << Spieler2.Name << " ist an der Reihe!"<<endl; { Spielzug2 (); cout<<endl; ZeigeFeld (); GewinnerErmitteln (); } cout << Spieler1.Name << " ist an der Reihe!"<<endl; { Spielzug1 (); cout<<endl; ZeigeFeld (); GewinnerErmitteln (); } cout << Spieler2.Name << " ist an der Reihe!"<<endl; { Spielzug2 (); cout<<endl; ZeigeFeld (); GewinnerErmitteln (); } cout << Spieler1.Name << " ist an der Reihe!"<<endl; { Spielzug1 (); cout<<endl; ZeigeFeld (); GewinnerErmitteln (); } cout << Spieler2.Name << " ist an der Reihe!"<<endl; { Spielzug2 (); cout<<endl; ZeigeFeld (); GewinnerErmitteln (); } cout << Spieler1.Name << " ist an der Reihe!"<<endl; { Spielzug1 (); cout<<endl; ZeigeFeld (); GewinnerErmitteln (); } } while (GewinnerErmittlung.Gewonnen = true); // Spiel im Falle von einem Gewinner beenden GewinnerErmitteln (); } void Spielzug1 () { int x = 0; int y = 0; do { cout << "x-Position (1-"<< Breite << "): "; cin >> x; } while (x<1 || x>Breite); do { cout << "y-Position (1-"<< Höhe << "): "; cin >> y; } while (y<1 || y>Höhe); if (Spielfeld[x-1][y-1].Besetzt == true || Spielfeld[x-1][y-1].Besetzt2 == true) { cout <<"Das Feld ist schon besetzt. Bitte waehle ein anderes!"<<endl; do { cout << "x-Position (1-"<< Breite << "): "; cin >> x; } while (x<1 || x>Breite); do { cout << "y-Position (1-"<< Höhe << "): "; cin >> y; } while (y<1 || y>Höhe); } else Spielfeld[x-1][y-1].Besetzt = true; } void Spielzug2 () { int x = 0; int y = 0; do { cout << "x-Position (1-"<< Breite << "): "; cin >> x; } while (x<1 || x>Breite); do { cout << "y-Position (1-"<< Höhe << "): "; cin >> y; } while (y<1 || y>Höhe); if (Spielfeld[x-1][y-1].Besetzt2 == true || Spielfeld[x-1][y-1].Besetzt == true) { cout <<"Das Feld ist schon besetzt. Bitte waehle ein anderes!"<<endl; do { cout << "x-Position (1-"<< Breite << "): "; cin >> x; } while (x<1 || x>Breite); do { cout << "y-Position (1-"<< Höhe << "): "; cin >> y; } while (y<1 || y>Höhe); } else Spielfeld[x-1][y-1].Besetzt2 = true; } void ZeigeFeld () { if (Spielfeld[0][0].Besetzt == true) { cout << " | | \n"; cout << " X | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << " | | \n"; } if (Spielfeld[0][0].Besetzt2 == true) { cout << " | | \n"; cout << " O | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << " | | \n"; } if (Spielfeld[1][0].Besetzt == true) { cout << " | | \n"; cout << " | X | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << " | | \n"; } if (Spielfeld[1][0].Besetzt2 == true) { cout << " | | \n"; cout << " | O | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << " | | \n"; } if (Spielfeld[2][0].Besetzt == true) { cout << " | | \n"; cout << " | | X \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << " | | \n"; } if (Spielfeld[2][0].Besetzt2 == true) { cout << " | | \n"; cout << " | | O \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << " | | \n"; } if (Spielfeld[0][1].Besetzt == true) { cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " X | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << " | | \n"; } if (Spielfeld[0][1].Besetzt2 == true) { cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " O | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << " | | \n"; } if (Spielfeld[1][1].Besetzt == true) { cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | X | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << " | | \n"; } if (Spielfeld[1][1].Besetzt2 == true) { cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | O | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << " | | \n"; } if (Spielfeld[1][2].Besetzt == true) { cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | X \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << " | | \n"; } if (Spielfeld[1][2].Besetzt2 == true) { cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | O \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << " | | \n"; } if (Spielfeld[2][0].Besetzt == true) { cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " X | | \n"; cout << " | | \n"; } if (Spielfeld[2][0].Besetzt2 == true) { cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " O | | \n"; cout << " | | \n"; } if (Spielfeld[2][1].Besetzt == true) { cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | X | \n"; cout << " | | \n"; } if (Spielfeld[2][1].Besetzt2 == true) { cout << " | | \n"; cout << " O | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | O | \n"; cout << " | | \n"; } if (Spielfeld[2][2].Besetzt == true) { cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | X \n"; cout << " | | \n"; } if (Spielfeld[2][2].Besetzt2 == true) { cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | \n"; cout << "___|___|___\n"; cout << " | | \n"; cout << " | | O \n"; cout << " | | \n"; } } void GewinnerErmitteln () { if ( Spielfeld[0][0].Besetzt == true && Spielfeld[1][0].Besetzt == true && Spielfeld[2][0].Besetzt == true || Spielfeld[0][1].Besetzt == true && Spielfeld[1][1].Besetzt == true && Spielfeld[2][1].Besetzt == true || Spielfeld[0][2].Besetzt == true && Spielfeld[1][2].Besetzt == true && Spielfeld[2][2].Besetzt == true || Spielfeld[0][0].Besetzt == true && Spielfeld[1][1].Besetzt == true && Spielfeld[2][2].Besetzt == true || Spielfeld[2][0].Besetzt == true && Spielfeld[1][1].Besetzt == true && Spielfeld[0][2].Besetzt == true) { GewinnerErmittlung.Gewonnen = true; cout << Spieler1.Name <<" hat gewonnen! Glueckwunsch!"; main (); } if ( Spielfeld[0][0].Besetzt2 == true && Spielfeld[0][0].Besetzt2 == true && Spielfeld[2][0].Besetzt2 == true || Spielfeld[0][1].Besetzt2 == true && Spielfeld[1][1].Besetzt2 == true && Spielfeld[2][1].Besetzt2 == true || Spielfeld[0][2].Besetzt2 == true && Spielfeld[1][2].Besetzt2 == true && Spielfeld[2][2].Besetzt2 == true || Spielfeld[0][0].Besetzt2 == true && Spielfeld[1][1].Besetzt2 == true && Spielfeld[2][2].Besetzt2 == true || Spielfeld[2][0].Besetzt2 == true && Spielfeld[1][1].Besetzt2 == true && Spielfeld[0][2].Besetzt2 == true) { GewinnerErmittlung.Gewonnen = true; cout << Spieler2.Name <<" hat gewonnen! Glueckwunsch!"; main (); } }
Erstmal 'tschuldigung für die vielen Zeilen;-) So, mein Problem ist jetzt, dass ich wenn ich den ersten Zug mache alles super funktioniert, sobald ich jedoch den zweiten Spielzug mache, der erste gelöscht wird! Da das ein bisschen verwirrend klingt ein kleines Beispiel:
Spieler 1 macht links oben ein Kreuz.
Spieler 2 macht rechts unten einen Kreis.Und schon jetzt ist nur noch der Kreis und nicht mehr das Kreuz da. Ich kann ja wohl unmöglich alle Kombinationsmöglichkeiten in die Funktion ZeigeFeld () packen! Vorher hatte ich es einfacher geregelt, indem ich für leere Felder Punkte genommen hatte, mit einer einfachen Schleife:
cout << endl; for (int y=0; y<Höhe;y++) { for (int x=0; x<Breite;x++) { if (Spielfeld[x][y].Besetzt == true) cout << "X"; if (Spielfeld[x][y].Besetzt2 == true) cout << "O"; else cout << "."; } cout << endl; } }
Das war aber auch net so das wahre... Kann mir jemand sagen wie ich die Darstellung wie bei mir oben hinbekomme, aber so dass sie funktioniert??
Danke im Vorraus
LG
-
Du speicherst im Spielfeld einfach 'X', 'O' oder ' '.
Dann zeichnest du das Spielfeld, indem du das Gerüst ausgibst und an den entsprechenden Stellen den character im Spielfeld ausgibst.
-
Erstmal danke für deine Antwort!
Meine Frage jedoch ist, wie ich die Kreuze und Kreise speichere??;-)
Soweit bin ich im Buch wohl noch nicht^^LG
-
Als Character, die du dann direkt ausgibst?
-
Und wie erstelle ich einen Charackter? Und wie speichere ich das mit dem charackter wenn ich ihn dann mal habe? Sorry ich bin echt ein blutiger Anfänger^^
LG
-
Character? char? Zeichen?
Besorg dir bitte ein vernünftiges Grundlagenbuch, deins scheint nichts zu taugen, globale Variablen, char Arrays, ...
-
Doch, char's kenne ich natürlich, der Autor hatte die nur nie mit dem namen charackter genannt...wenn ich ein char array erstelle, was muss ich dann machen?? Wie speichere ich das spielfeld mit einem char-array? Iwie steh ich grad auf der leitung...
-
Anstatt der Struct mit Besetzt und Besetzt2 speicherst du einfach ein Spielfeld Array von chars, die entweder ' ' (nicht besetzt, 'X' (von Spieler 1 besetzt), oder 'O' (von Spieler 2 besetzt) sind.
Anschließend zeichnest du einfach so in der Art:cout << " | | \n"; cout << " " << Spielfeld[0][0] << " | " << Spielfeld[1][0] << " | " << Spielfeld[2][0] << " \n"; cout << "___|___|___\n"; ...
Aber besorg dir unbedingt ein GUTES C++ Grundlagenbuch, Empfehlungen gibts im C++ Forum.