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

如何编写函数判断井字棋二维数组的获胜方?

井字棋胜负判断函数实现指导

需求说明

需要编写一个通用函数,接收井字棋二维数组(用"X"、"O"表示玩家,"-"表示空位),判断是否出现获胜局面,并在控制台输出胜负结果——比如传入diagonalWin时,控制台应打印"O Won and X Lost"(注:你给出的diagonalWin示例是O的对角线获胜)。

示例测试数组:

const rowWin = [
  ["O", "O", "O"],
  ["-", "-", "-"],
  ["-", "-", "-"]
];
const colWin = [
  ["-", "X", "-"],
  ["-", "X", "-"],
  ["-", "X", "-"],
];
const diagonalWin = [
  ["-", "-", "O"],
  ["-", "O", "-"],
  ["O", "-", "-"],
];
const diagonalWinInverse = [
  ["X", "-", "-"],
  ["-", "X", "-"],
  ["-", "-", "X"],
];

硬编码方案的问题

你当前的代码只能针对特定数组做判断,不具备通用性,且逻辑判断有误:

  • 仅针对固定的行、列、对角线位置写死判断,无法覆盖所有可能的获胜情况(比如第二行全X的情况就检测不到)
  • 用&&仅检查元素是否存在,没有验证三个元素是否完全相同且不是空位"-"

你的硬编码代码:

if(rowWin[0][0] && rowWin[0][1] && rowWin[0][2]){
    console.log("O wins, X lost")
}else console.log("X wins")

if(colWin[0][1] && colWin[1][1] && colWin[2][1]){
    console.log("X wins, O lost")
}else console.log("O wins")

if(diagonalWin[0][2] && diagonalWin[1][1] && diagonalWin[2][0]){
    console.log("O wins, X lost")
}else console.log("X wins")

if(diagonalWinInverse[0][0] && diagonalWinInverse[1][1] && diagonalWinInverse[2][2]){
    console.log("X wins, X lost")
}else console.log("O wins")

通用解决方案

实现思路

  1. 遍历所有可能的获胜线路:3行、3列、2条对角线
  2. 对每条线路,检查三个位置的元素是否完全相同,且不是空位"-"
  3. 找到获胜玩家后,直接输出胜负结果;若所有线路都无获胜情况,输出“无胜负”

完整代码

function checkTicTacToe(board) {
  // 检查行
  for (let row = 0; row < 3; row++) {
    const cell1 = board[row][0];
    const cell2 = board[row][1];
    const cell3 = board[row][2];
    if (cell1 !== "-" && cell1 === cell2 && cell2 === cell3) {
      const loser = cell1 === "X" ? "O" : "X";
      console.log(`${cell1} Won and ${loser} Lost`);
      return;
    }
  }

  // 检查列
  for (let col = 0; col < 3; col++) {
    const cell1 = board[0][col];
    const cell2 = board[1][col];
    const cell3 = board[2][col];
    if (cell1 !== "-" && cell1 === cell2 && cell2 === cell3) {
      const loser = cell1 === "X" ? "O" : "X";
      console.log(`${cell1} Won and ${loser} Lost`);
      return;
    }
  }

  // 检查主对角线(左上到右下)
  const diag1Cell1 = board[0][0];
  const diag1Cell2 = board[1][1];
  const diag1Cell3 = board[2][2];
  if (diag1Cell1 !== "-" && diag1Cell1 === diag1Cell2 && diag1Cell2 === diag1Cell3) {
    const loser = diag1Cell1 === "X" ? "O" : "X";
    console.log(`${diag1Cell1} Won and ${loser} Lost`);
    return;
  }

  // 检查副对角线(右上到左下)
  const diag2Cell1 = board[0][2];
  const diag2Cell2 = board[1][1];
  const diag2Cell3 = board[2][0];
  if (diag2Cell1 !== "-" && diag2Cell1 === diag2Cell2 && diag2Cell2 === diag2Cell3) {
    const loser = diag2Cell1 === "X" ? "O" : "X";
    console.log(`${diag2Cell1} Won and ${loser} Lost`);
    return;
  }

  // 无获胜情况
  console.log("无胜负");
}

// 测试示例
checkTicTacToe(rowWin); // 输出:O Won and X Lost
checkTicTacToe(colWin); // 输出:X Won and O Lost
checkTicTacToe(diagonalWin); // 输出:O Won and X Lost
checkTicTacToe(diagonalWinInverse); // 输出:X Won and O Lost

代码解释

  • 遍历行时,逐行检查三个单元格是否一致且非空位
  • 遍历列时,逐列检查三个单元格是否一致且非空位
  • 对角线单独检查两条特殊线路
  • 找到获胜者后立即返回,避免多余判断
  • 通过三元运算符快速确定败方,简化逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 06:10:27