基于minimax算法的井字棋AI无法找到最优走法问题排查
井字棋minimax AI得分异常问题排查
核心代码错误点
- 最优走法选择逻辑作用域错位
你写的最优得分筛选循环,被放在了遍历空落子位置的for循环内部:每尝试完1个落子、把走法推入possibleMoves数组后,就立刻执行一次选最优的逻辑,完全没等所有可能的落子遍历完成。
这种写法下,假设第一个被遍历到的落子是会导致输局的位置,这时候possibleMoves数组里只有这1个元素,会直接把它标记为最优走法;后续哪怕遍历到能直接获胜的走法,因为循环内作用域和var变量提升的影响,最优索引的计算很容易被干扰,根本没法在全量走法集合里选出最高的10分赢局走法。 - 空格判断的数据源引用错误
代码中计算emptyCells时,使用了全局board数组做过滤,而非函数传入的gameBoard参数。递归过程中临时修改的是传入的gameBoard引用,空格判断却始终读取外层的原始棋盘数据,会导致递归分支漏算合法落子位置,棋盘状态和分支推演的实际状态不匹配,本应存在的获胜分支甚至不会被纳入计算。 - 嵌套循环的变量重名问题
外层遍历空格的循环用了变量i,内层筛选最优走法的循环也重新声明了i,在var的变量提升机制下,会直接修改外层循环的计数,导致空格遍历提前中断,漏算大量走法分支。
正确的逻辑顺序
所有可能的走法必须先全部收集完成,再统一做最优值筛选:
- 遍历所有空单元格,逐次模拟落子、递归计算对应走法的得分、撤销棋盘修改,把所有走法和得分存入
possibleMoves数组 - 等全量走法收集完毕后,再根据当前是bot(取最高分max)还是人类玩家(取最低分min),统一遍历
possibleMoves选出对应最优得分的走法 - 空格计算直接基于传入的
gameBoard做过滤,不引用外部全局棋盘变量
内容的提问来源于stack exchange,提问作者Sujal Motagi
相关产品推荐
相关产品推荐

