Oh, ganz vergessen: Es ist einfache Mühle...
Der Bot verliert nicht. Wenn der Gegner einigermassen klar im Kopf ist dauert so das Spiel unendlich lange. Der Bot macht keine Fehler.
Versorgungsspannung vom Trafo (12V) im Leerlauf sind 17V... Also nix für Servos. Jo, für die echte Mühlen-KI wars zu dick, zu viele Möglichkeiten und Strategien. Ich hab mit einem ETH-Prof gesprochen, der damals das Mühlespiel komplett identifiziert hat (alle möglichen Situationen )das sind Daten über 2GB... Sein Bot hat alle möglichen Situationen gespeichert und führt auf jede Situation den passenden Zug aus..
Meine KI denkt 2 Ebenen tief, d.H. er betrachtet alle Möglichkeiten, die er selber fahren kann, und danach noch alle folgenden Möglichkeiten, die der Gegner fahren kann. (Minimax-Algorithmus). Ich verwende keine "Vereinfachungsstategien" wie Alpha-Beta Pruning, er braucht eh nur 300ms um den Zug zu berechnen.
Programmiert in Bascom, sind ca. 1200 Zeilen bis jetzt, werden wohl noch 500 mehr.
Hier mal ein Codeschnipsel:
Code:
Ebene2:
If Spielphase = 0 Then
'Aus dem Ebene1-Array müssen schrittweise die Feler ausgelesen werden. Dann wird daraus jeweils ein neues Feld erzeugt, welches dann bewertet wird.
For I = 1 To Zugzahl ' Zugzahl aus voriger Routine. Es müssen die jeweils leicht veränderten Felder ins Momfeld eingetragen werden.
Zugzahl2 = 0
A = I - 1
A = A * 9
For M = 1 To 9
A = A + M
If Ebene1(a) = 0 Then 'Hier wird bestimmt, wieviele Züge man vom Knoten der ersten Ebene in die zweite Ebene machen kann.
Incr Zugzahl2
End If
A = A - M
Next M
For B = 1 To Zugzahl2
C = 1
A = I - 1
A = A * 9
For J = 1 To 9
A = A + J
If C = 1 Then
If Ebene1(a) <> 0 Then
Momfeld(j) = Ebene1(a)
Elseif Ebene1(a) = 0 Then
Momfeld(j) = Gezogenezuege2 ' Der (virtuelle) Gegner ist nun dran mit setzen.
Ebene1(a) = 10
C = 2
End If
Elseif C = 2 Then
Momfeld(j) = Ebene1(a)
End If
A = A - J
Next J
For D = 1 To 9
If Momfeld(d) = 10 Then ' Die 10s werden durch 0 ersetzt.
Momfeld(d) = 0
End If
Next D
Gosub Bewerten ' Hier wird das momentane Momfeld zur Bewertung geschickt.Es wird hierher zurückgekehrt
Next B
Next I
For I = 1 To 81
If Ebene1(i) = 10 Then
Ebene1(i) = 0
End If
Next
Hier berechnet er alle möglichen Züge, die der Gegner nach seinem Zug machen kann, falls man noch in der ersten Spielphase ist (Steine setzen), diese speichert er in einem Array.
Der Code ist sehr "holprig" geraten, man könnte noch viele Variablen einsparen und verbessern, das lass ich vorerst aber, never change a running system...
Entwickelt hab ich die Speicherstrategien und Abläufe auf einem A3-Block, hat sich super bewährt!
Lesezeichen