Soweit ich es verstanden habe, ist dein Hauptproblem folgendes: dir wurde gezeigt, wie man minimax in einer Situation benutzt, in der max/min im Zyklus läuft und du jetzt ein Spiel hast, in dem manchmal ein Spieler mehrere Züge machen kann eine Reihe.
Ich werde Ihnen den allgemeinen Ansatz erklären, der für praktisch jedes Spiel funktioniert, und dann werde ich ein paar Dinge hinzufügen, die für Mancala anders gemacht werden können.
So der allgemeine Ansatz
Standard-Minimax geht so:
function minimax(node, depth, maximizingPlayer)
if depth = 0 or node is a terminal node
return the heuristic value of node
if maximizingPlayer
bestValue := -∞
for each child of node
val := minimax(child, depth - 1, FALSE)
bestValue := max(bestValue, val)
return bestValue
else
bestValue := +∞
for each child of node
val := minimax(child, depth - 1, TRUE)
bestValue := min(bestValue, val)
return bestValue
Wo Sie die Minimax-Aufruf mit max/min initialisieren und dann ändert sich ständig. In Ihrem Fall müssen Sie nur einen winzigen Scheck hinzufügen.
function minimax(node, depth, maximizingPlayer)
if depth = 0 or node is a terminal node
return the heuristic value of node
if maximizingPlayer
bestValue := -∞
for each child of node
# here is a small change
if freeTurn(child):
isMax := TRUE
else:
isMax := FALSE
val := minimax(child, depth - 1, isMax)
bestValue := max(bestValue, val)
return bestValue
else
bestValue := +∞
for each child of node
# here is a small change
if freeTurn(child):
isMax := FALSE
else:
isMax := TRUE
val := minimax(child, depth - 1, isMax)
bestValue := min(bestValue, val)
return bestValue
Wo Ihre Funktion freeTurn
gelangen Sie, ob Sie eine kostenlose Turn nach der aktuellen Bewegung haben. Beachten Sie, dass es für diesen Algorithmus keinen Unterschied gibt, ob Sie nur 2 Züge hintereinander oder 5 Züge hintereinander ausführen können.
In Bezug auf Mancala
Es gibt viele Variationen von mancala, aber der Verzweigungsfaktor des Spiels ist ziemlich klein (in dem einen, den ich kenne < = 6). Angenommen, Sie haben drei Züge A
, B
, C
, und bewegen Sie C
können Sie noch einmal spielen. Von der Position C
können Sie Bewegungen C1
, C2
tun. So können Sie sie kombinieren (C + C1
, C + C2
) und behandeln sie als nur einen Zug (kleine Buchhaltung sollte getan werden, um daran zu erinnern, dass dies tatsächlich zwei Züge ist).Jetzt haben Sie am Ende Ihre min max Iterationen, wo Sie nicht 4, sondern 5 Züge haben: A
, B
, C + C1
, C + C2
, D
. Eigentlich ist es nicht falsch, diesen Ansatz für Spiele mit einem größeren Verzweigungsfaktor zu verwenden.
Ok, also wird es die mini, max, min, max Struktur halten, ich werde eine nutzlose min zwischen jedem Max, der sich wiederholt, platzieren? – Zapnologica
Ja, es sei denn, Sie haben eine bessere Idee. –
Wie wirkt sich dies auf eine mögliche Lagentiefe aus? – Zapnologica