据我了解,您的主要问题如下:已经向您展示了如何在 max / min 循环的情况下使用 minimax,现在您有一个游戏,有时一个玩家可以连续执行多个动作。
我将向您解释基本上适用于任何游戏的一般方法,然后我将添加一些可以为 mancala 以不同方式完成的事情。
所以一般做法
标准极小极大是这样的:
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
用 max/min 初始化 minimax 调用,然后它会不断变化。在您的情况下,您只需要添加一张小支票。
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
freeTurn
无论您在当前移动后是否有自由转弯,您的函数都会返回您的位置。请注意,无论您只能连续移动 2 次还是连续移动 5 次,此算法都没有区别。
关于曼卡拉
mancala 有很多变体,但游戏的分支因子非常小(我知道的那个是 <= 6)。现在假设你有 3 个动作A
, B
, C
,D
和 moveC
可以让你再玩一次。从C
你可以做动作的位置C1
,C2
。因此,您可以将它们组合在一起(C + C1
, C + C2
)并将它们视为一个动作(应该做一些小簿记以记住这实际上是两个动作)。所以现在你最终得到了你的最小最大迭代,你没有 4 步而是 5 步:A
, B
, C + C1
, C + C2
, D
. 实际上,将这种方法用于具有较大分支因子的游戏并没有错。