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

如何让code.org AppLab中井字棋AI做出智能落子决策?

井字棋智能AI落子实现方案(Code.org AppLab)

核心思路

井字棋的最优AI实现依赖极小极大算法(Minimax),这是零和博弈场景下的经典算法,能确保电脑要么获胜要么逼平,不会出现失误。相比你之前尝试的else if分支判断,该算法能遍历所有可能的落子路径,避免遗漏复杂博弈场景。

具体实现步骤

1. 游戏状态评估函数

先实现一个函数,用于判断当前棋盘的胜负状态,并返回对应分数:

  • 电脑('O')获胜:返回10
  • 玩家('X')获胜:返回-10
  • 平局:返回0
  • 游戏未结束:返回null
function evaluate(board) {
  // 定义所有获胜组合(行、列、对角线)
  const winPatterns = [
    [0,1,2], [3,4,5], [6,7,8],
    [0,3,6], [1,4,7], [2,5,8],
    [0,4,8], [2,4,6]
  ];
  
  // 检查所有获胜组合
  for (let pattern of winPatterns) {
    const [a, b, c] = pattern;
    if (board[a] === board[b] && board[b] === board[c]) {
      if (board[a] === 'O') return 10;
      else if (board[a] === 'X') return -10;
    }
  }
  
  // 检查是否平局(无空位置)
  if (!board.includes('')) return 0;
  
  // 游戏未结束
  return null;
}

2. 极小极大递归函数

通过递归模拟所有可能的落子,计算每个落子的最终得分:

  • 电脑回合(最大化得分):选择能带来最高得分的落子
  • 玩家回合(最小化得分):模拟玩家会选择能让电脑得分最低的落子
function minimax(board, isMaximizing) {
  const score = evaluate(board);
  
  // 递归终止:游戏结束,返回当前得分
  if (score !== null) {
    return score;
  }
  
  if (isMaximizing) {
    let bestScore = -Infinity;
    // 遍历所有空位置
    for (let i = 0; i < board.length; i++) {
      if (board[i] === '') {
        board[i] = 'O'; // 电脑临时落子
        let currentScore = minimax(board, false); // 切换到玩家回合
        board[i] = ''; // 回溯恢复棋盘
        bestScore = Math.max(bestScore, currentScore);
      }
    }
    return bestScore;
  } else {
    let bestScore = Infinity;
    for (let i = 0; i < board.length; i++) {
      if (board[i] === '') {
        board[i] = 'X'; // 模拟玩家落子
        let currentScore = minimax(board, true); // 切换到电脑回合
        board[i] = ''; // 回溯恢复棋盘
        bestScore = Math.min(bestScore, currentScore);
      }
    }
    return bestScore;
  }
}

3. 寻找最优落子位置

遍历所有空位置,调用极小极大函数计算得分,选出得分最高的位置作为电脑的落子点:

function findBestMove(board) {
  let bestScore = -Infinity;
  let bestMove = -1;
  
  for (let i = 0; i < board.length; i++) {
    if (board[i] === '') {
      board[i] = 'O';
      let currentScore = minimax(board, false);
      board[i] = '';
      if (currentScore > bestScore) {
        bestScore = currentScore;
        bestMove = i;
      }
    }
  }
  
  return bestMove; // 返回0-8的格子索引,对应棋盘位置
}

4. 整合到现有AppLab项目

  • 维护一个全局数组board,初始值为['', '', '', '', '', '', '', '', ''],对应9个棋盘格子
  • 当玩家落子后,更新board数组对应位置为'X'
  • 触发电脑落子时,调用findBestMove(board)获取最优索引,将对应UI按钮的文本设为'O',同时更新board数组

为什么else if方案不可靠

else if只能覆盖有限的固定场景(比如阻止玩家赢、自己凑赢),但无法处理需要多步布局的博弈情况,极小极大算法通过递归遍历所有可能的游戏路径,能确保每一步都是当前最优选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 08:02:37