Fehler mit TicTacToe beim Neustart

CodeCrafterCpp

Erfahrenes Mitglied
Hallo,
Ich hab ein Problem mit mein TicTacToe und zwar wenn ich das Spiel neustarte und alle Feldvariablen wieder auf den Anfangs Wert mache kommt wenn ich ein Feld auswähle der alte
Spielstand wo aber schon einer Gewonnen hat was nun?


Code:
#include <iostream>

using namespace std;



int Render(char f01, char f02, char f03, char f04, char f05, char f06, char f07, char f08, char f09)
{

	cout << f01 << "|"<< f02<< "|"<< f03<< endl;
	cout << "-" << "+" << "-" << "+" << "-" << endl;
	cout << f04 << "|"<< f05<< "|"<< f06<< endl;
	cout << "-" << "+" << "-" << "+" << "-" << endl;
	cout << f07 << "|"<< f08<<"|"<< f09<< endl;
	return 0;
}

int main()
{
	//Variabeln 
	bool game_Quit;
	char auswahl = 0;
	int player_turn;
	char zeichen;
	int gewinn = 0;
	char neu;
	bool neu_frage = true;
	//Feld-Vari
	char f01 = '1';
	char f02 = '2';
	char f03 = '3';
	char f04 = '4';
	char f05 = '5';
	char f06 = '6';
	char f07 = '7';
	char f08 = '8';
	char f09 = '9';

	//start
	game_Quit = false;
	player_turn = 1;


	Render(f01,f02,f03,f04,f05,f06,f07,f08,f09);



	while(!game_Quit)
	{

		if(player_turn == 1)
		{
			zeichen = 'o';
		}
		if(player_turn == 2)
		{
			zeichen = 'x';
		}


		if(f01 == f02 && f02== f03){if(f01 == 'o'){gewinn = 1;}if(f01 == 'x'){gewinn = 2;}}
		if(f04 == f05 && f05== f06){if(f04 == 'o'){gewinn = 1;}if(f04 == 'x'){gewinn = 2;}}
		if(f07 == f08 && f08== f09){if(f07 == 'o'){gewinn = 1;}if(f07 == 'x'){gewinn = 2;}}

		if(f01 == f04 && f04== f07){if(f01 == 'o'){gewinn = 1;}if(f01 == 'x'){gewinn = 2;}}
		if(f02 == f05 && f05== f08){if(f02 == 'o'){gewinn = 1;}if(f02 == 'x'){gewinn = 2;}}
		if(f03 == f06 && f06== f09){if(f03 == 'o'){gewinn = 1;}if(f03 == 'x'){gewinn = 2;}}

		if(f01 == f05 && f05== f09){if(f01 == 'o'){gewinn = 1;}if(f01 == 'x'){gewinn = 2;}}
		if(f03 == f05 && f05== f07){if(f03 == 'o'){gewinn = 1;}if(f03 == 'x'){gewinn = 2;}}



		if(gewinn == 1)
		{
			cout << "Player 1 hat gewonnen" << endl;
		}
		else if(gewinn == 2)
		{
			cout << "Player 2 hat gewonnen" << endl;
		}
		else if(gewinn == 3)
		{
			cout << "Unentschieden" << endl;
		}

		if(gewinn > 0)
		{
			while(neu_frage)
			{
				cout << "Neues Spiel? Y/N" << endl;
				cin >> neu;
				if(neu == 'Y')
					{
						system("cls");
						player_turn = 1;
						zeichen = 'o';
						char f01 = '1';
						char f02 = '2';
						char f03 = '3';
						char f04 = '4';
						char f05 = '5';
						char f06 = '6';
						char f07 = '7';
						char f08 = '8';
						char f09 = '9';
						Render(f01,f02,f03,f04,f05,f06,f07,f08,f09);
						neu_frage = false;
						cout << " Neues Spiel wird gestartet";

					}
				else if(neu == 'N')
					{
						system("cls");
						neu_frage = false;
						game_Quit = true;
					}
				else
					{
						cout << "Gebe Y oder N ein" << endl;

					}
			}
		}





		cout << "Spieler "<< player_turn <<" ist dran. -Bitte Feld auswählen: ";
		cin >> auswahl;
	


		switch(auswahl)
		{
			case '1':
				if(f01 == '1')
				{
					f01 = zeichen;
				}
				else
				{
					cout << "Spieler " << player_turn<<" wähle ein anderes Feld! Diese ist besetzt" << endl;
							if(player_turn == 1)
						{
							player_turn = 2;
						}
						else if(player_turn == 2)
						{
							player_turn = 1;
						}
								}
				break;
			case '2':
				if(f02 == '2') 
				{
					f02 = zeichen;
				}
				else
				{
					cout << "Spieler " << player_turn<<" wähle ein anderes Feld! Diese ist besetzt" << endl;
							if(player_turn == 1)
						{
							player_turn = 2;
						}
						else if(player_turn == 2)
						{
							player_turn = 1;
						}
								}
				break;
			case '3':
				if(f03 == '3')
				{
					f03 = zeichen;
				}
				else
				{
					cout << "Spieler " << player_turn<<" wähle ein anderes Feld! Diese ist besetzt" << endl;
							if(player_turn == 1)
						{
							player_turn = 2;
						}
						else if(player_turn == 2)
						{
							player_turn = 1;
						}
								}
				break;
			case '4':
				if(f04 == '4')
				{	
					f04 = zeichen;
				}
				else
				{
					cout << "Spieler " << player_turn<<" wähle ein anderes Feld! Diese ist besetzt" << endl;
							if(player_turn == 1)
							{
								player_turn = 2;
							}
							else if(player_turn == 2)
							{
								player_turn = 1;
							}
									}
				break;
			case '5':
				if(f05 == '5')
				{
					f05 = zeichen;
				}
				else
				{
					cout << "Spieler " << player_turn<<" wähle ein anderes Feld! Diese ist besetzt" << endl;
							if(player_turn == 1)
										{
											player_turn = 2;
										}
										else if(player_turn == 2)
										{
											player_turn = 1;
										}
												}
				break;
			case '6':
				if(f06 == '6') 
				{
					f06 = zeichen;
				}
				else
				{
					cout << "Spieler " << player_turn<<" wähle ein anderes Feld! Diese ist besetzt" << endl;
							if(player_turn == 1)
						{
							player_turn = 2;
						}
						else if(player_turn == 2)
						{
							player_turn = 1;
						}
								}
				break;
			case '7':
				if(f07 == '7')
				{
					f07 = zeichen;
				}
				else
				{
					cout << "Spieler " << player_turn<<" wähle ein anderes Feld! Diese ist besetzt" << endl;
							if(player_turn == 1)
						{
							player_turn = 2;
						}
						else if(player_turn == 2)
						{
							player_turn = 1;
						}
								}
				break;
			case '8':
				if(f08 == '8') 
				{
					f08 = zeichen;
				}
				else
				{
					cout << "Spieler " << player_turn<<" wähle ein anderes Feld! Diese ist besetzt" << endl;
							if(player_turn == 1)
						{
							player_turn = 2;
						}
						else if(player_turn == 2)
						{
							player_turn = 1;
						}
								}
				break;
			case '9':
				if(f09 == '9')
				{
					f09 = zeichen;
				}

				break;
		}


		Render(f01,f02,f03,f04,f05,f06,f07,f08,f09);

		if(player_turn == 1)
		{
			player_turn = 2;
		}
		else if(player_turn == 2)
		{
			player_turn = 1;
		}
	}


	cin.get();
	cin.get();
}
 

ibafluss

Erfahrenes Mitglied
1. gewinn bekommt nie den Wert 3 für unentschieden!

2. Der Fehler liegt am neustart:

Code:
if(neu == 'Y')
                    {
                        system("cls");
                        player_turn = 1;
                        zeichen = 'o';
                        char f01 = '1';
                        char f02 = '2';
                        char f03 = '3';
                        char f04 = '4';
                        char f05 = '5';
                        char f06 = '6';
                        char f07 = '7';
                        char f08 = '8';
                        char f09 = '9';
                        Render(f01,f02,f03,f04,f05,f06,f07,f08,f09);
                        neu_frage = false;
                        cout << " Neues Spiel wird gestartet";
 
                    }

Du setzt die bestehenden Variablen nicht auf 1, 2,... sondern erstellst neue Variablen! Weg mit dem char, dann funktionierts.
 

CodeCrafterCpp

Erfahrenes Mitglied
hää Wieso soll das mit Char nicht gehen und warum soll ich neue Erstellen dann muss ich ja alles umschrieben und das mit den Unentschieden wollte ich ja machen aber dann kam halt der Fehler...oder lieg ich da falsch?
 
Zuletzt bearbeitet:

Thomasio

Erfahrenes Mitglied
Wundert mich, dass der Compiler da nicht meckert.
Normalerweise müsste da 9x hintereinander kommen

Error, redefinition of char f0x in line 98 ... 106

Im main() werden die Variablen in Zeile 29 - 37 definiert und initialisiert.
Du kannst sie zwar neu initialisieren, aber nicht nochmal definieren, und genau das tust du in Zeile 98 - 106.

Anders ist das in der Render() Funktion.
Da die Variablen aus main() hier nicht bekannt sind, musst du sie hier tatsächlich neu definieren.
 

CodeCrafterCpp

Erfahrenes Mitglied
Ok das macht alles sinn aber gibt es nicht noch andere möglichkeiten da es jetzt sehr Kompliziert wird die neuem variablen wieder auszugeseben
 

ibafluss

Erfahrenes Mitglied
Nein, im Moment erstellst du ja neue Variablen. Mit dem char wird eine neue Variable erstellt. Weg mit dem char und die normalen Variablen werden benutzt.

Lg
 

Thomasio

Erfahrenes Mitglied
Wie ibafluss gleich zu Anfang gesagt hat, statt Redefinition nur neu initialisieren.
Sprich lass beim Zurücksetzen der Werte das char weg, dann werden keine neuen Variablen (re-)definiert sondern die Vorhandenen neu initialisiert.