优化JavaScript扫雷游戏:精确处理网格边界单元格逻辑

优化JavaScript扫雷游戏:精确处理网格边界单元格逻辑

本文详细探讨了在JavaScript扫雷游戏开发中,如何精确处理网格边界单元格的逻辑。针对传统相邻单元格计算方法在边界处产生错误高亮的问题,教程介绍了利用模运算进行边界检测的关键技术。通过引入atLeftSide和atRightSide等辅助变量,并结合单元格编号从1开始的特点,修正了“绿色”和“蓝色”单元格(不同距离的邻近单元格)的判断逻辑,确保游戏行为的准确性。同时,文章还提供了代码优化建议,如使用Set提高性能和遵循正确的拼写规范。

理解扫雷游戏中的边界单元格问题

在开发像扫雷这样的网格类游戏时,确定一个单元格的相邻单元格是核心逻辑之一。常见的做法是通过简单地对单元格编号进行加减运算来查找相邻单元格,例如 cellnumb – 1(左邻居)、cellnumb + 1(右邻居)、cellnumb – gridlength(上邻居)等。然而,这种方法在处理网格边界时会遇到问题。

当一个单元格位于网格的边缘时,例如最左侧或最右侧,cellNumb – 1 或 cellNumb + 1 可能会错误地指向网格另一端的单元格,而不是实际意义上的相邻单元格。例如,在一个10×10的网格中,如果单元格90(第一列最后一个)的左邻居是89,但 cellNumb – 1 可能会被错误地判断为99(最后一列最后一个,如果单元格编号从0开始且换行)。这种“跨界”现象会导致游戏逻辑错误,例如在雷的旁边错误地标记了“绿色”或“蓝色”单元格。

原始代码中,当雷位于边界时,其相邻单元格的判断逻辑(例如 bombsArray.includes(cellNumb – 1))未考虑边界条件,导致非相邻单元格被错误地标记为绿色。

精确的边界检测与“绿色”单元格逻辑

为了解决上述问题,我们需要引入精确的边界检测机制,确保只有在有效范围内才进行相邻单元格的判断。这可以通过模运算(%)来实现。

假设网格的单元格编号从1开始,并且按行从左到右递增。gridLength 代表网格的行/列长度(例如,10×10网格中 gridLength 为10)。

立即学习“Java免费学习笔记(深入)”;

判断左右边界

一个单元格位于右边界:当其编号是 gridLength 的整数倍时。一个单元格位于左边界:当其编号模 gridLength 的结果为1时。

const atRightSide = cellNumb % gridLength === 0;const atLeftSide  = cellNumb % gridLength === 1;

修正“绿色”单元格判断逻辑“绿色”单元格表示与雷相邻的单元格。在判断这些单元格时,需要将边界条件纳入考虑。只有当单元格不在左边界时,才检查其左侧的邻居;只有当单元格不在右边界时,才检查其右侧的邻居。

// 假设 bombsArray 是包含所有雷单元格编号的数组// cellNumb 是当前正在处理的单元格编号// gridLength 是网格的边长if (bombsArray.includes(cellNumb)) {    singleCell.classList.add('bomb'); // 当前单元格是雷} else if (    // 检查水平方向的邻居,并排除跨界情况    (!atLeftSide && bombsArray.includes(cellNumb - 1)) || // 左邻居    (!atRightSide && bombsArray.includes(cellNumb + 1)) || // 右邻居    // 检查垂直方向的邻居,垂直方向无需特殊边界处理(因为不会“跨行”到另一端)    bombsArray.includes(cellNumb - gridLength) || // 上邻居    bombsArray.includes(cellNumb + gridLength) || // 下邻居    // 检查对角线方向的邻居,同样需要排除跨界情况    (!atLeftSide && bombsArray.includes(cellNumb - gridLength - 1)) || // 左上对角    (!atRightSide && bombsArray.includes(cellNumb - gridLength + 1)) || // 右上对角    (!atLeftSide && bombsArray.includes(cellNumb + gridLength - 1)) || // 左下对角    (!atRightSide && bombsArray.includes(cellNumb + gridLength + 1))    // 右下对角) {    singleCell.classList.add('green');    singleCell.addEventListener('click', function () {        addGreenPoints();    });}

扩展至多层邻近单元格(“蓝色”单元格)

除了直接相邻的“绿色”单元格,有时游戏可能需要标记距离更远的单元格,例如在扫雷中表示“两步之外有雷”的“蓝色”单元格。对于这些距离更远的单元格,同样的边界检测原则也适用,但需要根据距离调整边界判断逻辑。

例如,对于距离为2的水平方向单元格 (cellNumb – 2 或 cellNumb + 2),我们需要判断当前单元格是否距离边界至少有两格的距离。

// 距离边界两格的判断const twoRightSide = cellNumb % gridLength === 0 || (cellNumb + 1) % gridLength === 0;const twoLeftSide = (cellNumb - 1) % gridLength === 0 || (cellNumb) % gridLength === 2;// 注意:twoLeftSide 的 (cellNumb) % gridLength === 2 意味着 cellNumb 模 gridLength 余 2,即在第二列。// 如果 cellNumb 从 1 开始,则第一列是 1, 1+gridLength, ...// 第二列是 2, 2+gridLength, ...// 因此 (cellNumb - 1) % gridLength === 0 是第一列// (cellNumb - 1) % gridLength === 1 是第二列// (cellNumb - 1) % gridLength === gridLength - 1 是最后一列// 这里的 twoLeftSide 和 twoRightSide 定义需要根据具体需求和 cellNumb 的起始值精确调整。// 通常,atLeftSide 和 atRightSide 足够作为基础,然后在此基础上判断是否需要进一步的偏移量检查。

在判断“蓝色”单元格时,每一个潜在的邻居(无论是水平、垂直还是对角线,距离为2)都需要结合相应的边界条件进行检查。例如,检查 cellNumb – 2 时,必须确保 !twoLeftSide;检查 cellNumb – gridLength – 2 时,同样需要 !twoLeftSide。

由于“蓝色”单元格的组合非常多,其判断逻辑会变得冗长。核心思想是:对于任何可能跨越边界的计算,都必须在其条件中加入对应的边界检查。

性能优化与代码规范

除了逻辑修正,以下建议有助于提升代码质量和性能:

拼写修正:将代码中的 gridLenght 统一修正为正确的 gridLength。

使用 Set 优化 bombsArray:bombsArray.includes() 方法在大型数组中查找元素时,其时间复杂度为 O(n)。如果 bombsArray 包含大量雷,这会影响性能。将 bombsArray 转换为 Set 数据结构可以显著提高查找效率,Set.prototype.has() 方法的平均时间复杂度为 O(1)。

// 在初始化时,将雷的编号数组转换为 Setconst bombsSet = new Set(bombsArray);// 之后在判断时使用 .has() 方法if (bombsSet.has(cellNumb)) {    // ...} else if (    (!atLeftSide && bombsSet.has(cellNumb - 1)) ||    // ...) {    // ...}

总结

在网格类游戏开发中,精确处理边界条件是确保游戏逻辑正确性的关键。通过运用模运算进行边界检测,并根据单元格编号的起始值(本例中为1)进行调整,可以有效地避免因“跨界”计算导致的错误。对于不同距离的邻近单元格,应灵活应用相应的边界判断逻辑。同时,采纳如使用 Set 优化查找等性能建议,将有助于构建更健壮、高效的游戏应用。

以上就是优化JavaScript扫雷游戏:精确处理网格边界单元格逻辑的详细内容,更多请关注创想鸟其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
BOM中如何检测用户的邮件客户端支持?
上一篇 2025年12月20日 05:12:26
JavaScript的Number.isFinite方法是什么?如何使用?
下一篇 2025年12月20日 05:12:32

相关推荐

  • 使用构造器注入替代 @Autowired 注解

    使用构造器注入替代 @Autowired 注解使用构造器注入替代 @Autowired 注解使用构造器注入替代 @Autowired 注解使用构造器注入替代 @Autowired 注解

    本文旨在讲解如何使用构造器注入来替代 Spring 框架中的 @Autowired 注解,从而实现更简洁、更易于测试的代码。我们将通过一个实际案例,展示如何利用 Lombok 提供的 @AllArgsConstructor 注解简化构造器注入的过程,并解决可能遇到的问题,最终避免手动创建 Bean。…

    2026年9月26日 • 用户投稿
    000
  • sublime怎么配置python开发环境_sublime搭建Python开发环境教程

    sublime怎么配置python开发环境_sublime搭建Python开发环境教程sublime怎么配置python开发环境_sublime搭建Python开发环境教程sublime怎么配置python开发环境_sublime搭建Python开发环境教程sublime怎么配置python开发环境_sublime搭建Python开发环境教程

    首先安装Sublime Text并配置Package Control,接着安装Anaconda等插件以实现代码补全与检查,然后设置Python编译系统运行脚本,最后通过代码格式化、多光标编辑等功能提升开发效率。 Sublime Text 是一款轻量级但功能强大的代码编辑器,适合快速编写和调试 Pyt…

    2026年9月26日 • 用户投稿
    000
  • 拼多多推广怎么看是赚是亏?如何推广赚钱?拼多多推广盈亏一眼看穿!3招教你用推广稳赚不亏,新手必看!

    拼多多推广怎么看是赚是亏?如何推广赚钱?拼多多推广盈亏一眼看穿!3招教你用推广稳赚不亏,新手必看!拼多多推广怎么看是赚是亏?如何推广赚钱?拼多多推广盈亏一眼看穿!3招教你用推广稳赚不亏,新手必看!拼多多推广怎么看是赚是亏?如何推广赚钱?拼多多推广盈亏一眼看穿!3招教你用推广稳赚不亏,新手必看!拼多多推广怎么看是赚是亏?如何推广赚钱?拼多多推广盈亏一眼看穿!3招教你用推广稳赚不亏,新手必看!

    随着拼多多用户数量突破8亿大关,平台所释放的流量红利已成为商家争相抢占的关键资源。然而,在实际运营中,许多商家仍被“拼多多推广如何判断盈亏”这一核心问题困扰,常常陷入推广投入难以收回、效果不如预期的困局。本文将系统拆解如何借助数据分析与策略调整实现盈利性推广,并提供一套切实可行的赚钱实操框架。 一、…

    2026年9月26日 • 用户投稿
    000
  • 飞行模式恢复后能看到未接电话吗

    飞行模式恢复后能看到未接电话吗飞行模式恢复后能看到未接电话吗飞行模式恢复后能看到未接电话吗飞行模式恢复后能看到未接电话吗

    飞行模式下仍会显示未接电话通知,可以在关闭飞行模式后,在“电话”应用中的“语音信箱”或“通话记录”选项卡中查看未接电话的详细信息。 飞行模式下未接电话会显示 原因 ** 当设备处于飞行模式时,蜂窝网络和 Wi-Fi 连接将被禁用。不过,设备仍能接收数据,包括未接电话的通知。 无阶未来模型擂台/AI …

    2026年9月26日 • 用户投稿
    100
  • 曝克莱尔将在《生化危机9》回归!为剧情重要角色

    曝克莱尔将在《生化危机9》回归!为剧情重要角色曝克莱尔将在《生化危机9》回归!为剧情重要角色曝克莱尔将在《生化危机9》回归!为剧情重要角色曝克莱尔将在《生化危机9》回归!为剧情重要角色

    近日,有海外消息源透露了关于《生化危机》系列新作《生化危机9:安魂曲》(Resident Evil Requiem)的最新情报。据悉,这些信息来自曾参与游戏测试的内部人员,内容涉及角色设定与游戏时长等关键细节,但目前卡普空尚未对此作出官方确认。 据爆料,本作的主角将是一位名为“格蕾丝”(Grace)…

    2026年9月26日 • 用户投稿
    000
  • 多核处理器在运行虚拟机时有哪些优势?

    多核处理器在运行虚拟机时有哪些优势?多核处理器在运行虚拟机时有哪些优势?多核处理器在运行虚拟机时有哪些优势?多核处理器在运行虚拟机时有哪些优势?

    多核处理器通过提升并行处理能力使虚拟机运行更流畅,核心越多,可分配资源越多,减少上下文切换,提高并发效率,配合内存、存储、网络等优化,整体性能显著增强。 多核处理器让虚拟机运行更流畅,简单说,就是能同时处理更多任务,避免卡顿。虚拟机就像电脑里的“套娃”,每个都需要资源,核越多,分到的资源就多,自然跑…

    2026年9月26日 • 用户投稿
    000
  • Debian中OpenSSL版本如何查看

    Debian中OpenSSL版本如何查看Debian中OpenSSL版本如何查看Debian中OpenSSL版本如何查看Debian中OpenSSL版本如何查看

    本文介绍几种在Debian系统中查看OpenSSL版本的方法,助您快速获取所需信息。 方法一:命令行指令 打开终端(快捷键:Ctrl + Alt + T)。 执行以下命令: openssl version 回车后,终端将显示OpenSSL的版本信息。 方法二:dpkg包管理工具 使用dpkg命令查看…

    2026年9月26日 • 用户投稿
    000
  • 一键PHP环境怎么安装SSH服务_SSH远程连接配置方法

    答案:一键PHP环境不默认开启SSH服务,需手动安装并配置。首先检查系统是否已安装OpenSSH,若未安装则根据系统类型(Ubuntu/Debian或CentOS/RHEL)进行安装,并启用SSH服务。随后修改/etc/ssh/sshd_config文件,调整Port、PermitRootLogin…

    2026年9月26日
    100
  • 抖音店铺代运营收费标准是什么?抖音账号代运营

    抖音作为国内热门的短视频平台,吸引了众多商家入驻。为了在竞争激烈的市场中脱颖而出,许多商家选择寻求专业的抖音店铺代运营服务。抖音店铺代运营收费标准究竟如何?本文将为您揭秘。 一、抖音店铺代运营收费标准概述 抖音店铺代运营收费标准主要包括以下几个方面: 1. 基础服务费用:基础服务费用通常包括店铺运营…

    2026年9月26日
    000
  • 苹果灵动岛从哪款型号开始有

    苹果的灵动岛功能首次出现在 iPhone 14 Pro 和 iPhone 14 Pro Max 上。这两款设备凭借其先进的硬件配置,为灵动岛的流畅运行提供了坚实的技术支持。 从设计层面来看,灵动岛的引入标志着 iPhone 外观设计的一次重要革新。它取代了以往固定的刘海区域,以更具动态感和交互性的方…

    2026年9月26日
    100
  • 拼多多实名认证人脸识别安全吗?如何取消人脸识别? 拼多多人脸识别安全吗? 一招教你关闭人脸验证,保护隐私+避免数据泄露!

    拼多多实名认证人脸识别安全吗?如何取消人脸识别? 拼多多人脸识别安全吗? 一招教你关闭人脸验证,保护隐私+避免数据泄露!拼多多实名认证人脸识别安全吗?如何取消人脸识别? 拼多多人脸识别安全吗? 一招教你关闭人脸验证,保护隐私+避免数据泄露!拼多多实名认证人脸识别安全吗?如何取消人脸识别? 拼多多人脸识别安全吗? 一招教你关闭人脸验证,保护隐私+避免数据泄露!拼多多实名认证人脸识别安全吗?如何取消人脸识别? 拼多多人脸识别安全吗? 一招教你关闭人脸验证,保护隐私+避免数据泄露!

    在移动支付与电商交易日益普及的当下,拼多多作为国内领先的电商平台之一,已将人脸识别技术广泛应用于实名认证环节,以提升账户安全性。然而,用户对人脸信息隐私泄露的顾虑始终存在——拼多多的人脸识别究竟是否安全?这项验证能否由用户自主取消?本文将深入剖析其技术机制,并提供详细操作指引,帮助您真正掌握账户安全…

    2026年9月26日 • 用户投稿
    100
  • sublime的会话文件session保存在哪里_sublime会话文件Session存储位置

    sublime的会话文件session保存在哪里_sublime会话文件Session存储位置sublime的会话文件session保存在哪里_sublime会话文件Session存储位置sublime的会话文件session保存在哪里_sublime会话文件Session存储位置sublime的会话文件session保存在哪里_sublime会话文件Session存储位置

    Sublime Text的会话文件保存在系统特定目录中,Windows位于AppData/Roaming/Sublime Text/Local/,macOS在~/Library/Application Support/Sublime Text/Local/,Linux在~/.config/subli…

    2026年9月26日 • 用户投稿
    000
  • 如何在Java中实现对象克隆

    答案是Java中实现对象克隆需实现Cloneable接口并重写clone()方法,分为浅克隆和深克隆:浅克隆复制基本类型字段值,引用类型仅复制地址;深克隆则递归复制所有对象,确保完全独立。可通过手动克隆引用字段或序列化实现深克隆,使用时需注意异常处理、访问权限及可变对象的隔离问题,尽管克隆机制存在但…

    2026年9月26日
    100
  • 华为开发者大会曝光《王者荣耀》新英雄:孙权即将上线

    华为开发者大会曝光《王者荣耀》新英雄:孙权即将上线华为开发者大会曝光《王者荣耀》新英雄:孙权即将上线华为开发者大会曝光《王者荣耀》新英雄:孙权即将上线华为开发者大会曝光《王者荣耀》新英雄:孙权即将上线

    在 6 月 20 日举行的华为开发者大会 2025(hdc2025)上,华为与《王者荣耀》联合发布了一系列令人振奋的消息,其中最受关注的亮点之一便是全新英雄孙权即将上线。 华为常务董事、终端 BG 董事长余承东在大会上正式宣布 HarmonyOS 6 已面向开发者开放 Beta 版。作为新一代操作系…

    2026年9月26日 • 用户投稿
    000
  • Oracle数据库中空表导出遇到困难时的应对策略

    Oracle数据库中空表导出遇到困难时的应对策略Oracle数据库中空表导出遇到困难时的应对策略Oracle数据库中空表导出遇到困难时的应对策略Oracle数据库中空表导出遇到困难时的应对策略

    空表导出是数据库管理中常见的操作,但有时候遇到空表导出却遇到了困难,这时候我们需要使用一些特定的策略和技巧来解决问题。在Oracle数据库中,空表导出的困难通常出现在导出后的文件为空或者导出操作本身出现错误的情况。下面将介绍一些针对这些问题的应对策略,并提供具体的代码示例供参考。 策略一:检查导出文…

    2026年9月26日 • 用户投稿
    000
  • Debian上TigerVNC共享文件方法

    Debian上TigerVNC共享文件方法Debian上TigerVNC共享文件方法Debian上TigerVNC共享文件方法Debian上TigerVNC共享文件方法

    本文介绍如何在Debian系统上使用TigerVNC共享文件。 你需要先安装TigerVNC服务器,然后进行配置。 一、安装TigerVNC服务器 打开终端。更新软件包列表:sudo apt update安装TigerVNC服务器:sudo apt install tigervnc-standalo…

    2026年9月26日 • 用户投稿
    000
  • 百家号文章怎么发布_百家号文章发布流程及注意事项

    百家号文章怎么发布_百家号文章发布流程及注意事项百家号文章怎么发布_百家号文章发布流程及注意事项百家号文章怎么发布_百家号文章发布流程及注意事项百家号文章怎么发布_百家号文章发布流程及注意事项

    首先完成百家号注册与实名认证,再通过后台撰写结构清晰、原创合规的文章,添加合法素材与标签,预览无误后选择分类提交审核,发布后结合热点和关键词优化内容,并积极互动以提升推荐量。 如果您希望在百家号平台分享内容,但对发布流程和规范不够了解,则可能影响文章的审核效率与传播效果。以下是关于如何正确发布百家号…

    2026年9月26日 • 用户投稿
    000
  • 蔚蓝档案真琴技能怎么样 真琴角色强度详细解析

    蔚蓝档案真琴技能怎么样 真琴角色强度详细解析蔚蓝档案真琴技能怎么样 真琴角色强度详细解析蔚蓝档案真琴技能怎么样 真琴角色强度详细解析蔚蓝档案真琴技能怎么样 真琴角色强度详细解析

    角色定位与核心属性 作为歌赫娜学院的领导者,真琴在《蔚蓝档案》中扮演着至关重要的后排输出角色。她不仅具备强大的贯穿型攻击能力,还装备了特殊装甲以增强生存能力。其主要攻击方式为穿透伤害,对特定敌方单位具有显著优势。在基础属性上,真琴拥有高额的攻击力与暴击概率,使其成为队伍中不可或缺的主要输出核心。 被…

    2026年9月26日 • 用户投稿
    100
  • 如何通过豆包AI进行异常检测?离群值分析实战

    如何通过豆包AI进行异常检测?离群值分析实战如何通过豆包AI进行异常检测?离群值分析实战如何通过豆包AI进行异常检测?离群值分析实战如何通过豆包AI进行异常检测?离群值分析实战

    异常检测是识别数据集中不符合预期模式的数据点的过程,这些“异常”可能由错误、欺诈、设备故障等引起,在金融、网络安全、制造质量控制等领域具有重要意义。常见方法包括基于统计的z-score、iqr法;基于距离的knn;孤立森林;one-class svm;以及深度学习中的自编码器。其中孤立森林因高效性和…

    2026年9月26日 • 用户投稿
    000
  • 对象创建的主要流程是怎样的?(类加载检查、分配内存、初始化等)

    对象创建的主要流程是怎样的?(类加载检查、分配内存、初始化等)对象创建的主要流程是怎样的?(类加载检查、分配内存、初始化等)对象创建的主要流程是怎样的?(类加载检查、分配内存、初始化等)对象创建的主要流程是怎样的?(类加载检查、分配内存、初始化等)

    对象创建需经历类加载检查、内存分配和初始化三阶段。首先JVM检查类是否已加载,确保类结构合法并完成静态资源准备;随后在堆中为对象分配内存,采用指针碰撞或空闲列表方式,并通过TLAB或CAS解决并发问题;最后进行初始化,先将内存置零,设置对象头信息,再执行构造器完成实例化。类加载是前提,保障类型安全与…

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

发表回复

登录后才能评论
关注微信