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

Tic-Tac-Toe程序获胜后仍循环请求输入直至填满格子判定平局

修复井字棋游戏获胜后未终止的问题

你的井字棋程序存在的核心问题是:isGameOver函数调用hasLastMoverWon时参数顺序颠倒,导致获胜检测逻辑完全失效,无法识别玩家获胜,只能等到棋盘填满后判定平局。

错误根源

hasLastMoverWon函数的定义是第一个参数接收玩家符号(currentPlayerSymbol),第二个参数接收游戏棋盘(gameBoard):

function hasLastMoverWon(currentPlayerSymbol, gameBoard) {
  // ... 逻辑代码
}

但在isGameOver中调用时,错误地把棋盘作为第一个参数、玩家符号作为第二个参数传入,直接导致获胜判断条件永远不成立,程序无法终止游戏。

修复后的完整代码

function getboardstring(gameBoard) {
  let string = ``;
  for (let i = 0; i < gameBoard.length; i++) {
    i % 3 === 0 ? string += `\n` : ``;
    gameBoard[i] === null ? string += i : string += gameBoard[i];
  }
  return string;
}

function getUserInput(nextPlayerSymbol, gameBoard) {
  return +prompt(`${getboardstring(gameBoard)}\n dove vuoi posizionare la ${nextPlayerSymbol}?`);
}

function isMoveValid(move, gameBoard) {
  return gameBoard[move] === null;
}

function makeAMove(gameBoard, nextPlayerSymbol) {
  // clone the game board before placing moves in it
  let newGameBoard = [...gameBoard];
  let move = 0;
  do {
    move = getUserInput(nextPlayerSymbol, gameBoard);
  } while (!isMoveValid(move, gameBoard));
  newGameBoard[move] = nextPlayerSymbol;
  return newGameBoard;
}

function hasLastMoverWon(currentPlayerSymbol, gameBoard) {
  let winnerCombos = [
    [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 [i1, i2, i3] of winnerCombos) {
    if (gameBoard[i1] === currentPlayerSymbol &&
      gameBoard[i2] === gameBoard[i1] &&
      gameBoard[i3] === gameBoard[i1]) {
      return true;
    }
  }
  return false;
}

function isGameOver(gameBoard, currentPlayerSymbol) {
  // 修正参数顺序,正确调用hasLastMoverWon
  if (hasLastMoverWon(currentPlayerSymbol, gameBoard)) {
    alert(`${currentPlayerSymbol} has won the game!`);
    return true;
  }
  // 检查棋盘是否已满
  else if (!gameBoard.includes(null)) {
    alert(`game ended in a draw`);
    return true;
  }
  return false;
}

function ticTacToe() {
  let gameBoard = new Array(9).fill(null)
  let currentPlayerSymbol = null;
  do {
    currentPlayerSymbol = currentPlayerSymbol === `X` ? `O` : `X`;
    gameBoard = makeAMove(gameBoard, currentPlayerSymbol);
  } while (!isGameOver(gameBoard, currentPlayerSymbol));
}

额外优化(可选)

  • 简化isMoveValid函数的返回逻辑,直接返回布尔值判断结果
  • 去掉冗余的=== true判断,利用函数本身返回的布尔值直接判断

修复后,每当玩家落子后,程序会正确检查该玩家是否达成获胜组合,一旦获胜就会弹出提示并立即终止游戏,不会继续要求输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:45:21