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

井字棋AI未采用Minimax最优走法问题排查

井字棋Minimax AI失效问题修复方案

核心问题分析

你的Minimax算法未正确选择最优走法,根源在于三个关键逻辑错误:

1. 递归层玩家未切换,胜负判断逻辑错位

模拟落子后未切换玩家就进入递归,导致所有递归层的current_player始终为同一对象,无法正确评估双方的博弈策略。同时,胜负判断错误地以当前玩家为判定依据,而非实际落子的玩家。

2. 状态回溯不完整

回溯时仅重置了_has_winner,但未清空winner_combo,残留的获胜组合会干扰后续的胜负判断逻辑。

3. 直接修改原游戏状态

递归过程中直接修改真实游戏对象的状态,而非使用副本,导致真实游戏流程被临时修改,引发逻辑混乱。

修复后的代码实现

步骤1:重构Minimax函数,使用游戏副本并正确切换玩家

替换原minimax方法,通过深拷贝游戏对象避免修改真实状态,同时在模拟落子后正确切换玩家:

def minimax(self, game_state, is_ai):
    # 基于传入的游戏副本进行评估,不影响真实游戏状态
    if game_state.has_winner():
        # 根据获胜组合的落子玩家判断胜负
        winner_label = game_state._current_moves[game_state.winner_combo[0][0]][game_state.winner_combo[0][1]].label
        return 10, None if winner_label == 'O' else -10, None
    elif game_state.is_tied():
        return 0, None

    best_score = -1000 if is_ai else 1000
    best_move = None

    for row, col in game_state.get_possible_moves():
        # 创建游戏状态的深拷贝
        new_game = copy.deepcopy(game_state)
        move = Move(row, col, new_game.current_player.label)
        new_game.process_move(move)
        
        # 模拟落子后切换玩家,再进入下一层递归
        new_game.toggle_player()
        score, _ = self.minimax(new_game, not is_ai)

        # 更新最优分数和走法
        if is_ai and score > best_score:
            best_score = score
            best_move = (row, col)
        elif not is_ai and score < best_score:
            best_score = score
            best_move = (row, col)

    return best_score, best_move

步骤2:修改AI落子逻辑,传入游戏副本调用Minimax

更新ai_play方法,确保Minimax基于游戏副本计算最优走法:

def ai_play(self):
    # 传入原游戏的深拷贝给Minimax算法
    _, (row, col) = self.minimax(copy.deepcopy(self._game), True)
    move = Move(row, col, self._game.current_player.label)
    if self._game.is_valid_move(move):
        self._game.process_move(move)
        # 更新UI按钮状态
        for button, (button_row, button_col) in self._cells.items():
            if button_row == row and button_col == col:
                self._update_button(button)
        # 处理游戏结束逻辑
        if self._game.is_tied():
            self._update_display(msg="平局!", color="red")
        elif self._game.has_winner():
            self._highlight_cells()
            msg = f'玩家 "{self._game.current_player.label}" 获胜!'
            color = self._game.current_player.color
            self._update_display(msg, color)
        else:
            self._game.toggle_player()
            msg = f"{self._game.current_player.label} 的回合"
            self._update_display(msg)

修复效果

修改完成后,AI会通过Minimax算法正确遍历所有可能的走法,选择能最大化自身优势(获胜或确保平局)的最优落子,不再按行列顺序机械落子。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:26:03