You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

井字棋Minimax算法输出异常排查:代码正常但结果错误

问题排查与修复方案

我来帮你梳理下这段Minimax代码里的问题,这些就是导致AI输出最优落子不正确的核心原因:


1. 平局状态的分值判定错误

当棋盘填满(depth == 9)时,这是一个平局,应该返回0作为分值,但你的代码里直接返回了初始的bestVal:

  • AI回合时bestVal初始是-9999,人类回合是+9999,这会让平局被错误判定为极端的输或赢,完全打乱Minimax的决策逻辑。

2. 落子位置初始化不合理

你把a和b固定初始化为0,但如果最优落子位置不是(0,0),在某些递归场景下(比如第一个遍历的位置不是最优,但后续没有找到更优解时),会错误返回(0,0)作为落子位置。正确的做法是先初始化为无效位置,在找到第一个可行空位时再更新。

3. 递归返回值的冗余类型转换(小问题,但建议修正)

你多次用int(l[0])转换返回值,其实递归返回的l[0]本来就是整数,没必要额外转换,容易引入不必要的类型风险。


修复后的完整代码

import copy

def AI_makemove(board_state, isAI, depth):
    temp_board = copy.deepcopy(board_state)
    depth += 1  # 落子后填充数+1,这个逻辑是正确的
    
    if isAI:
        bestVal = -9999
        a, b = -1, -1  # 初始化为无效位置,避免默认(0,0)的干扰
        for i in range(3):
            for j in range(3):
                if temp_board[i][j] == 0:
                    temp_board1 = copy.deepcopy(temp_board)
                    temp_board1[i][j] = 2
                    # AI落子后直接获胜,返回最高分1和当前位置
                    if check_if_won(2, temp_board1):
                        return [1, i, j]
                    # 棋盘填满,平局返回0和当前位置
                    if depth == 9:
                        return [0, i, j]
                    # 递归调用人类回合,评估后续结果
                    l = AI_makemove(temp_board1, False, depth)
                    if l[0] > bestVal:
                        bestVal = l[0]
                        a, b = i, j
        return [bestVal, a, b]
    else:
        bestVal = 9999
        a, b = -1, -1
        for i in range(3):
            for j in range(3):
                if temp_board[i][j] == 0:
                    temp_board1 = copy.deepcopy(temp_board)
                    temp_board1[i][j] = 1
                    # 人类落子后直接获胜,返回最低分-1和当前位置
                    if check_if_won(1, temp_board1):
                        return [-1, i, j]
                    # 棋盘填满,平局返回0和当前位置
                    if depth == 9:
                        return [0, i, j]
                    # 递归调用AI回合,评估后续结果
                    l = AI_makemove(temp_board1, True, depth)
                    if l[0] < bestVal:
                        bestVal = l[0]
                        a, b = i, j
        return [bestVal, a, b]

额外说明

  • 请确保check_if_won函数能正确判断玩家(1代表人类,2代表AI)是否获胜,这是Minimax算法正确运行的前提。
  • 如果你想让AI优先选择最快获胜的路径,可以优化分值计算:比如获胜时返回10 - depth,失败时返回depth - 10,这样AI会倾向于用更少的步骤赢下游戏,这属于可选优化项,不影响核心决策逻辑。

内容的提问来源于stack exchange,提问作者Ravi Bhatt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:20:58