Fehler beim Setzten

CodeCrafterCpp

Erfahrenes Mitglied
Mein Problem ist das wenn ich das Programm(TicTacToe) starte und den Mehrspieler Modus wähle und dann das Feld ein aussuche das das Feld ein nicht auf x gesetzt wird sonder Falsch Eingabe gemeldet wird. Um es besser zu verstehen eben selber Compilieren.


Ich hab mit bei der Setzen Funktion ganz schön verhaspelt und wollte fragen wie ihr das gemacht hättet.






Code:
#include <iostream>
#include <conio.h>
#include <Windows.h>

using namespace std;

void Render(char *f);
char Setzen(char eingabe, char *f, bool player_turn);

int main()
{
	//********************************************//
	//Variablen
	//********************************************//
	bool player_turn = true;
	int gewinn = 0;
	char ki;
	char eingabe;
	char zeichen;
	bool exit = false;
	char f[9];
	for(int i = 0; i < 9; i++)
	{
		f[i] = i+49;
	}

	cout << "TicTacToe" << endl;
	cout << "Waehle eine Spiel Modus aus:" << endl
		 << "0: mehr Spieler Modus" << endl
		 << "1: gegen Computer einfach" << endl
		 << "2: gegen Computer schwerer als einfach" << endl
		 << "3: gegen Computer mittel" << endl
		 << "4: gegen Computer leichter als schwer" << endl
		 << "5: gegen Computer schwer" << endl;
	ki = getch();


	//********************************************//
	//Game_Loop
	//********************************************//

		
		if(ki == '0')
		{
			while(!exit)
			{
				system("cls");
				Render(f);
				if(player_turn == true)
				{
					cout << "Spieler 1 ist dran. Bitte waehle ein Feld: ";
					zeichen = 'x';
				}
				if(player_turn == false)
				{
					cout << "Spieler 2 ist dran. Bitte waehle ein Feld: ";
					zeichen = 'o';
				}
				eingabe = getch();
				Setzen(eingabe, f, player_turn);


			}
		}
		else if(ki == '1')
		{
			while(!exit)
			{

			}
		}
		else if(ki == '2')
		{
			while(!exit)
			{

			}
		}
		else if(ki == '3')
		{
			while(!exit)
			{

			}
		}
		else if(ki == '4')
		{
			while(!exit)
			{

			}
		}
		else if(ki == '5')
		{
			while(!exit)
			{

			}
		}



	return 0;
}



void Render(char *f)
{
	cout << f[0] << "|"<< f[1]<< "|"<< f[2]<< endl;
	cout << "-" << "+" << "-" << "+" << "-" << endl;
	cout << f[3] << "|"<< f[4]<< "|"<< f[5]<< endl;
	cout << "-" << "+" << "-" << "+" << "-" << endl;
	cout << f[6] << "|"<< f[7]<<"|"<< f[8]<< endl;
}


char Setzen(char eingabe,char *f, bool player_turn)
{
	if(eingabe == f[eingabe])
	{
		if(player_turn == true)f[eingabe] = 'x';
		if(player_turn == false)f[eingabe] = 'o'; 

	}
	else
	{
		while(true)
		{
			system("cls");
			Render(f);
			cout << "Bitte wähle ein anderes Feld da diese besetzt ist: ";
			eingabe = getch();
			if(eingabe >= 49 && eingabe <= 57)
			{
				if(f[eingabe] == eingabe)
				{
					if(player_turn == true)f[eingabe] = 'x';
					if(player_turn == false)f[eingabe] = 'o'; 
					break;
				}
			}
			else
			{
				system("cls");
				Render(f);
				cout << "Falsche eingabe! Bitte wähle ein Feld von 1-9: ";
				eingabe = getch();
			}
		}
	}
	return eingabe, *f;
}


Mit freundliche Grüßen
 
Zuletzt bearbeitet:

ibafluss

Erfahrenes Mitglied
Schau mal auf die if-Verzweigung in Zeile 120: if(eingabe == f[eingabe])

eingabe ist ja char. Du vergleichst jetzt das char mit f[eingabe]. In eingabe ist aber keine Zahl im Format 1 gespeichert, sondern im Format '1'! Es wird also das Zeichen 1 gespeichert und nicht die 1 selbst. Du müsstest die Eingabe noch in int konvertieren, dann kannst du damit auf Arrayelemente zugreifen. Z.B.:

Code:
int zahl;

zahl = eingabe - 48     // So kommst du vom Zeichen auf die Zahl selbst

Jetzt kannst du mit zahl auf die Arrayelemente zugreifen.

P.S.: Ich habe den restlichen Code nocht nicht angeschaut, versuch mal wie das Programm jetzt läuft.

Lg
 

sheel

I love Asm
Hi

was ich anders gemacht hätte:

main:
Statt 49 '1' nehmen.
Variablendefs zusammenfassen ( char a, b, c; )
Unnötige Variablen weg
Die einzelnen Modi in eigene Funktionen auslagern
Statt x==true und x==false einfach x und !x verwenden
Bei den KI-Modi keine Endlosschleife, sondern vorerst eine Fehlermeldung

Render: Schleifen

Setzen:
Dein Fehler: Beim ersten if nicht vergessen, dass '1' ja 49 ist und als Index ungeeignet
Die Falschprüfung nicht so umständlich, mit zwei verschiedenen Meldungen etc.

Gruß
 

CodeCrafterCpp

Erfahrenes Mitglied
Ok danke euch beiden wo ich mir es so anschaue macht es ja auch sinn. :D
@sheel Unnötige Variablen weg******** Es kommt ja noch ein bsschen an Quelltext oder meinst du was jetzt schon sinnlos ist?

Und das beim Render eine Schleife benutzt were jetzt ja sinnlos und in der Konsole sieht das dann doof aus.

Aber sonst danke.
 

ibafluss

Erfahrenes Mitglied
Und noch was: Ich habe ja selbst vor cirka einem Monat mein TicTatToe mit KI programmiert und ich würde sagen, es ist ziemlich sinnlos, 5 verschiedene Schwierigkeitsgrade zu programmieren. Sonst endet das nur so, dass der schwerste immer alle Angriffe blockt, der zweitschwerste dann halt das selbe, nur dass er zum Beispiel einen besonderen Fall nicht beachtet usw...
Am besten mach einen Computergegner und den gibst du dafür alles, was er braucht um die Gegner ins Schwitzen zu bringen ;)
 

sheel

I love Asm
@Render-Schleife: Warum soll wegen einer Schleife die Konsole anders ausschauen?
@Sinnlos-Variablen: Wenn du die im noch fehlenden Code brauchst, ok. Bin ja kein Hellseher :)
 

CodeCrafterCpp

Erfahrenes Mitglied
@Render-Schleife Weil es eine Konsole eigendlich nicht für Spiele gemacht ist und somit kein Doppel Buffering (oder wie das noch heißst) hat. Wenn ich jetzt sagen wir mal jede Sekunde Zeichne blitzt mir das Spielfeld nur auf und das ist ja ziemlich doof. Also es kann auch sein das ich das mit deiner Schleife falsch verstanden habe.


mfG
 

sheel

I love Asm
Meinte nur, das:
C++:
    cout << f[0] << "|"<< f[1]<< "|"<< f[2]<< endl;
    cout << "-" << "+" << "-" << "+" << "-" << endl;
    cout << f[3] << "|"<< f[4]<< "|"<< f[5]<< endl;
    cout << "-" << "+" << "-" << "+" << "-" << endl;
    cout << f[6] << "|"<< f[7]<<"|"<< f[8]<< endl;
durch zB. sowas zu ersetzen:
C++:
for(int i = 1; i <=9; i++)
{
    cout << f[i - 1];
    if(!(i % 3)) cout << endl << "-+-+-" << endl;
    else cout << "|";
}

Gruß
 

CodeCrafterCpp

Erfahrenes Mitglied
@Sheel Achso ok das ist ja gut. Hab das so verstanden das man eben pro Sekunde 28 mal Render wie bei ein richtigen 3D Spiel.
 
Zuletzt bearbeitet: