Flutter for OpenHarmony 实战:碰撞检测算法与游戏结束处理
Flutter for OpenHarmony 实战碰撞检测算法与游戏结束处理文章目录Flutter for OpenHarmony 实战碰撞检测算法与游戏结束处理一、前言二、碰撞检测概述2.1 墙壁碰撞2.2 自身碰撞2.3 检测时机三、墙壁碰撞检测3.1 边界判断算法3.2 坐标越界示例3.3 代码实现四、自身碰撞检测4.1 蛇身遍历算法4.2 头部与身体比较4.3 时间复杂度分析五、碰撞响应机制5.1 游戏结束状态设置5.2 定时器清理流程5.3 UI状态更新六、完整代码实现七、测试用例八、总结社区支持一、前言碰撞检测是游戏开发中的核心机制。在贪吃蛇游戏中需要检测两种碰撞撞墙边界碰撞和撞自己自身碰撞。本文将详细讲解这两种碰撞的检测算法、游戏结束处理流程以及状态管理。二、碰撞检测概述贪吃蛇游戏中需要检测的碰撞类型2.1 墙壁碰撞蛇头超出网格边界x坐标 0 或 x ≥ 30y坐标 0 或 y ≥ 202.2 自身碰撞蛇头与蛇身任意一节坐标重合不包括蛇头本身索引02.3 检测时机每次蛇移动后在插入新头部之前检测void_update(){PointnewHead_getNewHead();// 计算新头部位置if(_checkCollision(newHead)){// 碰撞检测_gameOver();return;}snake.insert(0,newHead);// 无碰撞才插入}三、墙壁碰撞检测3.1 边界判断算法bool_checkCollision(Pointpoint){// 检查墙壁碰撞if(point.x0||point.xgridWidth||point.y0||point.ygridHeight){returntrue;}// 检查自身碰撞稍后讲解// ...returnfalse;}判断条件分析条件含义示例point.x 0超出左边界x-1point.x gridWidth超出右边界x30point.y 0超出上边界y-1point.y gridHeight超出下边界y20为什么使用而不是有效坐标范围0到gridWidth-1即0到29gridWidth30时x30已经超出边界所以判断条件是 x 303.2 坐标越界示例// 示例1蛇头在右边缘向右移动PointheadPoint(29,10);// 最右边directionDirection.right;PointnewHeadPoint(30,10);// 越界_checkCollision(newHead);// 返回true// 示例2蛇头在上边缘向上移动PointheadPoint(15,0);// 最上边directionDirection.up;PointnewHeadPoint(15,-1);// 越界_checkCollision(newHead);// 返回true3.3 代码实现完整的墙壁碰撞检测bool_checkCollision(Pointpoint){// 墙壁碰撞检测if(point.x0||point.xgridWidth||point.y0||point.ygridHeight){returntrue;}// 自身碰撞检测for(varsegmentinsnake){if(segment.xpoint.xsegment.ypoint.y){returntrue;}}returnfalse;}四、自身碰撞检测4.1 蛇身遍历算法// 自身碰撞检测for(varsegmentinsnake){if(segment.xpoint.xsegment.ysegment.y){returntrue;// 发现碰撞}}算法说明遍历snake列表中的每一节将新头部坐标与每节坐标比较如果x和y都相等说明碰撞返回true表示碰撞4.2 头部与身体比较重要蛇头移动到的新位置可能与蛇身的任意一节重合。// 示例蛇身坐标snake[Point(5,10),// 索引0当前头部Point(4,10),// 索引1第二节Point(3,10),// 索引2第三节];// 蛇向右移动新头部PointnewHeadPoint(6,10);// 检测newHead与snake[0/1/2]比较// (6,10) vs (5,10) → 不同// (6,10) vs (4,10) → 不同// (6,10) vs (3,10) → 不同// 结果无碰撞碰撞示例// 蛇绕成一圈snake[Point(5,10),Point(5,11),Point(5,12),Point(6,12),Point(7,12),];// 蛇头向上移动PointnewHeadPoint(5,9);// 然后向右、向下移动...PointnewHeadPoint(7,11);// 最终撞到自己的身体(7,11) 与 (7,12) 相邻但y不同4.3 时间复杂度分析for(varsegmentinsnake){// O(n)if(segment.xpoint.xsegment.ysegment.y){returntrue;}}时间复杂度O(n)n snake.length蛇的长度最坏情况遍历整个蛇身最好情况第一节就碰撞不太可能因为蛇头不会撞到当前头部位置优化思路蛇较短时100节O(n)可接受蛇很长时可以用HashSet存储身体坐标O(1)查询但贪吃蛇游戏中蛇一般不会太长O(n)足够五、碰撞响应机制5.1 游戏结束状态设置void_gameOver(){isGameOvertrue;gameTimer?.cancel();setState((){});}状态变化isGameOverfalse → true停止定时器更新UI显示游戏结束信息5.2 定时器清理流程void_gameOver(){isGameOvertrue;// 标记游戏结束gameTimer?.cancel();// 取消定时器setState((){});// 触发UI更新}为什么必须取消定时器定时器会持续触发_update()如果不取消会不断检测碰撞导致_gameOver()被重复调用浪费CPU资源定时器清理时机游戏结束时gameTimer?.cancel();速度变化时先cancel再重新创建组件销毁时dispose中cancel5.3 UI状态更新overrideWidgetbuild(BuildContextcontext){returnScaffold(body:Column(children:[Expanded(child:CustomPaint(painter:GamePainter(...),),),// 游戏结束时显示if(isGameOver)Container(child:Column(children:[Text(游戏结束!),Text(最终得分:$score),ElevatedButton(onPressed:()_initGame(),child:Text(重新开始),),],),),],),);}UI变化游戏区域定格在最后状态游戏结束面板从隐藏变为显示控制按钮隐藏isGameOver为true时不显示六、完整代码实现class_GameHomePageStateextendsStateGameHomePage{// ...bool_checkCollision(Pointpoint){// 墙壁碰撞检测if(point.x0||point.xgridWidth||point.y0||point.ygridHeight){returntrue;}// 自身碰撞检测for(varsegmentinsnake){if(segment.xpoint.xsegment.ypoint.y){returntrue;}}returnfalse;}void_gameOver(){isGameOvertrue;gameTimer?.cancel();setState((){});}void_update(){if(nextDirection!null){directionnextDirection!;}PointnewHead_getNewHead();// 碰撞检测if(_checkCollision(newHead)){_gameOver();return;}snake.insert(0,newHead);if(newHead.xfood!.xnewHead.yfood!.y){score10;if(speed80){speed-5;gameTimer?.cancel();_startGame();}_spawnFood();}else{snake.removeLast();}setState((){});}}七、测试用例测试1墙壁碰撞// 边界测试test(右边界碰撞,(){snake[Point(29,10)];directionDirection.right;PointnewHeadPoint(30,10);expect(_checkCollision(newHead),true);});test(上边界碰撞,(){snake[Point(15,0)];directionDirection.up;PointnewHeadPoint(15,-1);expect(_checkCollision(newHead),true);});测试2自身碰撞test(撞到身体,(){snake[Point(5,10),Point(4,10),Point(3,10),];// 蛇头移动到(3,10)与第三节重合PointnewHeadPoint(3,10);expect(_checkCollision(newHead),true);});八、总结本文讲解了碰撞检测算法墙壁碰撞检测坐标是否超出0-29和0-19范围自身碰撞遍历蛇身比较坐标游戏结束设置标志、取消定时器、更新UI时间复杂度O(n)n为蛇身长度关键要点碰撞检测在移动前执行防止无效移动定时器必须清理避免资源浪费使用isGameOver标志控制UI状态下篇预告《Flutter for OpenHarmony 实战食物生成算法与难度递增系统》社区支持欢迎加入开源 OpenHarmony 跨平台社区获取更多技术支持和资源社区论坛开源 OpenHarmony 跨平台开发者社区技术交流参与社区讨论分享开发经验如果本文对您有帮助欢迎点赞、收藏和评论。您的支持是我持续创作的动力

相关新闻

Flutter for OpenHarmony 实战:贪吃蛇游戏核心架构设计

Flutter for OpenHarmony 实战:贪吃蛇游戏核心架构设计

Flutter for OpenHarmony 实战:贪吃蛇游戏核心架构设计 文章目录Flutter for OpenHarmony 实战:贪吃蛇游戏核心架构设计一、前言二、贪吃蛇游戏功能拆解2.1 核心游戏机制2.2 技术实现要点三、核心数据结构设计3.1 Direction方向枚举3.2 Point坐标类设计3…

2026/7/3 15:18:40 阅读更多 →
基于哈里斯鹰算法HHO-SEIR的传染病模型参数优化附Matlab代码

基于哈里斯鹰算法HHO-SEIR的传染病模型参数优化附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &#…

2026/7/6 13:11:11 阅读更多 →
【软考每日一练020】深入解析事务(Transaction)与ACID特性的工程实现

【软考每日一练020】深入解析事务(Transaction)与ACID特性的工程实现

【软考每日一练020】深入解析事务(Transaction)与ACID特性的工程实现 在数据库系统的设计与应用中,事务(Transaction) 是确保数据完整性的基石。本文将从一道经典试题出发,通过业务场景实例化与底层机制分析…

2026/7/3 18:47:18 阅读更多 →

最新新闻

Python数据结构实战:6大生产场景选型与避坑指南

Python数据结构实战:6大生产场景选型与避坑指南

1. 这不是又一篇“列表、字典、元组”的流水账——为什么你学了十遍Python数据结构还是写不出干净代码? “Python Data Structures Tutorial”这个标题,光看字面,像极了那些被点开率拖垮的入门教程:打开是三行定义,五张…

2026/7/7 21:11:26 阅读更多 →
Git prune 原理与安全清理:不可达对象的精准回收机制

Git prune 原理与安全清理:不可达对象的精准回收机制

1. 项目概述:Git prune 不是“删库”,而是给 Git 做一次精准的“淋巴引流” Git prune 这个命令,名字里带个“prune”(修剪),听起来像园艺活儿——剪掉枯枝败叶,让树更健康。但很多刚接触 Git 的…

2026/7/7 21:05:23 阅读更多 →
如何让ThinkPad风扇静音又高效:TPFanCtrl2终极配置指南

如何让ThinkPad风扇静音又高效:TPFanCtrl2终极配置指南

如何让ThinkPad风扇静音又高效:TPFanCtrl2终极配置指南 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 你是否厌倦了ThinkPad风扇的噪音?想要在…

2026/7/7 21:01:22 阅读更多 →
IQ-TREE:现代系统发育分析的终极高效解决方案

IQ-TREE:现代系统发育分析的终极高效解决方案

IQ-TREE:现代系统发育分析的终极高效解决方案 【免费下载链接】IQ-TREE Efficient phylogenomic software by maximum likelihood 项目地址: https://gitcode.com/gh_mirrors/iq/IQ-TREE 在生物信息学领域,处理大规模基因组数据并重建准确的系统发…

2026/7/7 21:01:22 阅读更多 →
数据清洗不是预处理,而是Python数据工作的第一思维习惯

数据清洗不是预处理,而是Python数据工作的第一思维习惯

1. 为什么数据清洗不是“脏活”,而是你写代码时最该前置的思维习惯刚入行那会儿,我带过几个实习生,他们写完一个漂亮的机器学习模型,准确率92%,兴冲冲跑来给我看结果。我问:“训练数据里缺失值怎么处理的&a…

2026/7/7 20:57:20 阅读更多 →
Excel时间序列分析实战:从数据清洗到Holt预测

Excel时间序列分析实战:从数据清洗到Holt预测

1. 为什么用电子表格做时间序列分析?这不是“将就”,而是清醒的选择很多人一听到“时间序列分析”,脑子里立刻跳出Python、R、Jupyter Notebook这些词,仿佛不写几行代码、不调几个scikit-learn的函数,就不算真正入门。…

2026/7/7 20:57:20 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻