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

调试p5.js中井字棋NegaMax算法的AI平局逻辑异常问题

问题定位与修复方案

核心问题分析

你的NegaMax实现存在三个关键逻辑漏洞,直接导致AI行为异常:

  • 游戏结束状态未区分胜负和平局:IsGameOver()仅判断游戏是否结束,但NegaMax对所有结束状态统一返回10,AI无法区分自己获胜、玩家获胜还是平局,进而做出错误决策。
  • 缺少深度衰减机制:所有获胜状态返回相同分数,AI不会优先选择最快获胜的走法,也无法避免会导致快速失败的走法。
  • 平局状态未处理:当棋盘填满但无胜者时,没有返回对应分数(平局应得0分),导致递归逻辑混乱。

修复步骤

1. 完善游戏结束状态的判断与分数返回

新增或修改函数,明确区分当前结束状态的结果:

  • AI获胜:返回正分(如10 - depth,depth为当前递归深度,让AI优先选择最快获胜的走法)
  • 玩家获胜:返回负分(如depth - 10,让AI避免快速失败)
  • 平局:返回0分

2. 给NegaMax函数添加深度参数

递归时传递当前深度,用于计算带权重的分数,引导AI选择最优路径。

3. 修正AI函数的初始调用逻辑

AI作为当前玩家调用NegaMax时,初始深度设为1(因为AI已走一步),并通过负号反转递归结果,符合NegaMax核心逻辑。

修改后的核心代码

function AI() {
  let bestMove = { x: 0, y: 0 };
  let bestScore = -Infinity;
  for (let i = 0; i < GRIDSIZE; i++) {
    for (let j = 0; j < GRIDSIZE; j++) {
      if (isMoveValid(i, j)) {
        makeMove(i, j);
        // AI走棋后轮到玩家,初始深度为1
        let score = -NegaMax(1);
        undoMove(i, j);

        if (score > bestScore) {
          bestScore = score;
          bestMove = { x: i, y: j };
        }
      }
    }
  }
  makeMove(bestMove.x, bestMove.y);
}

function NegaMax(depth) {
  // 先判断当前胜负状态
  let winner = checkWinner();
  if (winner === 'AI') {
    // AI获胜,分数随深度减小,优先快速获胜
    return 10 - depth;
  } else if (winner === 'Player') {
    // 玩家获胜,分数为负,失败越晚损失越小
    return depth - 10;
  } else if (isBoardFull()) {
    // 平局返回0分
    return 0;
  }

  let bestScore = -Infinity;
  for (let i = 0; i < GRIDSIZE; i++) {
    for (let j = 0; j < GRIDSIZE; j++) {
      if (isMoveValid(i, j)) {
        makeMove(i, j);
        // NegaMax核心:反转递归分数,深度+1
        let score = -NegaMax(depth + 1);
        undoMove(i, j);
        bestScore = max(score, bestScore);
      }
    }
  }
  return bestScore;
}

// 新增辅助函数:判断当前胜者
function checkWinner() {
  // 根据你的棋盘数据结构实现,返回'AI'、'Player'或null
  // 示例逻辑:检查行、列、对角线是否有连续相同标记
}

// 新增辅助函数:判断棋盘是否已满
function isBoardFull() {
  for (let i = 0; i < GRIDSIZE; i++) {
    for (let j = 0; j < GRIDSIZE; j++) {
      if (isMoveValid(i, j)) {
        return false;
      }
    }
  }
  return true;
}

关键说明

  • 胜负判断函数:checkWinner()需要匹配你的棋盘存储逻辑,准确识别AI或玩家的获胜状态。
  • 深度衰减逻辑:通过10 - depth和depth - 10,让AI优先选择最快获胜路径,同时尽量拖延失败时间。
  • 平局处理:明确平局得0分,让AI在无法获胜时优先选择平局,而非主动走向失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:45:29