我正在尝试将维基百科上的Minimax算法调整为我在Scala中实现的TicTacToe游戏。我希望X玩家(-1)能够尽量最大化其得分。我找到一个很棒的静态评估函数,在这里,我想使用它。如果棋盘对玩家有利,该函数会返回正数;如果对玩家不利,则返回负数。我尝试了几种变体,但X玩家总是选择第一个可用的移动。方法如下,方法和评估函数可以在这里找到。
我是否遗漏了什么明显的问题?
// 玩家X = -1, 玩家O = 1
def minmax(board:Array[Int], height:Int, player:Int):Double={
if(height == 0)
evaluatePosition(board, player)
var alpha = -player * Double.PositiveInfinity;
val allBoards = makeAllPossibleMoves(board, player) // 子棋盘数组
for(b <- allBoards){
val score = minmax(b, height-1, -player)
alpha = if (player == -1) Math.max(alpha, score) else Math.min(alpha, score)
}
alpha
}
回答:
看起来alpha
的初始化值是错误的:
var alpha = -player * Double.PositiveInfinity
这意味着对于X
玩家(-1),alpha
被初始化为
var alpha = - (-1) * Double.PositiveInfinity
这可以简化为
var alpha = Double.PositiveInfinity
因此,alpha无法再增加,即
alpha = if (player == -1) Math.max(alpha, score) else //...
将不会产生效果。对于另一个玩家(1),alpha
被初始化为负无穷大,因此也无法再被最小化。因此,你可以通过简单地从alpha
的初始化中移除-1
因子来修复这个问题:
var alpha = player * Double.PositiveInfinity