Tic - Tak -Toe
-
Hallo,
die gleiche Frage habe ich zwar schon einmal in dem Forum "Rund um die Programmierung" gestellt, aber da antwortet niemand. Ich vermute mal das es daran liegt, dass sich dort nicht so viele C-Programmierer rumtreiben.Also hier ist als erstes mal mein code:
#include <stdio.h> #include <time.h> // für rand(time(null)) #include <math.h> // für rand int KI(float xodero) { char feld[8]; feld[rand]; //!!!!! Hier soll ´feld´ eine zufallszahl zwischen 1 und 9 bekommen ... // Wichtig: rand darf kein wert überschreiben. Wenn feld[1] schon ein wert hat, soll // er ihn auch beibehalten if (xodero != %2) { // hier wir geprüft ob ´xodero´ grade oder ungrade ist ... also wenn kein rest // bleibt ist grade ... somit .... feld[]= X // bekommt ´feld´ den wert X } else if { feld[]= O // ansonsten O } return xodero; return feld[]; int zeigezug(extern char nzug) { printf(" A / B / C /"); printf(" +----+----+----+"); printf(" 1 / %f / %f / %f /",feld[1],feld[2],feld[3]); printf(" +----+----+----+"); printf(" 2 / %f / %f / %f /",feld[4],feld[5],feld[6]); printf(" +----+----+----+"); printf(" 3 / %f / %f / %f /",feld[7],feld[8],feld[9]); printf(" +----+----+----+"); // === HIER MUSS GEGUCKT WERDEN OB ALLE FELDER VOLL SIND, WENN JA SOLL BOOL EIN FALSH WERT AN DIE SCHLEIFE ZURÜCK //GEBEN. } int human() { ................ } int main() { printf ("Gegen wen wollen Sie Spielen?:\n 1. Human vs. Human\n 2. Human vs. KI\n 3. KI vs. KI"); scanf ("%f",&wahl); // ist das & richtig, oder zeigt es jetzt auf ein Speicher? // "pointer" haben mich durcheinander gebracht :D switch(wahl) { case 1: while(TRUE) { int human(); int zeigezug(); } break; case 2: while(TRUE) { int human(); int zeigezug(); int KI(); // hmm hier stimmt was nicht. Die schleife wird nie zu ende geführt ... int zeigezug; } break; case 3: while(TRUE) { int KI(); int zeigezug(); } break; default: printf ("ungültige option"); return 1; }
Als erstes will ich nur wissen, ob das soweit ok aussieht und wie man richtig zufallszahlen bei der funktin "KI" erstellt .... die restlichen Fragen folgen
Danke im vorraus ...
-
rück den code erst ma ordentlich ein
un die Funktion kann net funktionieren lies dir mal in FAQ die Beiträge zu rand durch.
-
Hab mir schon die FAQ durchgelese, die hat mir aber nicht wirklich geholfen. Ich kann nur vermutungen anstellen und habe das jetzt auch gemacht ... sieht aber schon falsch aus :(:
#include <stdio.h> #include <time.h> // für rand(time(null)) #include <math.h> // für rand int KI(float xodero) { char feld[8]; feld[rand(time)%9] //!!!!! Hier soll ´feld´ eine zufallszahl zwischen 1 und 9 bekommen ... // Wichtig: rand darf kein wert überschreiben. Wenn feld[1] schon ein wert hat, soll // er ihn auch beibehalten if (xodero != %2) { // hier wir geprüft ob ´xodero´ grade oder ungrade ist ... also wenn kein rest // bleibt ist grade ... somit .... feld[]= X // bekommt ´feld´ den wert X } else if { feld[]= O // ansonsten O } return xodero; return feld[]; int zeigezug(extern char nzug) { printf(" A / B / C /"); printf(" +----+----+----+"); printf(" 1 / %f / %f / %f /",feld[1],feld[2],feld[3]); printf(" +----+----+----+"); printf(" 2 / %f / %f / %f /",feld[4],feld[5],feld[6]); printf(" +----+----+----+"); printf(" 3 / %f / %f / %f /",feld[7],feld[8],feld[9]); printf(" +----+----+----+"); // === HIER MUSS GEGUCKT WERDEN OB ALLE FELDER VOLL SIND, WENN JA SOLL BOOL EIN FALSH WERT AN DIE SCHLEIFE ZURÜCK //GEBEN. } int human() { ................ } int main() { printf ("Gegen wen wollen Sie Spielen?:\n 1. Human vs. Human\n 2. Human vs. KI\n 3. KI vs. KI"); scanf ("%f",&wahl); // ist das & richtig, oder zeigt es jetzt auf ein Speicher? // "pointer" haben mich durcheinander gebracht :D switch(wahl) { case 1: while(TRUE) { int human(); int zeigezug(); } break; case 2: while(TRUE) { int human(); int zeigezug(); int KI(); // hmm hier stimmt was nicht. Die schleife wird nie zu ende geführt ... int zeigezug; } break; case 3: while(TRUE) { int KI(); int zeigezug(); } break; default: printf ("ungültige option"); return 1; }
-
Willst du jetzt in das Array "Feld" Zufallszahlen reinschreiben oder zufällig ein Feld des Arrays auswählen?
feld[i]=rand(); //Für Wert reinschreiben x=rand()%8; feld[x]; // um zufällig ein Feld auszuwählen
Edit:
btw ich hab grad ma den Code weiter angeguckt da sin ja zig Fehler drinnen
->http://www.pronix.de/pronix-4.html lesen!Gruß HiFish
-
Danke schön
ich wollte das letztere ...
-
Wenn feld[1] schon ein wert hat, soll er ihn auch beibehalten. Dein bespiel berücksichtigt das aber nicht, sonder überschriebt es einfach.
-
Am ende der KI-funktion soll immer geprüft werden, ob noch felder frei sind, wenn nein, soll der wert False an die while-schleife in main "geschickt" werden. Wie kann man sowas verwirklicken?
#include <stdio.h> #include <time.h> // für rand(time(null)) #include <math.h> // für rand int KI(float xodero) { char feld[8]; float x; x=rand()%8; feld[x]; // Wenn feld[1] schon ein wert hat, soll // er ihn auch beibehalten if (xodero != %2) { // hier wir geprüft ob ´xodero´ grade oder ungrade ist ... also wenn kein rest // bleibt ist grade ... somit .... feld[]= X // bekommt ´feld´ den wert X } else if { feld[]= O // ansonsten O } return xodero; return feld[]; int zeigezug(extern char nzug) { printf(" A / B / C /"); printf(" +----+----+----+"); printf(" 1 / %f / %f / %f /",feld[1],feld[2],feld[3]); printf(" +----+----+----+"); printf(" 2 / %f / %f / %f /",feld[4],feld[5],feld[6]); printf(" +----+----+----+"); printf(" 3 / %f / %f / %f /",feld[7],feld[8],feld[9]); printf(" +----+----+----+"); // === HIER MUSS GEGUCKT WERDEN OB ALLE FELDER VOLL SIND, WENN JA SOLL BOOL EIN FALSH WERT AN DIE SCHLEIFE ZURÜCK //GEBEN. } int human() { ................ } int main() { printf ("Gegen wen wollen Sie Spielen?:\n 1. Human vs. Human\n 2. Human vs. KI\n 3. KI vs. KI"); scanf ("%f",&wahl); // ist das & richtig, oder zeigt es jetzt auf ein Speicher? // "pointer" haben mich durcheinander gebracht :D switch(wahl) { case 1: while(TRUE) { int human(); int zeigezug(); } break; case 2: while(TRUE) { int human(); int zeigezug(); int KI(); // hmm hier stimmt was nicht. Die schleife wird nie zu ende geführt ... int zeigezug; } break; case 3: while(TRUE) { int KI(); int zeigezug(); } break; default: printf ("ungültige option"); return 1; }
-
-
rein von der logik sage ich mal zum problem des überschreibens:
1. zufallszahl
2. wenn feld[zufallszahl] dann nochmal würfeln
3. ansonsten einschreibenhm, nicht so schlimm, oder?
dann die vollen felder...
baue eine variable ein, die die anzahl der bereits gemachten markierungen aufweist.
d.h. nach jedem zug anzahl_züge++;sobald anzahl_züge == 9 ist das feld voll
edit: übrigens gibt es auch | - wenn du ne deutsche tastatur hast altGR + <
edit: je häufiger ich mir den code ansehe, desto mehr tut es weh.
du initialisierst ein feld[8], schreibst dann aber später etwas von feld[9]...
andersrum währe es richtigedit: was soll eigentlich feld[] = ...
sag mal, macht das dein compiler überhaupt mit?
-
Rein vom Gefühl her würde ich mal sagen er hat das Ding noch nie versucht zu compilieren...
feld[] = X
Da fängts chon an, es fehlt ein Index, es fehlt das Semikolon, X ist ein nicht definierter Ausdruck...
-
danke erstmal für die hinweise (habt ihr noch mehr
???) ... werde sie morgen ausbügeln
-
Hi,
glaube da hast du nocch ein gutes Stück Arbeit vor dir- Die KI Funktion wird nicht wieder durch eine "}" geschlossen.
- x=rand()%8; --> gibt die Zahlen zwischen 0-7 aus.nimm "%10", du willst ja
schätze ich mal 9 Felder abdecken.
- dein Array ist grds. zu klein. So hast du ein Array von 0-7 -> 1 Feld zu wenig
- Ebenso kann eine Funktion nur einen Rückgabewert haben - siehe KI Fkt.
- "scanf ("%f",&wahl); // ist das & richtig, oder zeigt es jetzt auf ein Speicher?" --> sofern du einen floatwert einlesen möchtest, ist des richtigmh, denke du solltest dem Tip der Vorschreiber folgen und den Quelltext mal durch den Compiler schicken...
Viel Erfolg noch
-
Ich habe das schon durch den compiler geschick. Sooo viele fehler sind das ja garnicht, obwohl das auch mein erstes selbstgeschriebenes Programm ist. Morgen werde ich mal den korrigierten code geben, nur eine frage habe ich wegen rand. Mein compiler meckert. Wieso?
Hier sind die Fehler, wo ich überhaupt nicht weiß was man von mir will:
spiel.c: In function
int KI(float)': spiel.c:9: error:
rand' undeclared (first use this function)
spiel.c:9: error: (Each undeclared identifier is reported only once for each
function it appears in.)
spiel.c:10: error: invalid typeschar[8][float]' for array subscript spiel.c:13: error: switch quantity not an integer spiel.c:15: error: syntax error before
]' tokenDas alles betrifft die funktion KI, aber wieso?
PS: das meiste sind flüchtigkeitsfehler ....
-
zu Rand:
*rand Funktion
rand will generate a random number between 0 and 'RAND_MAX' (at least 32767).Library: stdlib.h
Prototype: int rand(void);
Syntax: int r; /* Random number */
r = rand();
*hast du den gebrauchten HEader eingebunden ?
-
im code fehlen schliessende geschweifte klammern, IMHO.
-
und nimm die "int"'s vor den funktuionsaufrufen weg
der compiler monniert die nicht, weil er sie als funktionsprototypen interpretiert.
-
Gut, ich habe den quellcode soweit verbessert. Aber da sind weiterhin paar fehler drin, die ich nicht ausbügel konnt, da ich nicht weiß was gemeint ist. Kann ich jetzt eigentlich math.h und stdlib.h rauslassen (-ich dachte die bräuchte man für rand()!).
#include <stdio.h> #include <time.h> // für rand(time(null)) #include <math.h> #include <stdlib.h> // für rand int KI(float xodero) { char feld[9]; float i; i=rand()%10; feld[i]; if (xodero%2) { feld[i]='X'; } else { feld[i]='O'; } xodero++; return xodero; } // schließt KI int zeigezug(extern char feld[]) { printf(" A | B | C |"); printf(" +----+----+----+"); printf(" 1 | %f | %f | %f |",feld[0],feld[1],feld[2]); printf(" +----+----+----+"); printf(" 2 | %f | %f | %f |",feld[3],feld[4],feld[5]); printf(" +----+----+----+"); printf(" 3 | %f | %f | %f |",feld[6],feld[7],feld[8]); printf(" +----+----+----+\n"); // === HIER MUSS GEGUCKT WERDEN OB ALLE FELDER VOLL SIND, WENN JA SOLL BOOL EIN FALSH WERT AN DIE SCHLEIFE ZURÜCK GEBEN. } int human() { printf ("Humannnnnn"); } int main() { int x,wahl; printf ("Gegen wen wollen Sie Spielen?:\n 1. Human vs. Human\n 2. Human vs. KI\n 3. KI vs. KI"); scanf ("%f",&wahl); // ist das & richtig, oder zeigt es jetzt auf ein Speicher? // "pointer" haben mich durcheinander gebracht :D switch(wahl) { case 1: int human(); int zeigezug(); x--; break; case 2: int human(); int zeigezug(); int KI(); int zeigezug(); int human(); int zeigezug(); int KI(); int zeigezug(); int human(); int zeigezug(); int KI(); int zeigezug(); int human(); int zeigezug(); int KI(); int zeigezug(); int human(); int zeigezug(); break; case 3: int KI(); int zeigezug(); break; default: printf ("ungültige option"); } return 1; }
spiel.c: In function `int KI(float)': 1. spiel.c:11: error: invalid types `char[9][float]' for array subscript 2. spiel.c:13: error: invalid operands of types `float' and `int' to binary ` operator%' 3. spiel.c:14: error: invalid types `char[9][float]' for array subscript 4. spiel.c:18: error: invalid types `char[9][float]' for array subscript 5. spiel.c:22: warning: converting to `int' from `float' 6. spiel.c: At global scope: 7. spiel.c:26: error: storage class specifiers invalid in parameter declarations 8. spiel.c:26: error: storage class specified for parameter `feld' 9. spiel.c:91:2: warning: no newline at end of file
-
Wieso verwendest du dort überhaupt float? float sind Gleitkommazahlen und die brauchst du für eine einfache Zählvariable bestimmt nicht.
-> ändere die Funktion mal so, daß sie int verwendet.Zweitens: Im Hauptprogramm mußt du die Funktionen AUFRUFEN, nicht neu deklarieren.
PS: stdlib.h brauchst du, math.h nicht (dort stehen Sachen wie Sinus oder Potenzen drin).
-
Gut. float habe ich in int geändert.
Jetzt habe ich nur 2 Fehler
:
spiel.c:26: error: storage class specifiers invalid in parameter declarations spiel.c:26: error: storage class specified for parameter `feld'
wenn ich ehrlich bin verste ich von dem ganzen da oben nur class, error, in und for
Wenn ich aber bei den funktionen das int wegmachen, kommen tausende Fehler!(deßhalb lasse ich sie lieber ;))... das geleiche passiert auch nur, wenn ich sie im mainteil wegmachen.
spiel.c:7: error: ISO C++ forbids declaration of
KI' with no type spiel.c: In function
int KI(float)':
spiel.c:11: error: invalid typeschar[9][float]' for array subscript spiel.c:13: error: invalid operands of types \
float' and `int' to binaryoperator%' spiel.c:14: error: invalid types
char[9][float]' for array subscript
spiel.c:18: error: invalid typeschar[9][float]' for array subscript spiel.c:22: warning: converting to \
int' from `float'
spiel.c: At global scope:
spiel.c:26: error: ISO C++ forbids declaration ofzeigezug' with no type spiel.c:26: error: storage class specifiers invalid in parameter declarations spiel.c:26: error: storage class specified for parameter
feld'
spiel.c:41: error: ISO C++ forbids declaration ofhuman' with no type spiel.c: In function
int main()':
spiel.c:26: error: too few arguments to functionint zeigezug(char*)' spiel.c:55: error: at this point in file spiel.c:26: error: too few arguments to function
int zeigezug(char*)'
spiel.c:62: error: at this point in file
spiel.c:7: error: too few arguments to functionint KI(float)' spiel.c:63: error: at this point in file spiel.c:26: error: too few arguments to function
int zeigezug(char*)'
spiel.c:64: error: at this point in file
spiel.c:26: error: too few arguments to functionint zeigezug(char*)' spiel.c:66: error: at this point in file spiel.c:7: error: too few arguments to function
int KI(float)'
spiel.c:67: error: at this point in file
spiel.c:26: error: too few arguments to functionint zeigezug(char*)' spiel.c:68: error: at this point in file spiel.c:26: error: too few arguments to function
int zeigezug(char*)'
spiel.c:70: error: at this point in file
spiel.c:7: error: too few arguments to functionint KI(float)' spiel.c:71: error: at this point in file spiel.c:26: error: too few arguments to function
int zeigezug(char*)'
spiel.c:72: error: at this point in file
spiel.c:26: error: too few arguments to functionint zeigezug(char*)' spiel.c:74: error: at this point in file spiel.c:7: error: too few arguments to function
int KI(float)'
spiel.c:75: error: at this point in file
spiel.c:26: error: too few arguments to functionint zeigezug(char*)' spiel.c:76: error: at this point in file spiel.c:26: error: too few arguments to function
int zeigezug(char*)'
spiel.c:78: error: at this point in file
spiel.c:7: error: too few arguments to functionint KI(float)' spiel.c:82: error: at this point in file spiel.c:26: error: too few arguments to function
int zeigezug(char*)'
spiel.c:83: error: at this point in file
spiel.c:91:2: warning: no newline at end of file#include <stdio.h> #include <time.h> // für rand(time(null)) #include <stdlib.h> // für rand int KI(int xodero) { char feld[9]; int i; i=rand()%10; feld[i]; if (xodero%2) { feld[i]='X'; } else { feld[i]='O'; } xodero++; return xodero; } // schließt KI int zeigezug(extern char feld[]) { printf(" A | B | C |"); printf(" +----+----+----+"); printf(" 1 | %f | %f | %f |",feld[0],feld[1],feld[2]); printf(" +----+----+----+"); printf(" 2 | %f | %f | %f |",feld[3],feld[4],feld[5]); printf(" +----+----+----+"); printf(" 3 | %f | %f | %f |",feld[6],feld[7],feld[8]); printf(" +----+----+----+\n"); // === HIER MUSS GEGUCKT WERDEN OB ALLE FELDER VOLL SIND, WENN JA SOLL BOOL EIN FALSH WERT AN DIE SCHLEIFE ZURÜCK GEBEN. } int human() { printf ("Humannnnnn"); } int main() { int x,wahl; printf ("Gegen wen wollen Sie Spielen?:\n 1. Human vs. Human\n 2. Human vs. KI\n 3. KI vs. KI"); scanf ("%f",&wahl); // ist das & richtig, oder zeigt es jetzt auf ein Speicher? // "pointer" haben mich durcheinander gebracht :D switch(wahl) { case 1: int human(); int zeigezug(); x--; break; case 2: int human(); int zeigezug(); int KI(); int zeigezug(); int human(); int zeigezug(); int KI(); int zeigezug(); int human(); int zeigezug(); int KI(); int zeigezug(); int human(); int zeigezug(); int KI(); int zeigezug(); int human(); int zeigezug(); break; case 3: int KI(); int zeigezug(); break; default: printf ("ungültige option"); } return 1; }
-
Erstens: Ein Parameter kann nicht "extern" sein (betrifft den Prototyp von zeigezug).
Zweitens: Such dir ein gutes Buch über C und mach dir klar, wie eine Funktion aufgerufen werden muß (insbesondere muß man an die Funktion auch Parameter übergeben).
-
ach ja, das habe ich ganz vergessen ... ich habe jetzt in jede funktion feld[i] geschrieben, da jede funktion feld[i] braucht und zurückgeben muss. human() soll später auch den wert feld[i] zurückgeben, das mache ich aber erst, wenn der rest ok ist.
#include <stdio.h> #include <time.h> // für rand(time(null)) #include <stdlib.h> // für rand int KI(char feld[9]) { int i; i=rand()%10; feld[i]; if (xodero%2) { feld[i]='X'; } else { feld[i]='O'; } xodero++; return feld[i]; } // schließt KI int zeigezug(extern char feld[9]) { printf(" A | B | C |"); printf(" +----+----+----+"); printf(" 1 | %f | %f | %f |",feld[0],feld[1],feld[2]); printf(" +----+----+----+"); printf(" 2 | %f | %f | %f |",feld[3],feld[4],feld[5]); printf(" +----+----+----+"); printf(" 3 | %f | %f | %f |",feld[6],feld[7],feld[8]); printf(" +----+----+----+\n"); // === HIER MUSS GEGUCKT WERDEN OB ALLE FELDER VOLL SIND, WENN JA SOLL BOOL EIN FALSH WERT AN DIE SCHLEIFE ZURÜCK GEBEN. } int human() { printf ("Humannnnnn"); } int main() { int x,wahl; printf ("Gegen wen wollen Sie Spielen?:\n 1. Human vs. Human\n 2. Human vs. KI\n 3. KI vs. KI"); scanf ("%f",&wahl); // ist das & richtig, oder zeigt es jetzt auf ein Speicher? // "pointer" haben mich durcheinander gebracht :D switch(wahl) { case 1: int human(feld[i]); int zeigezug(feld[i]); x--; break; case 2: int human(feld[i]); int zeigezug(feld[i]); int KI(feld[i]); int zeigezug(feld[i]); int human(feld[i]); int zeigezug(feld[i]); int KI(feld[i]); int zeigezug(feld[i]); int human(feld[i]); int zeigezug(feld[i]); int KI(feld[i]); int zeigezug(feld[i]); int human(feld[i]); int zeigezug(feld[i]); int KI(feld[i]); int zeigezug(feld[i]); int human(feld[i]); int zeigezug(feld[i]); break; case 3: int KI(feld[i]); int zeigezug(feld[i]); break; default: printf ("ungültige option"); } return 1; }
-
oh, ich habe große scheiße geschrieben. Ich werde mich morgen nochmal melden
-
http://www.pronix.de/pronix-4.html
das liest du jetzt von vorne bis hinten.und wenn du dir persoenlich einen gefallen tun willst, schreibst du dein programm neu.