解决井字棋游戏平局判断错误的问题

解决井字棋游戏平局判断错误的问题

本文针对JavaScript实现的井字棋游戏中,平局判断与胜负判断冲突的问题,提供了一种解决方案。通过修改`checkWin()`函数和`draw()`函数的返回值,并在主循环中进行判断,可以有效避免在游戏结束时同时显示胜负信息和平局信息的问题,提升用户体验。

在开发井字棋游戏时,一个常见的问题是在棋盘被填满时,如果最后一步导致了胜利,游戏会同时显示胜利信息和平局信息。这是因为平局的判断逻辑是在所有格子都被填充后触发,而没有考虑到最后一步可能已经决定了胜负。要解决这个问题,需要调整胜负判断和和平局判断的逻辑顺序和方式。

修改 checkWin() 函数

首先,修改 checkWin() 函数,使其返回获胜者(’X’ 或 ‘O’)或空字符串(表示没有获胜者),而不是直接修改 message.textContent。

function checkWin(){    if (squares[0].textContent == 'X' && squares[1].textContent == 'X' && squares[2].textContent == 'X') return 'X';    if (squares[0].textContent == 'O' && squares[1].textContent == 'O' && squares[2].textContent == 'O') return 'O';    if (squares[3].textContent == 'X' && squares[4].textContent == 'X' && squares[5].textContent == 'X') return 'X';    if (squares[3].textContent == 'O' && squares[4].textContent == 'O' && squares[5].textContent == 'O') return 'O';    if (squares[6].textContent == 'X' && squares[7].textContent == 'X' && squares[8].textContent == 'X') return 'X';    if (squares[6].textContent == 'O' && squares[7].textContent == 'O' && squares[8].textContent == 'O') return 'O';    if (squares[0].textContent == 'X' && squares[3].textContent == 'X' && squares[6].textContent == 'X') return 'X';    if (squares[0].textContent == 'O' && squares[3].textContent == 'O' && squares[6].textContent == 'O') return 'O';    if (squares[1].textContent == 'X' && squares[4].textContent == 'X' && squares[7].textContent == 'X') return 'X';    if (squares[1].textContent == 'O' && squares[4].textContent == 'O' && squares[7].textContent == 'O') return 'O';    if (squares[2].textContent == 'X' && squares[5].textContent == 'X' && squares[8].textContent == 'X') return 'X';    if (squares[2].textContent == 'O' && squares[5].textContent == 'O' && squares[8].textContent == 'O') return 'O';    if (squares[1].textContent == 'X' && squares[4].textContent == 'X' && squares[8].textContent == 'X') return 'X';    if (squares[1].textContent == 'O' && squares[4].textContent == 'O' && squares[8].textContent == 'O') return 'O';    if (squares[2].textContent == 'X' && squares[4].textContent == 'X' && squares[6].textContent == 'X') return 'X';    if (squares[2].textContent == 'O' && squares[4].textContent == 'O' && squares[6].textContent == 'O') return 'O';    return ''; // No winner}

修改 draw() 函数

接下来,修改 draw() 函数,使其返回一个布尔值,表示是否平局。只有在所有格子都被填充,且没有获胜者的情况下,才返回 true。

function draw(){    for (let i = 0; i < squares.length; i++) {        if (squares[i].textContent === '') {            return false; // Not a draw, there are empty squares        }    }    return true; // All squares are filled, it's a draw}

更新主循环

最后,更新主循环,在每次点击后,先检查是否有获胜者,如果没有,再检查是否平局。

function board (){    squares.forEach(function(e, i){        squares[i].onclick = ()=>{            if (squares[i].textContent === '') { // Only allow clicks on empty squares                squares[i].textContent = player = player === 'O' ? 'X' : 'O';                squares[i].textContent === 'X' ? message.textContent = "It's O's turn" :                    message.textContent = "It's X's turn";                let winner = checkWin();                if (winner) {                    message.textContent = winner + ' Wins!';                    // Disable further clicks                    squares.forEach(square => square.onclick = null);                    return;                }                if (draw()) {                    message.textContent = 'Draw!';                    console.log('Tie Game');                    // Disable further clicks                    squares.forEach(square => square.onclick = null);                    return;                }            }        }    });}

在这个修改后的主循环中,首先检查点击的格子是否为空,只有在为空时才允许落子。然后,在每次落子后,先调用 checkWin() 函数检查是否有获胜者。如果有,则显示获胜信息并禁用后续点击。如果没有获胜者,再调用 draw() 函数检查是否平局。如果是平局,则显示平局信息并禁用后续点击。通过这样的逻辑,可以确保在游戏结束时只显示一个结果,避免胜负信息和平局信息同时出现的问题。

总结

通过修改 checkWin() 和 draw() 函数的返回值,并在主循环中按照先胜负判断后平局判断的顺序进行处理,可以有效地解决井字棋游戏中平局判断与胜负判断冲突的问题。这种方法不仅逻辑清晰,而且易于理解和维护,可以提高代码的可读性和可维护性。同时,禁用游戏结束后继续点击的功能,可以提供更好的用户体验。

以上就是解决井字棋游戏平局判断错误的问题的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1539206.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JavaScript 事件处理中的参数传递问题:字符串与变量混淆
上一篇 2025年12月21日 05:46:54
Firestore动态子字段查询的复合索引策略:基于关键词数组的优化方案
下一篇 2025年12月21日 05:46:59

相关推荐

  • sublime怎么设置启动时自动打开上次的项目 _sublime启动自动打开上次项目

    sublime怎么设置启动时自动打开上次的项目 _sublime启动自动打开上次项目sublime怎么设置启动时自动打开上次的项目 _sublime启动自动打开上次项目sublime怎么设置启动时自动打开上次的项目 _sublime启动自动打开上次项目sublime怎么设置启动时自动打开上次的项目 _sublime启动自动打开上次项目

    Sublime Text 能自动恢复上次项目和文件,需确保设置中启用 “remember_open_files”: true 且 “hot_exit”: false,并通过正常退出方式(如 Ctrl+Q 或 Cmd+Q)关闭程序以保存会话状态。 Sub…

    2026年9月25日 • 用户投稿
    400
  • 360极速浏览器怎么开启或关闭多窗口模式_多窗口模式启用与禁用设置方法

    360极速浏览器怎么开启或关闭多窗口模式_多窗口模式启用与禁用设置方法360极速浏览器怎么开启或关闭多窗口模式_多窗口模式启用与禁用设置方法360极速浏览器怎么开启或关闭多窗口模式_多窗口模式启用与禁用设置方法360极速浏览器怎么开启或关闭多窗口模式_多窗口模式启用与禁用设置方法

    1、可通过菜单切换IE多窗口模式,点击“切换到IE6多窗口模式”启用,拖拽标签可分离为独立窗口,再次切换回默认模式即可关闭;2、直接拖拽标签页出当前窗口可创建新窗口,反向操作可合并;3、使用Ctrl+N快捷键新建浏览器实例实现多窗口,关闭多余窗口即可退出多窗口模式。 如果您希望在使用360极速浏览器…

    2026年9月25日 • 用户投稿
    200
  • 如何在微服务之间共享静态数据

    如何在微服务之间共享静态数据如何在微服务之间共享静态数据如何在微服务之间共享静态数据如何在微服务之间共享静态数据

    微服务架构的本质决定了微服务之间无法直接共享静态变量。正如上面摘要所说,每个微服务都是一个独立的进程,拥有自己的内存空间,静态变量只在其所属的进程内有效。试图在一个微服务中访问另一个微服务的静态变量,就像试图在一个独立的Java程序中访问另一个程序的变量一样,是不可能的。 微服务架构的独立性 微服务…

    2026年9月25日 • 用户投稿
    100
  • [python]windows上通过whl文件安装triton模块

    [python]windows上通过whl文件安装triton模块[python]windows上通过whl文件安装triton模块[python]windows上通过whl文件安装triton模块[python]windows上通过whl文件安装triton模块

    在windows系统中,使用.whl文件安装triton是一个简单且高效的方法。以下是完整的操作流程说明: 一、检查系统配置 Python版本:首先确认已安装Python,并确保其版本与你要安装的Triton .whl 文件兼容。例如,若下载的是triton-2.0.0-cp310-cp310-wi…

    2026年9月25日 • 用户投稿
    300
  • FineReport与.NET集成要点

    FineReport与.NET集成要点FineReport与.NET集成要点FineReport与.NET集成要点FineReport与.NET集成要点

    1、FineReport(FR)与.NET项目的集成主要涵盖三个核心部分,如上图所示。 2、报表发布是集成过程中的关键步骤之一。 3、需要注意的是,FR报表工程本质上是基于Java的Servlet应用,无法由IIS直接解析处理,因此必须将其部署在支持Servlet规范的Web应用服务器(如Tomca…

    2026年9月25日 • 用户投稿
    200
  • 如何在微服务之间共享静态数据?

    如何在微服务之间共享静态数据?如何在微服务之间共享静态数据?如何在微服务之间共享静态数据?如何在微服务之间共享静态数据?

    在微服务架构中,各个服务都是独立的部署单元,拥有各自的内存空间。如同上述摘要所述,直接通过静态变量在不同的微服务之间共享数据是不可能的。 试图在一个微服务中设置静态变量的值,然后在另一个微服务中访问它,将会得到 null 或初始值,而不是之前设置的值。 这不是 Spring Boot 特有的问题,而…

    2026年9月25日 • 用户投稿
    100
  • Win11安卓子系统WSA 2301.40000.4.0大幅度提高FPS帧率

    Win11安卓子系统WSA 2301.40000.4.0大幅度提高FPS帧率Win11安卓子系统WSA 2301.40000.4.0大幅度提高FPS帧率Win11安卓子系统WSA 2301.40000.4.0大幅度提高FPS帧率Win11安卓子系统WSA 2301.40000.4.0大幅度提高FPS帧率

    在2023年2月的更新中,windows 11的安卓子系统(wsa)对应用程序的帧率性能进行了显著优化,使得游戏爱好者能够享受到更流畅的游戏体验。此次更新后,在运行各类应用程序时,wsa的帧率表现得到了极大改善,用户在日常使用安卓应用时会感受到明显的变化。特别是在基于arm架构的设备上,安卓app的…

    2026年9月25日 • 用户投稿
    600
  • Micronaut中动态数据结构的类型安全验证策略

    Micronaut中动态数据结构的类型安全验证策略Micronaut中动态数据结构的类型安全验证策略Micronaut中动态数据结构的类型安全验证策略Micronaut中动态数据结构的类型安全验证策略

    本文探讨了在Micronaut应用中,如何有效处理具有动态属性和类型依赖验证的类。通过引入多态接口、特化实现类以及自定义Jackson反序列化器,我们能够实现对复杂动态数据结构的类型安全解析与精细化验证,确保数据完整性和业务规则的正确执行。 动态数据结构的验证挑战 在现代微服务架构中,经常会遇到需要…

    2026年9月25日 • 用户投稿
    900
  • sublime如何给代码添加书签_sublime代码书签使用技巧

    sublime如何给代码添加书签_sublime代码书签使用技巧sublime如何给代码添加书签_sublime代码书签使用技巧sublime如何给代码添加书签_sublime代码书签使用技巧sublime如何给代码添加书签_sublime代码书签使用技巧

    使用F12添加/删除书签,Ctrl+F2/Cmd+F2跳转下一个,Ctrl+Shift+F2/Cmd+Shift+F2跳转上一个,行号旁显示标记;通过命令面板输入“Bookmarks”可查看和管理所有书签,选择“Show Bookmarks”列出并点击跳转;清除全部书签可通过菜单或命令面板执行“Cl…

    2026年9月25日 • 用户投稿
    100
  • Win10系统下战网无法安装怎么办?

    Win10系统下战网无法安装怎么办?Win10系统下战网无法安装怎么办?Win10系统下战网无法安装怎么办?Win10系统下战网无法安装怎么办?

    战网无法安装怎么处理?当大家遇到战网客户端无法安装的情况时,应该怎么办呢?毕竟组队开黑的小伙伴还在等你。其实,这种现象通常是因为权限问题或是注册表中有之前的残留数据造成的。经过多次尝试,小编终于找到了一个有效的解决方案,接下来就为大家详细讲解具体的操作步骤。 1,按下Ctrl+Alt+Delete组…

    2026年9月25日 • 用户投稿
    100
  • consul怎么在windows下安装

    consul怎么在windows下安装consul怎么在windows下安装consul怎么在windows下安装consul怎么在windows下安装

    1.去官网下载:https://www.consul.io/downloads.html 2.解压: 3.设置环境变量:path添加 E:programfilesconsul; 4.cmd启动: consul agent -dev 帮衣帮-AI服装设计 AI服装设计神器,AI生成印花、虚拟试衣、面料…

    2026年9月25日 • 用户投稿
    100
  • sublime怎么让不同类型文件使用不同的缩进设置 _sublime不同文件缩进设置方法

    sublime怎么让不同类型文件使用不同的缩进设置 _sublime不同文件缩进设置方法sublime怎么让不同类型文件使用不同的缩进设置 _sublime不同文件缩进设置方法sublime怎么让不同类型文件使用不同的缩进设置 _sublime不同文件缩进设置方法sublime怎么让不同类型文件使用不同的缩进设置 _sublime不同文件缩进设置方法

    Sublime Text 可根据不同文件类型自动应用缩进设置,通过语法专属配置实现。1. 打开文件后点击右下角语法名称,选择 Open Syntax Specific Settings;2. 在配置文件中设置 tab_size 和 translate_tabs_to_spaces,如 Python …

    2026年9月25日 • 用户投稿
    100
  • Win7系统如何给文件夹设置密码?

    Win7系统如何给文件夹设置密码?Win7系统如何给文件夹设置密码?Win7系统如何给文件夹设置密码?Win7系统如何给文件夹设置密码?

    我们如今对电脑的依赖程度越来越高,无论是日常生活、工作还是学习都离不开它。而在使用过程中,我们会存储许多重要的文件在电脑里,但如果希望这些文件不被他人查看,该怎么做呢?当然,给文件夹加个密码是最直接的办法。今天,我们就一起来看看如何为文件夹设置密码吧! 前几天,我在浏览网页时发现有很多网友都在讨论如…

    2026年9月25日 • 用户投稿
    200
  • Hibernate/Spring Boot中复合主键与多对多关联的实现指南

    Hibernate/Spring Boot中复合主键与多对多关联的实现指南Hibernate/Spring Boot中复合主键与多对多关联的实现指南Hibernate/Spring Boot中复合主键与多对多关联的实现指南Hibernate/Spring Boot中复合主键与多对多关联的实现指南

    本教程详细阐述了在Spring Boot和Hibernate框架中,如何优雅地处理具有附加属性的多对多关系,特别是当连接表需要复合主键时。我们将通过构建一个用户电影评分系统为例,深入探讨@EmbeddedId、@Embeddable以及@OneToMany、@ManyToOne等JPA注解的实际应用…

    2026年9月25日 • 用户投稿
    000
  • sublime的goto symbol in project功能怎么用_sublime Goto Symbol in Project使用方法

    sublime的goto symbol in project功能怎么用_sublime Goto Symbol in Project使用方法sublime的goto symbol in project功能怎么用_sublime Goto Symbol in Project使用方法sublime的goto symbol in project功能怎么用_sublime Goto Symbol in Project使用方法sublime的goto symbol in project功能怎么用_sublime Goto Symbol in Project使用方法

    使用快捷键Ctrl+Shift+R(Win/Linux)或Cmd+Shift+R(Mac)可快速调用Goto Symbol in Project功能,通过搜索符号名称跳转到函数、类等定义位置,支持模糊匹配与实时过滤,需确保项目已添加至侧边栏且语法包正确安装以保证索引识别效果。 Sublime Tex…

    2026年9月25日 • 用户投稿
    200
  • 解决Android Studio Gradle构建问题的网络仓库配置指南

    解决Android Studio Gradle构建问题的网络仓库配置指南解决Android Studio Gradle构建问题的网络仓库配置指南解决Android Studio Gradle构建问题的网络仓库配置指南解决Android Studio Gradle构建问题的网络仓库配置指南

    本文旨在解决Android Studio项目中因网络限制导致的Gradle构建失败问题,特别是“插件未找到”等错误。核心解决方案是通过配置替代的Maven仓库(如阿里云镜像)来绕过网络障碍,确保Gradle能够成功解析和下载所需的插件与依赖,从而恢复项目的正常构建。 1. 问题背景与常见症状 在an…

    2026年9月25日 • 用户投稿
    100
  • sublime如何快速切换项目 _sublime项目快速切换方法

    sublime如何快速切换项目 _sublime项目快速切换方法sublime如何快速切换项目 _sublime项目快速切换方法sublime如何快速切换项目 _sublime项目快速切换方法sublime如何快速切换项目 _sublime项目快速切换方法

    使用命令面板输入“Switch Project”可快速切换项目;2. 通过设置快捷键如Ctrl+Alt+P实现一键切换;3. 需先保存项目为.sublime-project文件才能在列表中显示;4. 也可通过菜单Project→Recent Projects用鼠标选择最近项目。掌握这些方法可高效管理…

    2026年9月25日 • 用户投稿
    100
  • 谷歌浏览器开发者工具网络面板数据延迟如何修复

    谷歌浏览器开发者工具网络面板数据延迟如何修复谷歌浏览器开发者工具网络面板数据延迟如何修复谷歌浏览器开发者工具网络面板数据延迟如何修复谷歌浏览器开发者工具网络面板数据延迟如何修复

    延迟通常由网络环境、浏览器状态或页面性能导致。先通过Waterfall分析DNS、TCP等阶段耗时,确认是否真实延迟;更换网络或设备对比速度;清除缓存、禁用缓存或使用无痕模式排除干扰;检查代理设置并切换为公共DNS;最后结合Performance面板排查脚本阻塞与资源瓶颈。 Chrome开发者工具网…

    2026年9月25日 • 用户投稿
    800
  • PHP一键环境如何配置Memcached_Memcached缓存集成

    首先安装Memcached服务并启动,然后启用PHP的memcached扩展并重启服务,最后通过PHP代码连接并测试缓存读写;具体步骤包括:Windows或Linux系统下安装Memcached服务,确保端口11211监听;在宝塔等环境中安装php-memcached扩展并确认phpinfo显示模块…

    2026年9月25日
    100
  • 蓝牙鼠标出现输入码无效现象怎么办

    蓝牙鼠标出现输入码无效现象怎么办蓝牙鼠标出现输入码无效现象怎么办蓝牙鼠标出现输入码无效现象怎么办蓝牙鼠标出现输入码无效现象怎么办

     最近几年,很多人都用起了蓝牙鼠标。相比传统的鼠标,蓝牙鼠标无需长长的鼠标线,连接蓝牙即可使用,很是方便。不过蓝牙鼠标有时候也会出现一些问题,那时候应该怎么解决呢?下面就让小编给大家提供的蓝牙鼠标出现输入码无效现象的解决方法。 一、按下“WIN+R”键唤出运行,输入services.msc,点击确定…

    2026年9月25日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信