我必须做一个我们需要实施mancala棋盘游戏的项目,然后为它实现AI。
我们已经被指示我们需要修改或更改minimax树以便能够与mancala一起使用,因为在游戏中玩家可以连续多次转弯。
我已经实现了我的游戏逻辑和GUI,但现在在我开始使用AI之前,我想尝试一下它背后的理论。我在网上搜索了非转弯的迷你最大树,我似乎无法找到任何东西。但是我看到很多人都在谈论使用minimax来制作mancala。
现在,我理解了正常的minimax树以及每个级别如何在最小节点和最大节点之间交替。有了我现在需要的树,我会说:min > max > max > min > max
如果第二个玩家有两个转弯吗?
我们还需要能够指定Minimax树的给定层深度。我们还需要进行alpha beta修剪,但是一旦我真的有了树,那就是以后的。[/ p>
答案 0 :(得分:3)
据我所知,你的主要问题如下:你已经看到如何在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
mancala有很多变种,但游戏的分支因素非常小(我所知道的是<= 6)。现在假设您有三个移动A
,B
,C
,D
,移动C
可让您再玩一次。从C
位置,您可以移动C1
,C2
。因此,您可以将它们组合起来(C + C1
,C + C2
)并将它们视为一次移动(应该进行小额记账以记住这实际上是两个动作)。所以现在你最终得到最小的最大迭代次数,你没有4次移动:A
,B
,C + C1
,C + C2
,D
。实际上,对于具有更大分支因子的游戏,使用这种方法并没有错。
答案 1 :(得分:0)
如果一方可以在一个回合中有多个动作,那么必须有某种方法来检测它。当检测到具有用于对手的移动生成器时生成仅包含空移动的列表,即不执行任何操作的移动。对手将被迫进行该动作(什么都不做),然后第一个玩家可以计算他的下一步动作。