Algorithm Negamax-玩家移动两次
如果满足条件,你如何处理同一玩家移动的游戏 我试过这样的方法,但我觉得不太对:Algorithm Negamax-玩家移动两次,algorithm,minmax,Algorithm,Minmax,如果满足条件,你如何处理同一玩家移动的游戏 我试过这样的方法,但我觉得不太对: function negamax(node, depth, α, β, color) if node is a terminal node or depth = 0 return color * the heuristic value of node else foreach child of node if (condition is met)
function negamax(node, depth, α, β, color)
if node is a terminal node or depth = 0
return color * the heuristic value of node
else
foreach child of node
if (condition is met) // the same player moves
val := negamax(child, depth-1, α, β, color)
else
val := -negamax(child, depth-1, -β, -α, -color)
if val≥β
return val
if val≥α
α:=val
return α
在negamax中,您正在探索一种树结构,其中每个节点都有对应于玩家移动的子节点。如果在某些情况下,一个玩家可以移动两次,你可能会认为该玩家的“移动”是该玩家所做的两次移动序列。更一般地说,您应该将当前游戏状态的子级视为当前玩家在轮到他们之后可以使游戏进入的所有可能状态。这包括一个移动可以达到的所有游戏状态,以及如果玩家能够在一个回合中做出两个移动,那么两个移动可以达到的所有游戏状态。因此,您应该保持negamax的基本逻辑不变,但要更新代码以生成后续状态,以处理单个玩家可以移动两次的情况
希望这有帮助 不要尝试为此更改minimax算法本身,而是修改游戏表示以适应。基本上有两种解决方案:
我应该说,正确处理极小极大族是非常困难的。用高级语言设计游戏搜索AI的一个技巧是在更简单的游戏上测试搜索算法(缩小棋盘大小,使用tic-tac-toe等),以确保正确性。如果游戏很小,你可以玩。通过手动和b进行游戏,确保其结果有意义。测试高级算法,例如确保它们给出与naive negamax相同的答案。尝试使具有游戏特定行为(评估函数、棋盘表示、搜索和存储启发式等)的代码远离执行树搜索的代码也是一个好主意 当条件满足时,不要减少深度。如果你能解释更多关于所有变量的信息,我们可能会帮助…@Dhaivat Pandya代码摘录取自wiki ah。那么,这不完全是游戏开发,是吗?@Dhaivat:为什么不是?例如,你可以在绘图/检查评估函数中使用它。@John:你为什么不认为它是对的?在我看来不错。我不够清楚,如果满足某些条件,球员可以多次移动。因此,如果我要实现您的解决方案,我将处理一个新的树结构,只是为了找到节点的后续节点。@JohnRetallack-是的,这是正确的。我认为关键的想法是要认识到“移动”不仅仅是一个游戏,而是一个玩家的完整游戏序列,而另一个玩家不能干预。或者,您可以将一名玩家的一系列移动想象为一系列交替移动,其中另一名玩家被迫执行“无操作”移动。@templatetypedef:操作代码有什么问题?在我看来,这很好。@TonyK-我担心的是,如果一个玩家可以反复玩动作,negamax代码将永远不允许另一个玩家移动,因此无法在适当的深度对游戏进行准确评估。将移动捆绑在一起会迫使玩家交替轮换,直到达到深度,从而更好地了解游戏状态。@templatetypedef:相反,如果第一个玩家有一大串连续移动可供选择,则按自己的方式操作可能会导致组合爆炸。