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

如何为JavaScript井字棋游戏添加重置按钮

井字棋游戏:重置按钮实现与平局判断解决方案

问题概述

正在开发一款JavaScript井字棋游戏,已完成获胜条件判断,但需要实现平局逻辑和重置按钮功能。尝试给重置按钮绑定onBoardClick函数失败,不清楚如何正确重置游戏状态。


解决方案步骤

1. 实现重置按钮功能

重置需要完成两个核心操作:重置游戏状态数据,以及清空页面上的棋子样式。

步骤1:编写重置函数

在app.js中添加专门的重置函数:

function resetGame() {
  // 重置游戏状态数组
  gameState.board = [
    null, null, null,
    null, null, null,
    null, null, null
  ];
  // 重置回X玩家先手
  playerXTurn = true;
  // 清空所有单元格的X/O样式类
  const cells = document.querySelectorAll('.ticTacToeCell');
  cells.forEach(cell => {
    cell.classList.remove('X_BoardPiece', 'O_BoardPiece');
  });
}

步骤2:绑定重置按钮的点击事件

在app.js末尾添加按钮的事件监听:

const resetBtn = document.getElementById('resetButton');
resetBtn.addEventListener('click', resetGame);

2. 实现平局判断逻辑

平局的条件是:棋盘已满,且没有玩家获胜。可以在每次落子后检查:

步骤1:添加平局检查函数

function checkDraw() {
  // 检查棋盘是否所有位置都被填满
  return !gameState.board.includes(null);
}

步骤2:在落子后调用平局检查

修改onBoardClick函数,在判断完胜负后添加平局检查:

// ... 现有胜负判断代码之后
const isXWinner = checkWin1('x') || checkWin2('x') || checkWin3('x') || checkWin4('x') || checkWin5('x') || checkWin6('x') || checkWin7('x') || checkWin8('x');
if (isXWinner) {
  alert("player x is the winner");
  return; // 获胜后直接结束,不切换玩家
}

// 平局检查
const isDraw = checkDraw();
if (isDraw) {
  alert("平局!");
  return;
}

playerXTurn = !playerXTurn;

注意:获胜后要return,避免继续切换玩家;平局同理。

3. 优化获胜判断函数(可选但推荐)

当前的8个checkWin函数可以合并成一个更简洁的版本,通过预定义所有获胜组合来减少重复代码:

// 预定义所有获胜的位置组合
const winCombos = [
  [0,1,2], [3,4,5], [6,7,8], // 横向
  [0,3,6], [1,4,7], [2,5,8], // 纵向
  [0,4,8], [2,4,6] // 对角线
];

function checkWin(playerIcon) {
  // 遍历所有获胜组合,检查是否有完全匹配的
  return winCombos.some(combo => {
    return combo.every(index => gameState.board[index] === playerIcon);
  });
}

之后在onBoardClick中只需调用checkWin('x')或checkWin('o')即可,替代原来的8个函数调用,代码更易维护。


修改后的完整代码

app.js

const gameState = {
  players: ['x', 'o'],
  board: [
    null, null, null,
    null, null, null,
    null, null, null
  ]
};

const gameArea = document.getElementById('gameBoard');
let playerXTurn = true;

// 预定义所有获胜组合
const winCombos = [
  [0,1,2], [3,4,5], [6,7,8],
  [0,3,6], [1,4,7], [2,5,8],
  [0,4,8], [2,4,6]
];

function checkWin(playerIcon) {
  return winCombos.some(combo => {
    return combo.every(index => gameState.board[index] === playerIcon);
  });
}

function checkDraw() {
  return !gameState.board.includes(null);
}

function resetGame() {
  gameState.board = [
    null, null, null,
    null, null, null,
    null, null, null
  ];
  playerXTurn = true;
  const cells = document.querySelectorAll('.ticTacToeCell');
  cells.forEach(cell => {
    cell.classList.remove('X_BoardPiece', 'O_BoardPiece');
  });
}

function onBoardClick(event){
  const cellClass = event.target.classList;
  if(cellClass.contains('X_BoardPiece')||cellClass.contains('O_BoardPiece')){
    return;
  } 

  let cellId = event.target.id.substring(5);
  let currentPlayer = playerXTurn ? 'x' : 'o';
  let pieceClass = playerXTurn ? 'X_BoardPiece' : 'O_BoardPiece';

  event.target.classList.add(pieceClass);
  gameState.board[cellId-1] = currentPlayer;

  const isWinner = checkWin(currentPlayer);
  if (isWinner) {
    alert(`player ${currentPlayer} is the winner`);
    return;
  }

  const isDraw = checkDraw();
  if (isDraw) {
    alert("平局!");
    return;
  }

  playerXTurn = !playerXTurn;
}

gameArea.addEventListener('click', onBoardClick);
const resetBtn = document.getElementById('resetButton');
resetBtn.addEventListener('click', resetGame);

index.html

(原HTML无需修改,确保resetButton的ID正确即可)


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:22:01