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
相关产品推荐
相关产品推荐

