Tic Tac Toe
-
Guten Morgen, liebe community!
Also folgendes... wir arbeiten in der Schule mit C und wir haben am Freitag den Auftrag bekommen ein Tic Tac Toe spiel zu programmieren in diesem Semester... naja gut ein semester brauch ich dafür ned
hatte es 8 stunden später fertig aber es gibt da kleine komplikationen mit den abbruch bedingungen... er erkennt mir manche "break;"'s nicht an und meint das das illegal an dieser stelle wäre...
an sonsten funktioniert das Programm einwandfrei..
und eine weitere Frage.. für dieses Jahr sollen wir noch eine AI dazu programmieren .. natürlich eine bissl dumme damit man als spieler auch gewinnen kann.. und wollt fragen ob mir dazu wer eine Hilfestellung geben kann...
hier is mein code:
#include <stdio.h> #include <stdlib.h> #include <conio.h> char feld [3][3]; int xk=0,yk=0,end=0,spieler=0,last=0,anz = 0; int howto(void); int horizontal(void); int vertikal(void); int diagonal(void); int userinput(void); int ausgabe(void); int unentschieden(void); int richtig(int xk,int yk); int main(void) { int i,j; howto(); spieler=1; printf("\n"); while(end==0) { //mitzählen anz = anz + 1; printf("\n%ite Spielrunde.\n",anz); //eingabe holen userinput(); //ausgabe ausgabe(); //auf gewinn pruefen horizontal(); vertikal(); diagonal(); unentschieden(); } system("pause"); return 0; } //END OF MAIN int horizontal(void) { int n; for(n=0;n<3;n++) if(feld[n][0] == 2 && feld[n][1] == 2 && feld[n][2] == 2) { printf("\nhorizontal erfuellt\nO hat gewonnen\n\n"); printf("Nach der %iten Spielrunde.\n",anz); end = 1; } for(n=0;n<3;n++) if(feld[n][0] == 1 && feld[n][1] == 1 && feld[n][2] == 1) { printf("\nhorizontal erfuellt\nX hat gewonnen\n\n"); printf("Nach der %iten Spielrunde.\n",anz); end = 1; break; } return 0; } int vertikal() { int n,x,y; for(n=0;n<3;n++) if(feld[0][n] == 2 && feld[1][n] == 2 && feld[2][n] == 2) { printf("\nvertikal erfuellt\nO hat gewonnen"); printf("Nach der %iten Spielrunde.\n",anz); end = 1; } for(n=0;n<3;n++) if(feld[0][n] == 1 && feld[1][n] == 1 && feld[2][n] == 1) { printf("\nvertikal erfuellt\nX hat gewonnen"); printf("Nach der %iten Spielrunde.\n",anz); end = 1; } return 0; } int diagonal(void) { int n; if(feld[0][0] == 1 && feld[1][1] == 1 && feld[2][2] == 1) { printf("\ndiagonal erfuellt\nX hat gewonnen"); printf("Nach der %iten Spielrunde.\n",anz); end = 1; } if(feld[0][2] == 1 && feld[1][1] == 1 && feld[2][0] == 1) { printf("\ndiagonal erfuellt\nX hat gewonnen"); printf("Nach der %iten Spielrunde.\n",anz); end = 1; } if(feld[0][0] == 2 && feld[1][1] == 2 && feld[2][2] == 2) { printf("\ndiagonal erfuellt\nO hat gewonnen!\n"); printf("Nach der %iten Spielrunde.\n",anz); end = 1; } if(feld[0][2] == 2 && feld[1][1] == 2 && feld[2][0] == 2) { printf("\ndiagonal erfuellt\nO hat gewonnen!\n"); printf("Nach der %iten Spielrunde.\n",anz); end = 1; } return 0; } int userinput(void) { char x,y; int xk,yk,right=0; //emergency fehler abfangen if(spieler<=1) spieler = 2; else spieler = 1; printf("Spieler %i ist dran\n",spieler); printf("X koordinate:\n"); x = getch(); //in eine zahl umwandeln xk = x &0xf; printf("Y koordinate:\n"); y = getch(); //in eine zahl umwandeln yk = y &0xf; right = richtig(xk,yk); if(right ==1) { printf("Falsche Eingabe! nur zahlen zwischen 0 und 2 eingeben! Oder 9 zum beenden\n"); //damit der selbe spieler nochmal dran is if(spieler==1) spieler = 2; else spieler = 1; //anz = anz -1; userinput(); } if(right ==2) { printf("Beende...\n"); end = 1; } if(feld[xk][yk] != 1 && feld[xk][yk] != 2) { if(spieler==1) feld[xk][yk] = 1; if(spieler==2) feld[xk][yk] = 2; } else { printf("\n!!!In diesem Feld steht bereits etwas drinnen!\nNochmal versuchen!\n"); //damit der selbe spieler nochmal dran is if(spieler==1) spieler = 2; else spieler = 1; anz = anz -1; userinput(); } return 0; } int ausgabe(void) { int i,j; printf("\n\n"); for(i=0;i<3;i++) { for(j=0;j<3;j++) { if(feld[i][j] == 1) printf("x"); if(feld[i][j] == 2) printf("O"); if(feld[i][j] != 1 && feld[i][j] != 2) printf(" "); if(j!=2) printf("|"); } printf("\n"); if(i!=2) printf("-+-+-\n"); } printf("\n\n"); return 0; } int unentschieden(void) { if(end==0) { if(anz>=8) { printf("\nUnentschieden!\n"); end = 1; } return 0; } int howto(void) { printf("Erklaerung:\n\n"); printf("Koordinaten werden nach x und y eingegeben:\n"); printf("nach dem schema xy:\n"); printf("00|01|02\n--+--+--\n10|11|12\n--+--+--\n20|21|22\n\n"); printf("Also nach XY würds dann so aussehen:\n\n"); printf("XY|XY|XY\n--+--+--\nXY|XY|XY\n--+--+--\nXY|XY|XY\n\n"); printf("Moechte man also das feld in der mitte besetzen, gibt man 1 1 ein.\n das erste fuer x und das 2. fuer y"); printf("\n\nDu kannst jederzeit '9' drucken zum beenden!\n\n"); system("pause"); system("cls"); } return 0; } int richtig(int xk,int yk) { int right; if(xk==9 || yk==9) right = 2; if(xk>2 && xk!=9 || yk>2 && yk != 9) right = 1; return right; }
lg Chris
-
rueck den code ein oder keiner wird es lesen. dein lehrer wird sicherlich auch formpunkte abziehen fuer die fehlende einrueckung (wenn er denn das fach ernst nimmt).
dein einziges break im code produziert keine fehlermeldungen, so weit ich das sehen kann.
stell eine frage, dann wird sie beantwortet.
-
naja
bei der abfrage if (right == 1) und if(right==2) brauche ich einen break befhel. weil er sonst weiter macht obwohl ein eingabefehler bemerkt wurde...
wenn das spiel feststellt, dass eine falsche eingabe gemacht wurde, setzt er den spieler zurück, und führt die funktion userinput erneut aus. leider steht dann aber immernoch die weitere ausführung des codes mit mit falscheingabe an.
aber wenn ich eben dort ein "break;" setze gibts einen fehler vom compiler
und genau das ist mein Problem
-
break funktioniert nur in schleifen und switches.
rueck den code bitte sauber ein. macht die sache lesbar. du kannst deinen ersten beitrag auch bearbeiten.
-
habe ihn bereits bearbeitet und besser (bzw überhaupt) ein gerückt
und was kann ich dann statt dem break verwenden? return?
-
-
du kannst aus einer funktion generell nur mit einem return aussteigen. es ist dann deine aufgabe, diesen zustand am rueckgabewert der funktion zu erkennen und das programm reagieren zu lassen.
-
@geek
Wenn ich dein Lehrer wäre, dann würde ich dir für jeden Aufruf von system() in Verbindung mit einem Konsolenbefehl mind. 100 Punkte abziehen. system() verwendet man um externe Programme aufzurufen und nicht um es mit Konsolenbefehlen zu misshandeln.Wenn du schon die conio.h includierst, dann kannst du auch clrscr() daraus verwenden, um den Bildschirm zu löschen (anstatt: system("CLS")).
Und wenn du getch() verwendest, warum verwendest du dann noch system("PAUSE")?? Um eine Eingabe vom Benutzer zu erzwingen, gibts hunderte bessere Möglichkeiten.
Mein Lieblingsvergleich dazu:
Sprengst du deine Türen auch immer mit Dynamit auf??
-
tut mir leid wir lernen C seit einem monat... so genau kenn ich die spezifischen Befehle nicht...
-
@geek
Einfach mal kurz suchen. Hier im Forum dürftest du hunderte Beiträge dazu finden. Und in der Konsolen-FAQ stehts auch.Hauptsache du machst es in Zukunft richtig
-
In welcher Klasse/ bzw. welches Semsester bist du? (Nur rein Informativ)
-
Zero_Clamping schrieb:
In welcher Klasse/ bzw. welches Semsester bist du? (Nur rein Informativ)
semester??
muesste man sowas nicht schon koennen waenn man studiert??
-
Nein, muss man nicht. Wenn man es kann ist es aber trotzdem gut. Semester muss nicht heißen dass er studiert, zumindest bei den Österreichern (?) glaub ich.
-
nein ich studiere noch nicht.. bin gerade mein drittes jahr an einer HTL im zweig Datenverarbeitung und Organisation