#include #include typedef struct // Struktur mit Infos zu den Spielern { char name [100]; int anzb; int siege; } spinfo; int namen (spinfo *sp1, spinfo *sp2); // Prototypen int spfeld (int feld [3][3], int farbe [3][3]); int spielzug (int zug, int feld [3][3], int farbe [3][3], spinfo sp1, spinfo sp2); int pruefeerg (int feld [3][3], int farbe [3][3], int zug, spinfo *sp1, spinfo *sp2); int pruefediagonal1 (int feld [3][3], int farbe [3][3]); int pruefediagonal2 (int feld [3][3], int farbe [3][3]); int pruefesenkrecht (int feld [3][3], int farbe [3][3]); int pruefewaagrecht (int feld [3][3], int farbe [3][3]); int statisitk (spinfo sp1, spinfo sp2); int main () { spinfo sp1, sp2; char re; int zug=1, erg, feld [3][3]={{0}}, farbe [3][3]={{0}}, i, j; sp1.siege=0; // Siege werden auf Null gesetzt sp2.siege=0; namen (&sp1, &sp2); // Namen werden Eingelesen do { for (i=0; i<3; i++) // Farbe des Spielfeldes auf 0 (Schwarz) for (j=0; j<3; j++) farbe [i][j]=0; farbe [1][1]=1; // Mitte auf 1 (Grau) erg=0; // erg auf 0 (= noch kein Spielergebenis) zug=1; // Anzahl der Züge auf 1 for (i=0; i<3; i++) // Spielfeld auf 0 (= unbelegt) for (j=0; j<3; j++) feld [i][j]=0; spfeld (feld, farbe); // Ausgabe des Spielfeldes do { spielzug (zug, feld, farbe, sp1, sp2); // Spielzug wird durchgeführt erg=pruefeerg (feld, farbe, zug, &sp1, &sp2); // Test ob sich das Ergebnis geändert hat zug++; // nächster Zug }while (erg==0); statisitk (sp1, sp2); // Statistik wird Ausgegeben printf ("\n\nNochmal spielen? (Y/N)\n"); // Prüft, ob noch einmal gespielt wird re=getche (); clrscr (); }while (re=='Y'||re=='y'); printf ("%c by Marth Daniel\n", 184); // copyright ^^ printf ("Press any key to quit "); getch (); return 0; } int namen (spinfo *sp1, spinfo *sp2) { int pruef=0, i; printf ("Spieler 1, geben sie ihren Name ein:\n"); for (i=0; i<100&&pruef==0; i++) // Eingabe des Namens von Spieler 1 { sp1->name [i]=getche (); if (sp1->name [i]==13) // Prüfe Enter pruef=1; } sp1->anzb=i-1; // Anzahl der Buchstaben wird auf sp1->anzb gespeichert (ohne Enter) pruef=0; // Prüfvariable wieder auf 0 printf ("\nSpieler 2, geben sie ihren Name ein:\n"); for (i=0; i<100&&pruef==0; i++) // Eingabe des Namens von Spieler 2 { sp2->name [i]=getche (); if (sp2->name [i]==13) pruef=1; } sp2->anzb=i-1; // Anzahl der Buchstaben wird auf sp1->anzb gespeichert (ohne Enter) clrscr (); return 0; } int spfeld (int feld [3][3], int farbe [3][3]) { int i, j, k; clrscr (); textcolor (LIGHTGRAY); // Normale Farben textbackground (BLACK); cprintf ("%c", 201); // Spielfeld inklusive Rahmen wird ausgegeben for (k=0; k<3; k++) cprintf ("%c", 205); cprintf ("%c", 203); for (k=0; k<3; k++) cprintf ("%c", 205); cprintf ("%c", 203); for (k=0; k<3; k++) cprintf ("%c", 205); cprintf ("%c", 187); printf ("\n"); for (i=0; i<3; i++) { cprintf ("%c", 186); for (j=0; j<3; j++) { if (farbe [i][j]==1) // Prüfe ob dem Feldelement eine Farbe zugewiesen ist { // Wenn Cursor auf dieser Position textcolor (BLACK); textbackground (LIGHTGRAY); } else if (farbe [i][j]==2) // bei Sieg Gelb textcolor (YELLOW); else // Wenn Corsor auf anderer Position { textcolor (LIGHTGRAY); textbackground (BLACK); } if (feld [i][j]==1) // Ein X wird für Spieler 1 ausgegeben cprintf (" X "); else if (feld [i][j]==2) // Ein O wird für Spieler 2 ausgegeben cprintf (" O "); else // unbelegtes Feld wird ausgegeben cprintf (" "); textcolor (LIGHTGRAY); textbackground (BLACK); cprintf ("%c", 186); // Ausgabe des Rahmens } printf ("\n"); textcolor (LIGHTGRAY); // Farben zurücksetzen textbackground (BLACK); if (i<2) cprintf ("%c", 204); else cprintf ("%c", 200); for (k=0; k<3; k++) cprintf ("%c", 205); if (i<2) cprintf ("%c", 206); else cprintf ("%c", 202); for (k=0; k<3; k++) cprintf ("%c", 205); if (i<2) cprintf ("%c", 206); else cprintf ("%c", 202); for (k=0; k<3; k++) cprintf ("%c", 205); if (i<2) // Prüfe ob letzte Reihe { cprintf ("%c", 185); printf ("\n"); } else cprintf ("%c", 188); } printf ("\n\n"); return 0; } int spielzug (int zug, int feld [3][3], int farbe [3][3], spinfo sp1, spinfo sp2) { char eingabe; int i, x=1, y=1, xalt=1, yalt=1, spieler, pruef=0; do { if (zug%2==1) // Prüfe, welcher Spieler am Zug ist { spieler=1; for (i=0; i0) // nach oben x--; else if (eingabe==77&&y<2) // nach rechts y++; else if (eingabe==75&&y>0) // nach links y--; farbe [xalt][yalt]=0; // altes Feld wieder Schwarz farbe [x][y]=1; // neues Feld Grau xalt=x; // alt=neu yalt=y; } spfeld (feld, farbe); // Ausgabe des Spielfeldes }while (pruef==0); farbe [xalt][yalt]=0; // altes Feld Schwarz farbe [1][1]=1; // Mitte auf Grau spfeld (feld, farbe); // Ausgabe des Spielfeldes return 0; } int pruefeerg (int feld [3][3], int farbe [3][3], int zug, spinfo *sp1, spinfo *sp2) { int erg, i; erg=pruefediagonal1 (feld, farbe); // prüft die Diagonale auf 3 gleiche Zeichen if (erg==3) // prüft die andere Diagonale auf 3 gleiche Zeichen, wenn noch nicht gefunden erg=pruefediagonal2 (feld, farbe); if (erg==3) // prüft senkrecht auf 3 gleiche Zeichen, wenn noch nicht gefunden erg=pruefesenkrecht (feld, farbe); if (erg==3) // prüft waagrecht auf 3 gleiche Zeichen, wenn noch nicht gefunden erg=pruefewaagrecht (feld, farbe); clrscr (); spfeld (feld, farbe); if (erg==1) // wird ausgeführt, wenn Spieler 1 gewinnt { printf ("\n"); for (i=0; ianzb; i++) printf ("%c", sp1->name [i]); printf (" hat das Spiel gewonnen!"); sp1->siege++; } else if (erg==2) // wird ausgeführt, wenn Spieler 2 gewinnt { printf ("\n"); for (i=0; ianzb; i++) printf ("%c", sp2->name [i]); printf (" hat das Spiel gewonnen!"); sp2->siege++; } else if (erg==3&&zug<9) // wird ausgeführt, wenn Spiel weitergeht erg=0; else if (erg==3) // wird ausgeführt, wenn alle Felder belegt sind und keiner gewonnen hat printf ("\nDas Spiel endet unentschieden!"); return erg; } int pruefediagonal1 (int feld [3][3], int farbe [3][3]) { int x, y, anz1=0, anz2=0, erg=3; for (x=0, y=0; x<3; x++, y++) // prüft von links oben nach rechts untne { if (feld [x][y]==1) // Feld von Spieler 1 { anz1++; anz2=0; } else if (feld [x][y]==2) // Feld von Spieler 2 { anz2++; anz1=0; } else // leeres Feld { anz1=0; anz2=0; } } if (anz1==3) // prüft ob ein Spieler gewonnen hat { erg=1; farbe [x-1][y-1]=2; farbe [x-2][y-2]=2; farbe [x-3][y-3]=2; } else if (anz2==3) { erg=2; farbe [x-1][y-1]=2; farbe [x-2][y-2]=2; farbe [x-3][y-3]=2; } return erg; } int pruefediagonal2 (int feld [3][3], int farbe [3][3]) { int x, y, anz1=0, anz2=0, erg=3; for (x=2, y=0; x>=0; x--, y++) // prüft von links untne nach rechts oben { if (feld [x][y]==1) // Feld von Spieler 1 { anz1++; anz2=0; } else if (feld [x][y]==2) // Feld von Spieler 2 { anz2++; anz1=0; } else // leeres Feld { anz1=0; anz2=0; } } if (anz1==3) // prüft ob ein Spieler gewonnen hat { erg=1; farbe [x+1][y-1]=2; farbe [x+2][y-2]=2; farbe [x+3][y-3]=2; } else if (anz2==3) { erg=2; farbe [x+1][y-1]=2; farbe [x+2][y-2]=2; farbe [x+3][y-3]=2; } return erg; } int pruefesenkrecht (int feld [3][3], int farbe [3][3]) { int x, y, anz1=0, anz2=0, erg=3;; for (y=0; y<3; y++) // prüft senkrecht { for (x=0; x<3; x++) { if (feld [x][y]==1) // Feld von Spieler 1 { anz1++; anz2=0; } else if (feld [x][y]==2) // Feld von Spieler 2 { anz2++; anz1=0; } else // leeres Feld { anz1=0; anz2=0; } } if (anz1==3) // prüft ob ein Spieler gewonnen hat { erg=1; farbe [x-1][y]=2; farbe [x-2][y]=2; farbe [x-3][y]=2; return erg; } else if (anz2==3) { erg=2; farbe [x-1][y]=2; farbe [x-2][y]=2; farbe [x-3][y]=2; return erg; } } return erg; } int pruefewaagrecht (int feld [3][3], int farbe [3][3]) { int x, y, anz1=0, anz2=0, erg=3; for (x=0; x<3; x++) { for (y=0; y<3; y++) // prüft waagrecht { if (feld [x][y]==1) // Feld von Spieler 1 { anz1++; anz2=0; } else if (feld [x][y]==2) // Feld von Spieler 2 { anz2++; anz1=0; } else // leeres Feld { anz1=0; anz2=0; } } if (anz1==3) // prüft ob ein Spieler gewonnen hat { erg=1; farbe [x][y-1]=2; farbe [x][y-2]=2; farbe [x][y-3]=2; return erg; } else if (anz2==3) { erg=2; farbe [x][y-1]=2; farbe [x][y-2]=2; farbe [x][y-3]=2; return erg; } } return erg; } int statisitk (spinfo sp1, spinfo sp2) { int i; printf ("\n\nSTATISTIK\n"); // Gibt die Statistiken der Spieler aus for (i=0; i