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 ≥ 30
  • y坐标 < 0 或 y ≥ 20

2.2 自身碰撞

  • 蛇头与蛇身任意一节坐标重合
  • 不包括蛇头本身(索引0)

2.3 检测时机

每次蛇移动后,在插入新头部之前检测:

void_update(){PointnewHead=_getNewHead();// 计算新头部位置if(_checkCollision(newHead)){// 碰撞检测_gameOver();return;}snake.insert(0,newHead);// 无碰撞才插入}

三、墙壁碰撞检测

3.1 边界判断算法

bool_checkCollision(Pointpoint){// 检查墙壁碰撞if(point.x<0||point.x>=gridWidth||point.y<0||point.y>=gridHeight){returntrue;}// 检查自身碰撞(稍后讲解)// ...returnfalse;}

判断条件分析:

条件含义示例
point.x < 0超出左边界x=-1
point.x >= gridWidth超出右边界x=30
point.y < 0超出上边界y=-1
point.y >= gridHeight超出下边界y=20

为什么使用>=而不是>?

  • 有效坐标范围:0到gridWidth-1(即0到29)
  • gridWidth=30时,x=30已经超出边界
  • 所以判断条件是 x >= 30

3.2 坐标越界示例

// 示例1:蛇头在右边缘,向右移动Pointhead=Point(29,10);// 最右边direction=Direction.right;PointnewHead=Point(30,10);// 越界!_checkCollision(newHead);// 返回true// 示例2:蛇头在上边缘,向上移动Pointhead=Point(15,0);// 最上边direction=Direction.up;PointnewHead=Point(15,-1);// 越界!_checkCollision(newHead);// 返回true

3.3 代码实现

完整的墙壁碰撞检测:

bool_checkCollision(Pointpoint){// 墙壁碰撞检测if(point.x<0||point.x>=gridWidth||point.y<0||point.y>=gridHeight){returntrue;}// 自身碰撞检测for(varsegmentinsnake){if(segment.x==point.x&&segment.y==point.y){returntrue;}}returnfalse;}

四、自身碰撞检测

4.1 蛇身遍历算法

// 自身碰撞检测for(varsegmentinsnake){if(segment.x==point.x&&segment.y==segment.y){returntrue;// 发现碰撞}}

算法说明:

  1. 遍历snake列表中的每一节
  2. 将新头部坐标与每节坐标比较
  3. 如果x和y都相等,说明碰撞
  4. 返回true表示碰撞

4.2 头部与身体比较

重要:蛇头移动到的新位置,可能与蛇身的任意一节重合。

// 示例:蛇身坐标snake=[Point(5,10),// 索引0:当前头部Point(4,10),// 索引1:第二节Point(3,10),// 索引2:第三节];// 蛇向右移动,新头部PointnewHead=Point(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),];// 蛇头向上移动PointnewHead=Point(5,9);// 然后向右、向下移动...PointnewHead=Point(7,11);// 最终撞到自己的身体:(7,11) 与 (7,12) 相邻但y不同

4.3 时间复杂度分析

for(varsegmentinsnake){// O(n)if(segment.x==point.x&&segment.y==segment.y){returntrue;}}

时间复杂度:O(n)

  • n = snake.length(蛇的长度)
  • 最坏情况:遍历整个蛇身
  • 最好情况:第一节就碰撞(不太可能,因为蛇头不会撞到当前头部位置)

优化思路:

  • 蛇较短时(<100节),O(n)可接受
  • 蛇很长时,可以用HashSet存储身体坐标,O(1)查询
  • 但贪吃蛇游戏中蛇一般不会太长,O(n)足够

五、碰撞响应机制

5.1 游戏结束状态设置

void_gameOver(){isGameOver=true;gameTimer?.cancel();setState((){});}

状态变化:

  • isGameOver:false → true
  • 停止定时器
  • 更新UI显示游戏结束信息

5.2 定时器清理流程

void_gameOver(){isGameOver=true;// 标记游戏结束gameTimer?.cancel();// 取消定时器setState((){});// 触发UI更新}

为什么必须取消定时器?

  • 定时器会持续触发_update()
  • 如果不取消,会不断检测碰撞
  • 导致_gameOver()被重复调用
  • 浪费CPU资源

定时器清理时机:

  1. 游戏结束时:gameTimer?.cancel();
  2. 速度变化时:先cancel再重新创建
  3. 组件销毁时:dispose中cancel

5.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_GameHomePageStateextendsState<GameHomePage>{// ...bool_checkCollision(Pointpoint){// 墙壁碰撞检测if(point.x<0||point.x>=gridWidth||point.y<0||point.y>=gridHeight){returntrue;}// 自身碰撞检测for(varsegmentinsnake){if(segment.x==point.x&&segment.y==point.y){returntrue;}}returnfalse;}void_gameOver(){isGameOver=true;gameTimer?.cancel();setState((){});}void_update(){if(nextDirection!=null){direction=nextDirection!;}PointnewHead=_getNewHead();// 碰撞检测if(_checkCollision(newHead)){_gameOver();return;}snake.insert(0,newHead);if(newHead.x==food!.x&&newHead.y==food!.y){score+=10;if(speed>80){speed-=5;gameTimer?.cancel();_startGame();}_spawnFood();}else{snake.removeLast();}setState((){});}}

七、测试用例

测试1:墙壁碰撞

// 边界测试test('右边界碰撞',(){snake=[Point(29,10)];direction=Direction.right;PointnewHead=Point(30,10);expect(_checkCollision(newHead),true);});test('上边界碰撞',(){snake=[Point(15,0)];direction=Direction.up;PointnewHead=Point(15,-1);expect(_checkCollision(newHead),true);});

测试2:自身碰撞

test('撞到身体',(){snake=[Point(5,10),Point(4,10),Point(3,10),];// 蛇头移动到(3,10),与第三节重合PointnewHead=Point(3,10);expect(_checkCollision(newHead),true);});

八、总结

本文讲解了碰撞检测算法:

  1. 墙壁碰撞:检测坐标是否超出0-29和0-19范围
  2. 自身碰撞:遍历蛇身,比较坐标
  3. 游戏结束:设置标志、取消定时器、更新UI
  4. 时间复杂度:O(n),n为蛇身长度

关键要点:

  • 碰撞检测在移动前执行,防止无效移动
  • 定时器必须清理,避免资源浪费
  • 使用isGameOver标志控制UI状态

下篇预告:《Flutter for OpenHarmony 实战:食物生成算法与难度递增系统》

社区支持

欢迎加入开源 OpenHarmony 跨平台社区,获取更多技术支持和资源:

  • 社区论坛:开源 OpenHarmony 跨平台开发者社区
  • 技术交流:参与社区讨论,分享开发经验

如果本文对您有帮助,欢迎点赞、收藏和评论。您的支持是我持续创作的动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1220626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2026年旧变压器回收厂家推荐:铜陵市泰源物资回收有限公司,废旧/干式/厢式变压器全品类回收

在工业设备更新换代加速的背景下,变压器回收行业迎来发展机遇。据统计,2024年全国废旧变压器年产生量突破120万吨,其中干式变压器占比达35%,厢式变压器占比28%。铜陵市泰源物资回收有限公司凭借全品类回收能力,成…

基于Matlab的双边滤波去噪:图像的美颜魔法

基于Matlab的双边滤波去噪在图像处理领域&#xff0c;噪声就像是不速之客&#xff0c;破坏了图像原本的清晰与美感。双边滤波作为一种强大的去噪技术&#xff0c;如同图像的“美颜滤镜”&#xff0c;能在有效去除噪声的同时&#xff0c;最大程度保留图像的边缘细节。今天咱就来…

数据安全与合规:大数据治理的关键挑战与解决方案

数据安全与合规:大数据治理的关键挑战与解决方案 关键词:数据安全、合规性、大数据治理、隐私保护、数据泄露、监管法规、解决方案 摘要:在数字化时代,数据已成为企业的“数字石油”,但数据泄露、滥用等问题也频发。本文从“数据安全”与“合规”两大核心出发,结合生活案…

质量管理体系是什么,包括哪些内容?

谢邀。 质量管理体系是什么&#xff0c;包括哪些内容&#xff1f;很多老板一听质量管理体系&#xff0c;脑子里浮现的一般都是&#xff1a;“哦&#xff0c;就是那堆 ISO 文件和流程图吧&#xff1f;”实际上&#xff0c;企业真正头疼的并不是有没有文件&#xff0c;而是日常生…

Flutter for OpenHarmony 实战:贪吃蛇蛇的移动逻辑详解

Flutter for OpenHarmony 实战&#xff1a;贪吃蛇蛇的移动逻辑详解 文章目录 Flutter for OpenHarmony 实战&#xff1a;贪吃蛇蛇的移动逻辑详解一、前言二、坐标系统设计2.1 30x20网格坐标系2.2 坐标与像素映射2.3 Point类实现 三、Timer定时器实现自动移动3.1 Timer.periodic…

完整教程:Node.js 编程实战:自定义模块与包发布全流程解析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

强烈安利!8个AI论文网站测评:本科生毕业论文全攻略

强烈安利&#xff01;8个AI论文网站测评&#xff1a;本科生毕业论文全攻略 2026年AI论文写作工具测评&#xff1a;为何你需要这份指南&#xff1f; 随着人工智能技术的不断发展&#xff0c;越来越多的本科生开始借助AI工具辅助完成毕业论文的撰写。然而&#xff0c;面对市场上…

微信小程序开发一般多少钱?10年程序员给你讲透

我是专注小程序生态解决方案的技术,过去10年服务过近200家企业。每天被问最多的问题就是:“开发一个小程序到底要花多少钱?” 这就像问“装修一套房子多少钱”一样,答案差距很大,今天我就用真实行业经验帮你彻底搞…

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

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

P10137 [USACO24JAN] Walking in Manhattan G

大概想到了。 考虑行走过程,从某个点向右上方行走,将这个点先固定到遇到的第一个交点,那么我们现在的问题就仅针对于这 \(n^2\) 个交点了。 考察一个很关键的事情是,假设一条直线上有 \(k\) 个交点,这 \(k\) 个交…

基于S7-300 PLC和组态王的恒压供水系统搭建与实现

基于S7-300 PLC和组态王组态控制的恒压供水系统在工业自动化领域&#xff0c;恒压供水系统是保障稳定供水的关键环节。今天咱们就唠唠基于S7-300 PLC和组态王组态控制的恒压供水系统。 1. 系统整体架构 恒压供水系统主要目的是保证供水压力稳定&#xff0c;不管用水情况如何变化…

基于Tent映射的混合灰狼优化改进算法:Matlab代码复现与解析

一种基于Tent映射的混合灰狼优化的改进算法(Matlab&#xff0c;代码复现&#xff0c;效果与原文一致&#xff0c;数值为运行30次数据) 1.tent映射 2.非线性控制参数策略(有代码&#xff0c;可以出图) 3.pso思想 在优化算法的领域里&#xff0c;不断的创新与改进是推动问题高效…

自适应巡航 Carsim + Simulink 联合仿真:两车固定间距的奇妙之旅

自适应巡航Carsimsimulink联合仿真&#xff0c;两车仿真 不支持三车 固定间距&#xff0c;carsim纯电车&#xff0c;PID控制。 ACC固定间距策略。在自动驾驶领域&#xff0c;自适应巡航&#xff08;ACC&#xff09;是一项非常关键的技术。今天咱们就来聊聊基于 Carsim 和 Simul…

无人驾驶车辆高速MPC例子复现:从理论到实践

无人驾驶车辆第七章高速mpc的例子复现&#xff0c;包含caraim文件&#xff0c;simulink文件和m文件&#xff0c;不包含指导&#xff0c;目前成功退换为双移线 版本是18matlab 19carsim最近在搞无人驾驶车辆相关项目&#xff0c;第七章高速MPC的例子复现真是个有趣又有挑战的活儿…

基于TensorRT、YOLOv5和QT构建智能监控平台

tensorrt yolov5 QT 智能监控平台。 yolov5使用 tensorrt推理封装成dll&#xff0c;支持多线程多任务&#xff0c;可同时并行加载不同模型&#xff0c;同时检测。 Qt开发的监控平台&#xff0c;支持不同平台部署&#xff0c;视频监控&#xff0c;录像回放&#xff0c;电子地图&…

麻雀算法优化 XGBoost 实现拟合预测建模

麻雀算法SSA-XGboost&#xff0c;数据输入为多维输入单维输出的数据格式&#xff0c;直接替换就可以做拟合预测建模&#xff0c;程序内注释详细 在机器学习的领域中&#xff0c;我们常常需要寻找更优的模型来提升预测的准确性。今天就来聊聊如何使用麻雀算法&#xff08;SSA&a…

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

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

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

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

AI应用架构师的人机协作新范式流程设计最佳实践的技术支撑

AI应用架构师的人机协作新范式:流程设计与技术支撑的最佳实践 一、引言:为什么你的AI项目总在“人机拔河”? 1.1 一个扎心的钩子:你可能在“用AI”,但没“设计人机协作” 上周和一位金融科技公司的AI架构师聊天,他吐槽:“我们花了半年做的智能风控系统,上线后反而更…

方波高频注入技术及其在代码实现中的应用

方波高频注入&#xff0c;&#xff0c;&#xff0c;&#xff0c;代码实现。 最近在调无感FOC的时候发现零速工况下观测器容易丢人&#xff0c;传统的滑模观测器在低速时估计精度跳水严重。这时候突然想起来高频注入法这招——特别是方波注入方案&#xff0c;硬件开销小还不挑电…