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:

    1. bei spieltiefe 2 4 und 6 hab ich keine ahnung was er macht...
      er setzt immer in spalte 1, egal wie ich mich verhalte...

    2. 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



  • ...


Anmelden zum Antworten