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.

    1. Du hast einiges Semikolon vergessen

    2. "maxround" gibt es nicht

    3. "Menu" zweimal definiert

    4. Ein "else if" ohne Kondition

    5. Ein "else" mit Kondition

    6. Bei einer Ausgabe fehlt ein "<<"

    So jetzt zu den Logikfehlern:

    1. Es wird nie ein "O" Ausgegeben

    2. "while (maxround == 9);" macht was anderes als du denkst (mal davon abgesehen dass es "maxround" gar nicht gibt)

    3. "maximale Rundenanzahl; Variabel wird jede Runde erhöht." - klingt logisch

    4. Die Ausgabe sieht sehr zermatscht aus

    5. 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 wie

    if(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. 🙄


Anmelden zum Antworten