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

如何基于二维数组实现井字棋(Tic Tac Toe)的胜负判定逻辑?

基于二维数组的井字棋胜负判定实现

以下是适配你现有二维数组棋盘结构(0=空位、1=X、2=O)的胜负判定逻辑实现,包含获胜检测、平局判断以及完整的集成方案:

核心胜负判定函数

function checkWin(board) {
  // 检查所有行是否有赢家
  for (let row = 0; row < 3; row++) {
    if (board[row][0] !== 0 && board[row][0] === board[row][1] && board[row][1] === board[row][2]) {
      return board[row][0];
    }
  }

  // 检查所有列是否有赢家
  for (let col = 0; col < 3; col++) {
    if (board[0][col] !== 0 && board[0][col] === board[1][col] && board[1][col] === board[2][col]) {
      return board[0][col];
    }
  }

  // 检查两条对角线是否有赢家
  if (board[0][0] !== 0 && board[0][0] === board[1][1] && board[1][1] === board[2][2]) {
    return board[0][0];
  }
  if (board[0][2] !== 0 && board[0][2] === board[1][1] && board[1][1] === board[2][0]) {
    return board[0][2];
  }

  // 检查是否平局(棋盘无空位且无赢家)
  let isBoardFull = true;
  for (let row = 0; row < 3; row++) {
    for (let col = 0; col < 3; col++) {
      if (board[row][col] === 0) {
        isBoardFull = false;
        break;
      }
    }
    if (!isBoardFull) break;
  }
  return isBoardFull ? 'draw' : null;
}

集成到现有代码

修改你的tileclick函数,在每次落子后调用胜负判定逻辑,同时新增重复落子拦截和棋盘重置功能,完整JS代码如下:

let board = [
  [0, 0, 0],
  [0, 0, 0],
  [0, 0, 0]
];
//the team symbols
let teamcross = "x";
let teamcircle = "o";
//for the tileclick function
let x = 0;
let y = 0;
var tile = "test";
//1 is Team X and 2 is Team O
var currentteam = 1;

// 胜负判定函数
function checkWin(board) {
  // 检查所有行是否有赢家
  for (let row = 0; row < 3; row++) {
    if (board[row][0] !== 0 && board[row][0] === board[row][1] && board[row][1] === board[row][2]) {
      return board[row][0];
    }
  }

  // 检查所有列是否有赢家
  for (let col = 0; col < 3; col++) {
    if (board[0][col] !== 0 && board[0][col] === board[1][col] && board[1][col] === board[2][col]) {
      return board[0][col];
    }
  }

  // 检查两条对角线是否有赢家
  if (board[0][0] !== 0 && board[0][0] === board[1][1] && board[1][1] === board[2][2]) {
    return board[0][0];
  }
  if (board[0][2] !== 0 && board[0][2] === board[1][1] && board[1][1] === board[2][0]) {
    return board[0][2];
  }

  // 检查是否平局(棋盘无空位且无赢家)
  let isBoardFull = true;
  for (let row = 0; row < 3; row++) {
    for (let col = 0; col < 3; col++) {
      if (board[row][col] === 0) {
        isBoardFull = false;
        break;
      }
    }
    if (!isBoardFull) break;
  }
  return isBoardFull ? 'draw' : null;
}

// 棋盘重置函数
function resetBoard() {
  board = [
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0]
  ];
  document.querySelectorAll('.tile').forEach(tile => {
    tile.innerHTML = "*";
  });
  currentteam = 1;
  document.getElementById("turndisplay").innerHTML = "current team is: X";
}

//the tileclick function
function tileclick(tile, y, x) {
  // 拦截重复落子操作
  if (board[y][x] !== 0) {
    window.alert("该位置已被占用,请选择其他格子");
    return;
  }

  switch (currentteam) {
    case 1:
      document.getElementById(tile).innerHTML = "x";
      board[y][x] = 1;
      currentteam = 2;
      document.getElementById("turndisplay").innerHTML = "current team is: O";
      break;
    case 2:
      document.getElementById(tile).innerHTML = "o";
      board[y][x] = 2;
      currentteam = 1;
      document.getElementById("turndisplay").innerHTML = "current team is: X";
      break;
    default:
      window.alert("something is broken. Current Team is " + currentteam);
      break;
  }

  // 落子后检测胜负
  const result = checkWin(board);
  if (result) {
    let message;
    if (result === 1) {
      message = "X队获胜!";
    } else if (result === 2) {
      message = "O队获胜!";
    } else if (result === 'draw') {
      message = "平局!";
    }
    window.alert(message);
    // 自动重置棋盘
    resetBoard();
  }
}

HTML部分保持不变

<table id='gameboard'>
  <tr id="toprow">
    <td class="tile" onclick="tileclick('tl',0,0)" id="tl">*</td>
    <td class="tile" onclick="tileclick('tc',0,1)" id="tc">*</td>
    <td class="tile" onclick="tileclick('tr',0,2)" id="tr">*</td>
  </tr>
  <tr id="middlerow">
    <td class="tile" onclick="tileclick('cl',1,0)" id="cl">*</td>
    <td class="tile" onclick="tileclick('cc',1,1)" id="cc">*</td>
    <td class="tile" onclick="tileclick('cr',1,2)" id="cr">*</td>
  </tr>
  <tr id="bottomrow">
    <td class="tile" onclick="tileclick('bl',2,0)" id="bl">*</td>
    <td class="tile" onclick="tileclick('bc',2,1)" id="bc">*</td>
    <td class="tile" onclick="tileclick('br',2,2)" id="br">*</td>
  </tr>
</table>

<h3 id="turndisplay">current team is: X</h3>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:50:15