讲师中心 微信公众号
AI工具推荐 视频效率加速

修复井字棋(Tic-Tac-Toe)游戏提前终止判定失效的问题

梦萱酱_3274

梦萱酱_3274

发布时间:2026-02-11 12:33:30

|

153人浏览过

|

来源于php中文网

原创

修复井字棋(Tic-Tac-Toe)游戏提前终止判定失效的问题

本文详解井字棋程序中“胜利后仍继续运行至平局”的核心缺陷,聚焦 `haslastmoverwon` 函数参数顺序错误与 `isgameover` 逻辑调用时机问题,并提供完整可运行的修复方案。

在 JavaScript 实现的井字棋游戏中,一个常见却隐蔽的 Bug 是:游戏在玩家已达成获胜组合后仍未结束,而是持续提示输入,直到九格填满才判定为平局。这不仅破坏用户体验,更暴露了关键逻辑层的设计疏漏。根本原因在于两个紧密关联的问题:

? 问题一:函数参数顺序错位

原始代码中,hasLastMoverWon 的定义为:

function hasLastMoverWon(currentPlayerSymbol, gameBoard) { ... }

但在 isGameOver 中却被错误调用为:

hasLastMoverWon(gameBoard, currentPlayerSymbol) // ❌ 参数顺序颠倒!

由于函数内部依赖 gameBoard[i] === currentPlayerSymbol 进行比对,而实际传入时 currentPlayerSymbol 被当作了 gameBoard(即数组),导致所有条件判断恒为 false —— 胜利永远无法被识别。

✅ 修复方式:统一参数顺序,确保函数签名与调用一致:

function hasLastMoverWon(gameBoard, currentPlayerSymbol) { /* 正确实现 */ }
// 调用处保持相同顺序:
if (hasLastMoverWon(gameBoard, currentPlayerSymbol)) { ... }

? 问题二:prompt 输入类型不安全

原始 getUserInput 中使用 +prompt(...) 强制转换为数字,但用户点击「取消」时 prompt 返回 null,+null 得到 0,导致误将取消操作解析为位置 0,进而绕过 isMoveValid 检查(因 gameBoard[0] 初始为 null)。这不仅引发逻辑混乱,还可能掩盖真实错误。

✅ 修复方式:移除非必要强制转换,显式处理 null/空输入,并添加异常捕获增强健壮性:

function getUserInput(nextPlayerSymbol, gameBoard) {
  const input = prompt(`${getboardstring(gameBoard)}\n dove vuoi posizionare la ${nextPlayerSymbol}?`);
  if (input === null || input.trim() === '') throw new Error('Input cancelled');
  return parseInt(input, 10);
}

function makeAMove(gameBoard, nextPlayerSymbol) {
  let newGameBoard = [...gameBoard];
  let move;
  do {
    move = getUserInput(nextPlayerSymbol, gameBoard);
  } while (!isMoveValid(move, gameBoard));
  newGameBoard[move] = nextPlayerSymbol;
  return newGameBoard;
}

✅ 完整修复后的关键逻辑(精简版)

function isGameOver(gameBoard, currentPlayerSymbol) {
  // ✅ 先检查胜者(参数顺序已修正)
  if (hasLastMoverWon(gameBoard, currentPlayerSymbol)) {
    alert(`${currentPlayerSymbol} has won the game!`);
    return true;
  }
  // ✅ 再检查平局(board 无 null)
  if (!gameBoard.includes(null)) {
    alert(`Game ended in a draw`);
    return true;
  }
  return false; // 继续游戏
}

function ticTacToe() {
  let gameBoard = Array(9).fill(null);
  let currentPlayerSymbol = 'X'; // 初始化为 X,避免 null 导致首次切换异常
  do {
    gameBoard = makeAMove(gameBoard, currentPlayerSymbol);
    // ✅ 胜负判定必须在每步落子后立即执行
    if (isGameOver(gameBoard, currentPlayerSymbol)) break;
    currentPlayerSymbol = currentPlayerSymbol === 'X' ? 'O' : 'X';
  } while (true);
}

// 启动并捕获中断异常(如用户取消 prompt)
try {
  ticTacToe();
} catch (e) {
  console.warn('Game interrupted:', e);
}

⚠️ 注意事项与最佳实践

  • 逻辑顺序不可颠倒:胜负判定必须在 makeAMove 后、下一轮循环前执行,否则新状态未生效;
  • 输入验证需前置:isMoveValid 应严格校验 move 是否为 0–8 的有效索引(当前仅检查 null,建议补充 Number.isInteger(move) && move >= 0 && move
  • 用户体验优化:可将 alert 替换为 DOM 更新(如
    ),避免阻塞式弹窗;
  • 防御性编程:对用户输入做 parseInt + 基数声明,防止 '01' 等意外八进制解析。
  • 通过修正参数契约、强化输入处理、明确状态流转时机,即可彻底解决“赢了还继续下”的核心缺陷,让井字棋逻辑回归正确、可预测的轨道。

在线游戏
在线游戏

海量精品小游戏合集,无需安装即点即玩,休闲益智、动作闯关应有尽有,秒开即玩,轻松解压,快乐停不下来

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

6521

2024.08.14

alert怎么实现换行
alert怎么实现换行

alert通过使用br标签来实现换行。更多关于alert相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1397

2023.11.07

海螺AI提示词大全
海螺AI提示词大全

精选海螺AI进阶隐藏玩法与高效提示词(Prompt)公式。手把手教你如何用海螺AI撰写自媒体爆款文案、网络小说续写、脚本创作,以及利用AI工具落地副业的实战案例。

213

2026.06.02

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

120

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

60

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

60

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

40

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn