String Daten werden "vergessen"?



  • Hallo, Ich versuche mich jetzt an einem TicTacToe-Spiel, jedoch gibts da ein Problem.
    Wenn Ich die Zweite Zahl angebe, also beim Zweiten Cin sollten eigentlich bei beiden Stellen ein X sein funzt jedoch nicht wie gewollt, es wird immer überschrieben...
    Probiert es selber aus um es schneller zu verstehen:

    (Wundert euch nicht, das Programm ist nicht fertig und endet nach der zweiten Eingabe.)

    #include <iostream>
    #include <conio.h>
    #include <stdlib.h>
    #include <string>
    
    using namespace std;
    
    int eingabe;
    int proof; //noch unnötig, wird später zum überprüfen genutzt
    
    //Variablen werden nach einer Auswahl auf 1 gestetzt um doppelt ausgewählte //Felder zu vermeiden.
    int aa;
    int ab;
    int ac;
    int ad;
    int ae;
    int af;
    int ag;
    int ah;
    int ai;
    
    //Das Spielfeld:
    
    string a = "___I";  //Feld 1
    string b = "___I";   //Feld 2
    string c = "___\r\n";  //Feld 3
    string d = "___I";   //Feld 4 usw..
    string e = "___I";
    string f = "___\r\n";
    string g = "___I";
    string h = "___I";
    string i = "___";
    
    int main()
    {
    	cout <<"TicTacToe" <<endl;
    	cout << a + b + c + d + e + f + g + h + i;
        cout << endl;
    	cout <<"Spieler 1: Machen Sie einen Zug." <<endl;
    	cout <<"Geben Sie dafür eine Zahl an.(1-9)" <<endl;
    	marke1:
    	cin >> eingabe;
    	if(eingabe < 1 ){cout <<"Eingabe Ungültig. Geben Sie eine Zahl von 1-9 an!" <<endl;goto marke1;}
    	if(eingabe > 9 ){cout <<"Eingabe Ungültig. Geben Sie eine Zahl von 1-9 an!" <<endl;goto marke1;}
    
    	if(eingabe == 1){if(aa == 1){cout <<"Eingabe Ungültig."<< endl;goto marke1;}system("cls");string a = "_X_I";cout <<"TicTacToe" <<endl;cout << a + b + c + d + e + f + g + h + i;cout << endl;aa = 1;}
    	if(eingabe == 2){if(ab == 1){cout <<"Eingabe Ungültig."<< endl;goto marke1;}system("cls");string b = "_X_I";cout <<"TicTacToe" <<endl;cout << a + b + c + d + e + f + g + h + i;cout << endl;ab = 1;}
    	if(eingabe == 3){if(ac == 1){cout <<"Eingabe Ungültig."<< endl;goto marke1;}system("cls");string c = "_X_\r\n";cout <<"TicTacToe" <<endl;cout << a + b + c + d + e + f + g + h + i;cout << endl;ac = 1;}
    	if(eingabe == 4){if(ad == 1){cout <<"Eingabe Ungültig."<< endl;goto marke1;}system("cls");string d = "_X_I";cout <<"TicTacToe" <<endl;cout << a + b + c + d + e + f + g + h + i;cout << endl;ad = 1;}
    	if(eingabe == 5){if(ae == 1){cout <<"Eingabe Ungültig."<< endl;goto marke1;}system("cls");string e = "_X_I";cout <<"TicTacToe" <<endl;cout << a + b + c + d + e + f + g + h + i;cout << endl;ae = 1;}
    	if(eingabe == 6){if(af == 1){cout <<"Eingabe Ungültig."<< endl;goto marke1;}system("cls");string f = "_X_\r\n";cout <<"TicTacToe" <<endl;cout << a + b + c + d + e + f + g + h + i;cout << endl;af = 1;}
    	if(eingabe == 7){if(ag == 1){cout <<"Eingabe Ungültig."<< endl;goto marke1;}system("cls");string g = "_X_I";cout <<"TicTacToe" <<endl;cout << a + b + c + d + e + f + g + h + i;cout << endl;ag = 1;}
    	if(eingabe == 8){if(ah == 1){cout <<"Eingabe Ungültig."<< endl;goto marke1;}system("cls");string h = "_X_I";cout <<"TicTacToe" <<endl;cout << a + b + c + d + e + f + g + h + i;cout << endl;ah = 1;}
    	if(eingabe == 9){if(ai == 1){cout <<"Eingabe Ungültig."<< endl;goto marke1;}system("cls");string i = "_X_";cout <<"TicTacToe" <<endl;cout << a + b + c + d + e + f + g + h + i;cout << endl;ai = 1;}
    
    	eingabe = 0;
    	cout <<"Spieler 2: Machen Sie einen Zug." <<endl;
    	cout <<"Geben Sie dafür eine Zahl an.(1-9)" <<endl;
    	marke2:
    	cin >> eingabe;
    
    	if(eingabe < 1 ){cout <<"Eingabe Ungültig. Geben Sie eine Zahl von 1-9 an!" <<endl;goto marke2;}
    	if(eingabe > 9 ){cout <<"Eingabe Ungültig. Geben Sie eine Zahl von 1-9 an!" <<endl;goto marke2;}
    
    	if(eingabe == 1){if(aa == 1){cout <<"Eingabe Ungültig."<< endl;goto marke2;}system("cls");string a = "_X_I";cout <<"TicTacToe" <<endl;cout << a + b + c + d + e + f + g + h + i;cout << endl;aa = 1;}
    	if(eingabe == 2){if(ab == 1){cout <<"Eingabe Ungültig."<< endl;goto marke2;}system("cls");string b = "_X_I";cout <<"TicTacToe" <<endl;cout << a + b + c + d + e + f + g + h + i;cout << endl;ab = 1;}
    	if(eingabe == 3){if(ac == 1){cout <<"Eingabe Ungültig."<< endl;goto marke2;}system("cls");string c = "_X_\r\n";cout <<"TicTacToe" <<endl;cout << a + b + c + d + e + f + g + h + i;cout << endl;ac = 1;}
    	if(eingabe == 4){if(ad == 1){cout <<"Eingabe Ungültig."<< endl;goto marke2;}system("cls");string d = "_X_I";cout <<"TicTacToe" <<endl;cout << a + b + c + d + e + f + g + h + i;cout << endl;ad = 1;}
    	if(eingabe == 5){if(ae == 1){cout <<"Eingabe Ungültig."<< endl;goto marke2;}system("cls");string e = "_X_I";cout <<"TicTacToe" <<endl;cout << a + b + c + d + e + f + g + h + i;cout << endl;ae = 1;}
    	if(eingabe == 6){if(af == 1){cout <<"Eingabe Ungültig."<< endl;goto marke2;}system("cls");string f = "_X_\r\n";cout <<"TicTacToe" <<endl;cout << a + b + c + d + e + f + g + h + i;cout << endl;af = 1;}
    	if(eingabe == 7){if(ag == 1){cout <<"Eingabe Ungültig."<< endl;goto marke2;}system("cls");string g = "_X_I";cout <<"TicTacToe" <<endl;cout << a + b + c + d + e + f + g + h + i;cout << endl;ag = 1;}
    	if(eingabe == 8){if(ah == 1){cout <<"Eingabe Ungültig."<< endl;goto marke2;}system("cls");string h = "_X_I";cout <<"TicTacToe" <<endl;cout << a + b + c + d + e + f + g + h + i;cout << endl;ah = 1;}
    	if(eingabe == 9){if(ai == 1){cout <<"Eingabe Ungültig."<< endl;goto marke2;}system("cls");string i = "_X_";cout <<"TicTacToe" <<endl;cout << a + b + c + d + e + f + g + h + i;cout << endl;ai = 1;}
    
    	eingabe = 0;
    //Später wird das Programm an dieser Stelle fortgeführt.
    	getch();
    	return 0;
    }
    

    Ich hoffe ihr könnt mir sagen was ich falsch mache, jedenfalls gab es beim Kompilieren keine Fehler.

    LG



  • Zum Anfang erstmal, ganz grausiger Spagetticode der sich wegen der schlechten Unterteilung also Absätzen und zeilenumbrüche grausig lesen lässt. Dann zu deinem goto, das ist ein No Go, Vergiss das bitte ganz schnell das macht man nicht. Aber da du sicher erst Anfängst, wirst du das sicher auch noch selber raus finden.

    Zu deinem Code, wo ist der Fehler? Logisch dabei das nach jeder Eingabe du alles neu Zeichnest, aber nur die aktuelle eingabe gezeichnet wird, du musst die schon die früheren Eingaben irgendwie merken. Also ich würde mir ein Array mit 9 Plätzen anlegen und darin die Eingaben Speichern. dann kannst du im Array die aktuelle Eingabe Speichern und dann komplett alles Zeichnen.

    So hab ich das mal bissel zusammen gepackt und extra keinen kommentar dazu gepackt du sollst ja auch bissel was lernen, und fertig is das auch noch nicht, aber fast.

    int main()
    {
    	int eingabe;
    
        cout <<"TicTacToe" <<endl;
        cout << "___|___|___|\r\n___|___|___|\r\n___|___|___|";
        cout << endl;
    
    	int Feld[9] ={0};
    
    	for(int a = 0;a < 9;)
    	{
    		if((a % 2) == 0)
    			cout <<"Spieler 1: Machen Sie einen Zug." <<endl;
    		else
    			cout <<"Spieler 2: Machen Sie einen Zug." <<endl;
    
    		cout <<"Geben Sie dafür eine Zahl an.(1-9)" <<endl;
    		eingabe = 0;
    		cin >> eingabe;
    
    		if(eingabe < 0 || eingabe < 9)
    		{
    			Feld[eingabe-1] = 1;
    
    			system("cls");
    
    			string tmp;
    			cout <<"TicTacToe" <<endl;
    			for(int X = 0;X < 9;X++)
    			{
    				if(Feld[X] == 1)
    					tmp += "_X_I";
    				else
    					tmp += "___I";
    				if(X == 2 || X == 5)
    					tmp += "\r\n";
    
    			}
    			cout << tmp << endl;
    			a++;
    		}
    		else
    			cout <<"Eingabe Ungültig. Geben Sie eine Zahl von 1-9 an!" <<endl;
    	} 
    //Später wird das Programm an dieser Stelle fortgeführt.
        getch();
        return 0;
    }
    

    So wie du siehst ganz ohne goto und der läuft schon die ganzen 9 mal durch und wechselt auch die spieler, wenn du die Werte vom Array Feld noch anpasst das du erkennen kannst ob das spieler 1 oder 2 ist und wenn du noch schaust wann alle felder besetzt sind dann is die sache schon fertig 😉



  • Dein Code ist wirklich besser und gut durchdacht, keine Frage!
    Bin eben wirklich noch ein Anfänger :p
    Nur verstehe ich meinen Fehler nicht. Ich habe doch nach einer Eingabe den String geändert. Und wenn ich dann noch einen anderen String ändere und dann alles Ausgebe, sollte es doch normal angezeigt werden. 😕



  • Combum schrieb:

    Nur verstehe ich meinen Fehler nicht. Ich habe doch nach einer Eingabe den String geändert.

    Nein, du hast eine neue lokale Variable mit dem selben Namen angelegt. Damit ist die "Änderung" auch nur lokal sichtbar. Sobald du außerhalb darauf zugreifst, hast du wieder den ursprünglichen Wert.



  • Und wie würde ich den String ändern?



  • Das siehst du doch an meinem Beispiel Code, ich Merke mir in dem Interarray jeweils was gesetzt ist und was nicht und erstelle nach jeder Eingabe den String Komplett neu und gebe auch den ganzen String nach dem erstellen aus, nur dadurch kannst du auch sicherstellen das die Ausgabe auch stimmt.

    Veranschiede dich von der Vorstellunbg das du was in Textform wie bei dir Speichern/Merken kannst, wenn dann nutze Binäre Variablen, weil diese kannst du einfacher handhaben und auch Abfragen.

    int main()
    {
        int eingabe;
    
        cout <<"TicTacToe" <<endl;
        cout << "___|___|___|\r\n___|___|___|\r\n___|___|___|";
        cout << endl;
        // Hier erstell ich ein Int Array in dem ich mir das gesetzte Feld merk, Mann könnte das später noch dafür nutzen um zu schaun ob das feld schon besetzt ist
        int Feld[9] ={0};
    
        for(int a = 0;a < 9;)
        {
            //abfrage ob aktuell die zahl in a gerade oder ungerade ist
            if((a % 2) == 0)
                cout <<"Spieler 1: Machen Sie einen Zug." <<endl;
            else
                cout <<"Spieler 2: Machen Sie einen Zug." <<endl;
    
            cout <<"Geben Sie dafür eine Zahl an.(1-9)" <<endl;
            eingabe = 0;
            cin >> eingabe;
    
            //die abfrager des eingabebereichs hab gerade festgestellt das es 1 und 10 sein müsste
            if(eingabe < 0 || eingabe < 9)
            {
                //die eingegebene Zahl im Array speichern (hier könnte man dann noch für den 2. Spieler ne 2 setzen
                Feld[eingabe-1] = 1;
    
                system("cls");
                //String zusammen basteln
                string tmp;
                cout <<"TicTacToe" <<endl;
                for(int X = 0;X < 9;X++)
                {
                    if(Feld[X] == 1)
                        tmp += "_X_I";
                    else
                        tmp += "___I";
                    if(X == 2 || X == 5)
                        tmp += "\r\n";
    
                }
                //String ausgeben
                cout << tmp << endl;
                //Counter erhöhen
                a++;
            }
            else
                cout <<"Eingabe Ungültig. Geben Sie eine Zahl von 1-9 an!" <<endl;
        }
    //Später wird das Programm an dieser Stelle fortgeführt.
        getch();
        return 0;
    }
    

    So hab ich dir noch mal paar Kommentare rein gebastelt, jetzt sollte mein vorgeben klar sein, noch paar anpassungen und dein Spiel is auch schon fast fertig 😉


Anmelden zum Antworten