Problem bei KI fuer VierGewinnt ! -> rekursiv...
-
hallo..
schon lange nix mehr gepostet.. wird mal zeit
also ich bin grade dabei einen rekursiven algorithmus fuer das Spiel
VierGewinnt zu schreiben...
ich bin eigentlich schon fertig.. nur hab ich noch probleme mit
der rekursiven bewertung fuer den computer ...:die sache ist so aufgebaut:
ich habe eine bewertungsfunktion geschrieben, die in der lage ist, eine
bestimmte spalte zu bewerten...
dies tut er nach folgendem schema:er geht in die spalte und schaut, an welcher position ein Chip gesetzt werden kann. Hat er die genaue position, checkt er genau dort seine Umgebung ab,
indem er sternförmig immer 3 felder neben dieser position untersucht und entsprechend die dazu passende bewertung sich herauspickt !so:
?..?..?
.?.?.?.
..???..
???x???
..???..
.?.?.?.
?..?..?d.h. er gibt fuer jede richtung eine bewertung ab und summiert am schluss alle einzelbew. zu einer gesamtbew. !
aber das nur zur einfuehrung.. dieser code funktioniert einwandtfrei..
mein problem liegt jetz mehr bei der rekursiven bewertung:dazu habe ich folgende funktion geschrieben:
int denke(struct VierGewinnt *vier, int zug) { int spalte, bewertung[8], maxpos, max = -10000, i; if(zug == 1 || zug == 3 || zug == 5 || zug == 7) vier->werzieht = 2; else vier->werzieht = 1; if(spielfertig(vier) != 0 || zug <= vier->zugtiefe) { for(spalte = 1; spalte <= 7; spalte++) { if(vier->feld[spalte-1][0] == 0) // prüfen ob spalte frei ist... { if(zug < vier->zugtiefe) // er setzt chips bis zur letzten ebene SetChip(vier, spalte, vier->werzieht); // die letzte ebene lässt er frei zum bewerten if(zug == vier->zugtiefe) bewertung[spalte] = bewerte(vier, spalte, 0); // wenn alle rekursionen durch sind bewertet er zweigweise else bewertung[spalte] = denke(vier, zug+1); // ansonsten generiert er for-schleifen bis zugtiefe erreicht vier->zugfolge[spalte] = bewertung[spalte]; for(i=1; i<8 ;i++) // wenn alle spalten bewertet sind, { // sucht er nach spalte mit hoechster bewertung... if (bewertung[i] <= max) continue; max = bewertung[i]; // max ist dann die endgueltige bewertung fuer den zweig maxpos = i; // (maxpos wäre die maximale position) } if(max > bewertung[spalte]) { bewertung[spalte] = max; //vier->zugfolge[spalte] = max; } //vier->maxpos = maxpos; if(zug != vier->zugtiefe) { for(int z=0; z<= 5; z++) // gesetzten Chip finden und zurücksetzen ! { if(vier->feld[spalte-1][z] != 0) { vier->feld[spalte-1][z] = 0; break; } } } } } } vier->maxpos = maxpos; return max; }
ich hab jetz 2 probleme:
-
bei spieltiefe 2 4 und 6 hab ich keine ahnung was er macht...
er setzt immer in spalte 1, egal wie ich mich verhalte... -
bei spieltiefe 3 und 5 macht er zwar was, aber ich weiss nicht ob er alles richtig bewertet, wie er es sollte..
bei spieltiefe 1 verhält er sich dagegen perfekt.. also an der bewertungsfunktion kanns nich liegen
also vielleicht sieht gleich jemand was..., habe noch nie was mit rekursiv gemacht..
wo ich noch am meisten schwimme ist beim rückgabewert der rekursiven funktion..mfg haMMer
-
-
...