TicTacToe Fehler
-
Hallo ich bin neu hier und ich programmiere mein erstes Game. TicTacToe. Ich bin jetzt nach 4 Tagen arbeit eigentlich fertig jedock kommt immer ein Fehler wenn ich es starte. Der Compiler findet keine Fehler und ich auch nicht. Wenn ich es starte erscheint das Menu im programm und dann wenn ich "s" für start drücke erscheint im TicTacToe Feld einige merkwürdige Smileys oder so, und nichts funktioniert. Hier ist der Code:
//Tictactoe Programm //Spieleprogramm //geschrieben in C++ //by Rafael Sonderegger #include <iostream> using namespace std; int main() { //Variablen int Auswahl; int player_turn; int max_round; int Menu; //Feldvariablen char fd[10] = {'0','1','2','3','4','5','6','7','8','9'}; //frühere Variablen, wird gelöscht falls Array nicht funktioniert //char Fd01 = '1'; //char Fd02 = '2'; //char Fd03 = '3'; //char Fd04 = '4'; //char Fd05 = '5'; //char Fd06 = '6'; //char Fd07 = '7'; //char Fd08 = '7'; //char Fd09 = '8'; //Menuvariabeln char Menu; //Menuvariable für HELP und START Menu = 1; //Begrüssung cout << "Willkommen zu meinem Spiel TICTACTOE" << endl; cout << "____________________________________" cout << "\n\n\n\n"; //Menu cout << "Help (h)" << endl; //Menuausgabe cout << "Start (s)" << endl; //Menuausgabe cout << "\n\n"; cout << "Waehle bitte eine Option aus:"; cin >> Menu; if (Menu == 'h') { //Hilfefeld cout << "\n\n" << endl; cout << "Sobald man das Spiel startet erscheint ein Feld mit Zahlen." << endl; cout << "Wähle eines der Felder aus und gebe die entsprechende Zahl ein." << endl; cout << "Anstelle der Zahl erscheint nun ein X oder ein O. Versuche" << endl; cout << "3 gleiche Zahlen in eine Reihe zu bekommen und du hast gewonnen." << endl; cout << "\n" << endl; cout << "Dieses Spiel kann nur zu zweit gespielt werden. Man muss sich" << endl; cout << "immer nach einer Runde mit seinem Mitspieler abwechseln." << endl; } else (Menu == 's') { //Initsialisierung //GameOver = false; //Variabel für GameOver; Wird warscheinlich nicht mehr gebraucht. player_turn = 1; //welcher Spieler ist dran max_round = 1; //maximale Rundenanzahl; Variabel wird jede Runde erhöht. //Spielanfang //Name des Spieler //cin >> "Bitte Name des ersten Spielers eingeben:" >> Player_1 >> endl; //cin >> "Bitte Name des zweiten Spielers eingeben:" >> Player_2 >> endl; //Wird für Verbesserungen aufbewahrt //Schlaufe do { //Aktuelle Runde cout << "Runde:" << max_round << "." << endl; cout << "\n\n" //Feld anzeigen cout << fd[1] << "|" << fd[2] << "|" << fd[3] << endl; cout << "-" << "|" << "+" << "-" << "+" << endl; cout << fd[4] << "|" << fd[5] << "|" << fd[6] << endl; cout << "-" << "|" << "+" << "-" << "+" << endl; cout << fd[7] << "|" << fd[8] << "|" << fd[8] << endl; cout << "\n\n\n\n\n" endl; //Spielaufforderung cout << "Spieler " << player_turn << " waehlt bitte ein Feld aus: " << endl; cin >> Auswahl; //Feldauswahl if (fd[Auswahl]) { fd[Auswahl] = 'X' } //Sicherung das man Wert >9 eingibt. if (Auswahl <=9) { //Spielerwechsel if (player_turn == 1) { player_turn = 2; } else if (player_turn == 2) { player_turn = 1; } cout << "\n\n\n\n\n" << endl; maxround++; } else if { cout << "\n\n\n"; cout << "Nicht schummeln!!! So bloed bin ich nicht. Versuchs noch mal"; cout << "\n\n\n"; } //3 gleiche Zeichen in 1. Reihe = GameOver if (fd[1] == 'X' && fd[2] == 'X' && fd[3] == 'X') { max_round = 9; } else if(fd[1] == 'O' && fd[1] == 'O' && fd[1] == 'O') { max_round = 9; } //3 gleiche Zeichen in 2. Reihe = GameOver if (fd[4] == 'X' && fd[5] == 'X' && fd[6] == 'X') { max_round = 9; } else if(fd[4] == 'O' && fd[5] == 'O' && fd[6] == 'O') { max_round = 9; } //3 gleiche Zeichen in 3. Reihe = GameOver if (fd[7] == 'X' && fd[8] == 'X' && fd[9] == 'X') { max_round = 9; } else if(fd[7] == 'O' && fd[8] == 'O' && fd[9] == 'O') { max_round = 9; } /////////////////////////////////////////////////////// //3 gleiche Zeichen in 1. Spalte = GameOver if (fd[1] == 'X' && fd[4] == 'X' && fd[7] == 'X') { max_round = 9; } else if (fd[1] == 'O' && fd[4] == 'O' && fd[7] == 'O') { max_round = 9; } //3 gleiche Zeichen in 2. Spalte = GameOver if (fd[2] == 'X' && fd[5] == 'X' && fd[8] == 'X') { max_round = 9; } else if (fd[2] == 'O' && fd[5] == 'O' && fd[8] == 'O') { max_round = 9; } //3 gleiche Zeichen in 3. Spalte = GameOver if (fd[3] == 'X' && fd[6] == 'X' && fd[9] == 'X') { max_round = 9; } else if (fd[3] == 'O' && fd[6] == 'O' && fd[9] == 'O') { max_round = 9; } //////////////////////////////////////////////////////////// //3 gleiche Zeichen in 1. Diagonale = GameOver if (fd[1] == 'X' && fd[5] == 'X' && fd[9] == 'X') { max_round = 9; } else if (fd[1] == 'O' && fd[5] == 'O' && fd[9] == 'O') { max_round = 9; } //3 gleiche Zeichen in 2. Diagonale = GameOver if (fd[3] == 'X' && fd[5] == 'X' && fd[7] == 'X') { max_round = 9; } else if (fd[3] == 'O' && fd[5] == 'O' && fd[7] == 'O') { max_round = 9; } ////////////////////////////////////////////////////////////// //Angabe bis wie viele Runden ein Spiel dauert }while (maxround == 9); //Endsatz und Wiederholungsfrage cout << "Das wars." } //Ende return 0; }
ich hoffe ihr könnt mir helfen
-
Den Compiler möchte ich sehen der diesen fehlerhaften Code akzeptiert.
-
Du hast einiges Semikolon vergessen
-
"maxround" gibt es nicht
-
"Menu" zweimal definiert
-
Ein "else if" ohne Kondition
-
Ein "else" mit Kondition
-
Bei einer Ausgabe fehlt ein "<<"
So jetzt zu den Logikfehlern:
-
Es wird nie ein "O" Ausgegeben
-
"while (maxround == 9);" macht was anderes als du denkst (mal davon abgesehen dass es "maxround" gar nicht gibt)
-
"maximale Rundenanzahl; Variabel wird jede Runde erhöht." - klingt logisch
-
Die Ausgabe sieht sehr zermatscht aus
-
Crash bei falscher Eingabe
-
-
@DarkShadow44 danke für deine Antwort. Ich habe die meisten Fehler korrigiert habe aber noch fragen:
1. "o"Wird nie ausgegeben! Warum?
2. Was ist mein Fehler im while?
3. und wo ist das else if ohne Kondition?Übrigens der Compiler stammt von MicrosoftVisual Studio. Editor und Compiler in einem. Der editor ist ehrlich gesagt etwas schlampig gemacht aber er hat einen Compiler
Und vom Programm im Gesamt, was haltest ihr davon?
-
sry für doppelpost aber 1. habe ich jetzt selber gemerkt. Habs bereits korrigiert.
-
also habs kurz angeschaut is aber echt nicht schön der code ^^
zu deinen Punkten:
1.//Feldauswahl if (fd[Auswahl]) { fd[Auswahl] = 'X' }
des macht ihr keinen sinn oder ?
solltest wahrscheinlich als erstes überprüfen ob "Anzahl"<9 ist
und dann sowas wieif(spieler == 1) fd[Anzahl] = 'X' else fd[Anzahl] = 'O'
2. while (maxround == 9) meintest wahrscheinlich while (maxround < 9)
3. Zeile 131
-
rafisondi schrieb:
Editor und Compiler in einem. Der editor ist ehrlich gesagt etwas schlampig gemacht
Naja...
rafisondi schrieb:
Und vom Programm im Gesamt, was haltest ihr davon?
Geht so, schreib dir doch mal ein paar Funktionen um das ganze etwas übersichtlicher zu gestalten, z.B.
void FeldAnzeigen(const char* fd) { //Feld anzeigen cout << fd[1] << "|" << fd[2] << "|" << fd[3] << endl; cout << "-" << "|" << "+" << "-" << "+" << endl; cout << fd[4] << "|" << fd[5] << "|" << fd[6] << endl; cout << "-" << "|" << "+" << "-" << "+" << endl; cout << fd[7] << "|" << fd[8] << "|" << fd[8] << endl; }
oder
// Ueberprüft ob ein Spieler gewonnen hat, gibt 'O' oder 'X' zurück wenn einer gewonnen hat, sonst ' '. char CheckWin(const char* fd) { // hier deine if Kaskade }
als nächstes kannst du dein CheckWin optimieren und z.B. den Reihentest in eine for Schleife packen
for (int i = 1; i <= 7; i+=3) { //3 gleiche Zeichen in einer Reihe = GameOver if (fd[i+0] == 'X' && fd[i+1] == 'X' && fd[i+2] == 'X') { max_round = 9; } }
dann kannst du die Prüfung auf X oder O in die gleiche Schleife packen
for (int i = 1; i <= 7; i+=3) { //3 gleiche Zeichen in einer Reihe = GameOver if (fd[i+0] == fd[i+1] && fd[i+] == fd[i+2]) { cout << fd[i+0] << " wins" << endl; max_round = 9; } }
usw.
Gruss
Jochen
-
Danke Jochen, ich werde versuchen deine Codes einzubauen, aber ich bin noch anfänger und es ist etwas komplieziert. ich habe das Thema mit den Konstanten noch nicht ganz verstanden. (Ich lerne selbständig, ohne Schule oder so, nur mit nem Buch). Aber danke
-
rafisondi schrieb:
(Ich lerne selbständig, ohne Schule oder so, nur mit nem Buch).
Das haben hier die meisten.