Tic Tac Toe

...und keine zweidimensionalen Arrays...

Das sind die Aufgaben, mit denen schlechte Lehrer Anfänger zermürben und dabei glauben, ihnen das Programmieren beizubringen.
 
So, jetzt werde ich dich sehr verwirren...

C++:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
	char gewonnen=-1,istdran;
	char feld[9],zeichen[3],eingabe[16];
	int i,j,k,l;

	zeichen[0]='.';
	zeichen[1]='x';
	zeichen[2]='o';

	while(1)
	{
		system("cls");
		if(gewonnen)
		{
			if(gewonnen>0)printf("Spieler %d hat gewonnen. ",gewonnen);
			printf("Neue Runde beginnt.\n");
			gewonnen=0;istdran=0;
			for(i=0;i<9;i++)feld[i]=0;
		}
		else printf("\n");
		printf("\n");

		for(i=0;i<3;i++)
		{
			for(j=0;j<3;j++)
			{
				printf("%c",zeichen[feld[i*3+j]]);
			}
			printf("\n");
		}
		printf("\n");

		do
		{
			printf("Spieler %d, bitte Zeile/Spalte eingeben: ",istdran+1);

			fgets(eingabe,16,stdin);
			i=strlen(eingabe)-1;
			if(i>=0&&eingabe[i]=='\n')eingabe[i]='\0';
			else
			{
				while(fgetc(stdin)!='\n');
			}

			if(2!=sscanf(eingabe,"%d %d",&i,&j))
			{
				printf("Falsche Eingabe!\n");
				i=-1;
			}
			else if(i<1||i>3||j<1||j>3)
			{
				printf("Nur Zahlen von 1 bis 3 erlaubt!\n");
				i=-1;
			}
			else if(feld[(i-1)*3+j-1]!=0)
			{
				printf("Schon besetzt!\n");
				i=-1;
			}
		}while(i<1);

		i--;j--;
		feld[i*3+j]=istdran+1;
		istdran=1-istdran;

		for(l=1;l<3;l++)
		{
			for(k=0;k<3;k++)
			{
				j=0;
				for(i=0;i<3;i++)
				{
					if(feld[k*3+i]==l)j++;
				}
				if(j==3)gewonnen=l;
				j=0;
				for(i=0;i<3;i++)
				{
					if(feld[i*3+k]==l)j++;
				}
				if(j==3)gewonnen=l;
			}
			j=0;
			for(i=0;i<3;i++)
			{
				if(feld[i*3+i]==l)j++;
			}
			if(j==3)gewonnen=l;
			j=0;
			for(i=0;i<3;i++)
			{
				if(feld[i*2+2]==l)j++;
			}
			if(j==3)gewonnen=l;
		}
	}
	return 0;
}

Gibts noch Fragen? :D

Ich kommentier das Ganze noch und stells dann mit den Kommentaren nocheinmal hier rein.

edit: Jetzt mit ein paar Kommentaren
C++:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
	char gewonnen=-1;
	//Gewonnen: 1 oder 2, wenn Spieler 1/2 gewonnen hat, sonst 0.
	//-1 nur am Anfang, damit die Variablen für die erste "neue Runde" hergerichtet werden,
	//aber keine "... hat gewonnen" Meldung kommt.

	char istdran;//0 oder 1, ob Spieler 1 oder 2 dran ist

	char feld[9];
	//Das Spielfeld (3x3 Felder). Es dürfen ja nur eindim.Arrays vervendet werden,
	//sonst wäre es feld[3][3]
	//0 ist leer, 1/2 bedeutet dass Spieler 1/2 dorthin was gesetzt hat

	char zeichen[3];
	//zeichen[0] ist . für ein leeres Spielfeld
	//zeichen[1] und zeichen[2] sind x und o für die Spieler

	char eingabe[16];//Für die Tastatureingabe

	int i,j,k,l;//Hauptsächlich für die Schleifen zum zählen

	zeichen[0]='.';//Hier das oben Beschriebene zuweisen
	zeichen[1]='x';
	zeichen[2]='o';

	while(1)//Immer wiederholen
	{
		system("cls");//Konsole leeren
		if(gewonnen)//Wenn wer gewonnen hat (oder einmal am Anfang wegen dem -1 in gewonnen)
		{
			if(gewonnen>0)printf("Spieler %d hat gewonnen. ",gewonnen);//Wenn nicht Anfangs- -1
			printf("Neue Runde beginnt.\n");
			gewonnen=0;istdran=0;//Erster Spieler beginnt
			for(i=0;i<9;i++)feld[i]=0;//Spielfeld wieder leeren
		}
		else printf("\n");
		printf("\n");

		for(i=0;i<3;i++)//Spielfeld ausgeben
		{
			for(j=0;j<3;j++)
			{
				printf("%c",zeichen[feld[i*3+j]]);
			}
			printf("\n");
		}
		printf("\n");

		do
		{
			printf("Spieler %d, bitte Zeile/Spalte eingeben: ",istdran+1);//Spieler auffordern, was einzugeben

			fgets(eingabe,16,stdin);//Einlesen; scanf macht Probleme deshalb so
			i=strlen(eingabe)-1;
			if(i>=0&&eingabe[i]=='\n')eingabe[i]='\0';
			else{while(fgetc(stdin)!='\n');}

			if(2!=sscanf(eingabe,"%d %d",&i,&j))//Wenn Buchstaben etc eingegeben wurden
			{
				printf("Falsche Eingabe!\n");
				i=-1;
			}
			else if(i<1||i>3||j<1||j>3)//Wenn die Zahlen nicht passen
			{
				printf("Nur Zahlen von 1 bis 3 erlaubt!\n");
				i=-1;
			}
			else if(feld[(i-1)*3+j-1]!=0)//Wenn das Feld schon belegt ist
			{
				printf("Schon besetzt!\n");
				i=-1;
			}
		}while(i<1);//Solange bis die Eingabe passt

		i--;j--;//Eingegeben wurde 1, 2 oder 3; C zählt aber von 0 bis 2 im Array
		feld[i*3+j]=istdran+1;//Spielstein setzen
		istdran=1-istdran;//Anderer Spieler kommt dann dran

		//Prüfen, ob wer gewonnen hat
		for(l=1;l<3;l++)//Alles für Spieler 1 und Spieler 2
		{
			for(k=0;k<3;k++)
			{
				j=0;//Alle 3 Zeilen auf 3 Gleiche Überprüfen
				for(i=0;i<3;i++)
				{
					if(feld[k*3+i]==l)j++;
				}
				if(j==3)gewonnen=l;
				j=0;//Alle 3 Spalten auf 3 Gleiche Überprüfen
				for(i=0;i<3;i++)
				{
					if(feld[i*3+k]==l)j++;
				}
				if(j==3)gewonnen=l;
			}
			j=0;//Auch beide Diagonalen noch auf 3 Gleiche prüfen
			for(i=0;i<3;i++)
			{
				if(feld[i*3+i]==l)j++;
			}
			if(j==3)gewonnen=l;
			j=0;
			for(i=0;i<3;i++)
			{
				if(feld[i*2+2]==l)j++;
			}
			if(j==3)gewonnen=l;
		}
	}
	return 0;
}

Gruß
 
Zuletzt bearbeitet:
Naja Funktion und 2D arrays haben wir noch nicht wirklich durch genommen....
sheel, danke dir... ich hoffe ich kann versteh es, du bist ja immer hin erfahren und ich ein ****...
wenn ich noch mehr fragen habe hoffe dass ich dich bzw euch fragen kann....
 
Oo Einfach den Code zu posten, wird ihm/ ihr nie was bringen. Wie soll man denn dann was lernen?
Wie schon gesagt, bissel Eigeninitative waere super gewesen, dann codeschnipsel zu posten ist auch in Ordnung.

Und Kommentare lesen kann er/ sie auch net Oo
was genau mach system("cls"); wenn ich fragen darf....
Haette man den Quelltext mit Kommentaren gelesen, wuesste man:
system("cls");//Konsole leeren
 
Oo Einfach den Code zu posten, wird ihm/ ihr nie was bringen. Wie soll man denn dann was lernen?
Wie schon gesagt, bissel Eigeninitative waere super gewesen, dann codeschnipsel zu posten ist auch in Ordnung.

Ja, Eigeninitiative wäre gut gewesen.
Aber nach 8 Stunden und einem Abstecher ins .NET-Forum und wieder hierher zurück wurde klar, dass er nichtmal den Namen der Programmiersprache kennt, das Wort Array noch nie gehört hat und sich mit Schleifen schwertut...
Ob da noch was gekommen wäre?

Du willst mir net wirklich erzaehlen das du nicht weisst, was 'konsole leeren' bedeutet.

Zur Aufklärung für Makavely:
Am Anfang des Programms, vor dem ersten printf, hast du die Konsole und nichts steht drin. Leer.
Nach einem/mehreren printf steht Text drin.
Nach system("cls") steht wieder nichts drin. Wieder leer.

Gruß
 
Zuletzt bearbeitet:
Zurück