Flutter for OpenHarmony 实战:打地鼠游戏完整开发指南
欢迎加入开源鸿蒙跨平台社区开源鸿蒙跨平台开发者社区Flutter for OpenHarmony 实战打地鼠游戏完整开发指南文章目录Flutter for OpenHarmony 实战打地鼠游戏完整开发指南摘要一、项目背景与功能概述1.1 打地鼠游戏介绍1.2 应用功能规划1.3 游戏配置二、数据模型设计2.1 游戏配置2.2 游戏初始化三、游戏循环实现3.1 开始游戏3.2 结束游戏四、地鼠生成算法4.1 随机生成地鼠4.2 难度调整五、点击检测实现5.1 打地鼠逻辑5.2 防止重复点击六、UI界面实现6.1 游戏网格6.2 地洞组件6.3 游戏信息面板七、资源管理7.1 定时器销毁7.2 游戏重置八、总结摘要打地鼠Whack-a-Mole是一款经典的街机休闲游戏玩家需要在有限时间内尽可能多地点击从地洞中冒出的地鼠来得分。本文将详细介绍如何使用Flutter for OpenHarmony框架开发一款功能完整的打地鼠游戏。文章涵盖了定时器管理、随机生成算法、点击检测、倒计时实现等核心技术点。通过本文学习读者将掌握Flutter在反应类游戏开发中的完整流程了解多定时器协调和状态管理的应用。一、项目背景与功能概述1.1 打地鼠游戏介绍打地鼠是一款考验反应速度的经典街机游戏目标在限定时间内打中尽可能多的地鼠规则地鼠随机从地洞中冒出点击地鼠得分每个地鼠只能打一次时间结束后游戏结束1.2 应用功能规划功能模块具体功能游戏网格3×3地洞布局地鼠生成随机位置、随机数量点击检测判断是否打中地鼠倒计时30秒游戏时间分数计算每打中一只得10分最高分记录保存历史最高分游戏控制开始、结束、重新开始视觉反馈打中特效显示1.3 游戏配置参数值说明网格大小3×3地洞数量游戏时长30秒倒计时地鼠显示时间800ms地鼠停留时间同时出现数量1-2只随机变化每只地鼠得分10分数增量二、数据模型设计2.1 游戏配置class_GamePageStateextendsStateGamePage{// 游戏配置staticconstint _gridRows3;staticconstint _gridCols3;staticconstint _gameDuration30;// 游戏时长秒staticconstint _moleShowTime800;// 地鼠显示时间毫秒// 游戏状态ListListbool_moles[];// 地鼠位置ListListbool?_hitStatus[];// 打击状态int _score0;// 当前分数int _bestScore0;// 最高分int _timeLeft_gameDuration;// 剩余时间bool _gameRunningfalse;// 游戏运行标志bool _gameOverfalse;// 游戏结束标志Timer?_gameTimer;// 游戏倒计时时钟Timer?_moleTimer;// 地鼠生成时钟finalRandom_randomRandom();}2.2 游戏初始化void_initGame(){_gameTimer?.cancel();_moleTimer?.cancel();_molesList.generate(_gridRows,(_)List.filled(_gridCols,false));_hitStatusList.generate(_gridRows,(_)List.filled(_gridCols,null));_score0;_timeLeft_gameDuration;_gameRunningfalse;_gameOverfalse;setState((){});}三、游戏循环实现3.1 开始游戏void_startGame(){_initGame();_gameRunningtrue;// 启动倒计时_gameTimerTimer.periodic(constDuration(seconds:1),(timer){setState((){_timeLeft--;if(_timeLeft0){_endGame();}});});// 启动地鼠生成_spawnMole();_moleTimerTimer.periodic(Duration(milliseconds:_moleShowTime),(timer){if(_gameRunning){_spawnMole();}});setState((){});}双定时器设计_gameTimer每秒触发一次处理倒计时_moleTimer每800ms触发一次生成新的地鼠3.2 结束游戏void_endGame(){_gameTimer?.cancel();_moleTimer?.cancel();_gameRunningfalse;_gameOvertrue;if(_score_bestScore){_bestScore_score;}_showGameOverDialog();}四、地鼠生成算法4.1 随机生成地鼠void_spawnMole(){setState((){// 清除之前的地鼠for(int r0;r_gridRows;r){for(int c0;c_gridCols;c){_moles[r][c]false;}}// 收集所有位置finalpositionsPoint[];for(int r0;r_gridRows;r){for(int c0;c_gridCols;c){positions.add(Point(r,c));}}positions.shuffle(_random);// 随机选择1-2个位置显示地鼠finalmoleCount_random.nextInt(2)1;for(int i0;imoleCountipositions.length;i){finalpospositions[i];_moles[pos.x.toInt()][pos.y.toInt()]true;_hitStatus[pos.x.toInt()][pos.y.toInt()]null;}});}算法特点使用洗牌算法随机排列位置随机选择1-2个位置显示地鼠清除旧地鼠状态避免重复4.2 难度调整可以通过调整参数来改变游戏难度// 简单模式地鼠显示时间长staticconstint _moleShowTime1200;// 困难模式地鼠显示时间短staticconstint _moleShowTime500;// 同时出现更多地鼠finalmoleCount_random.nextInt(3)1;// 1-3只五、点击检测实现5.1 打地鼠逻辑void_whackMole(int row,int col){if(!_gameRunning)return;if(!_moles[row][col])return;if(_hitStatus[row][col]true)return;// 已经打过了setState((){_hitStatus[row][col]true;_score10;// 立即隐藏地鼠_moles[row][col]false;});}检测条件游戏正在运行该位置有地鼠该地鼠还未被打过5.2 防止重复点击使用_hitStatus数组记录每个位置的打击状态null未显示地鼠false地鼠显示但未被打true地鼠已被打中六、UI界面实现6.1 游戏网格Widget_buildGameGrid(){returnContainer(padding:constEdgeInsets.all(16),decoration:BoxDecoration(color:Colors.green.shade200,borderRadius:BorderRadius.circular(16),border:Border.all(color:Colors.brown.shade700,width:4),),child:GridView.builder(primary:true,padding:EdgeInsets.zero,gridDelegate:constSliverGridDelegateWithFixedCrossAxisCount(crossAxisCount:_gridCols,crossAxisSpacing:16,mainAxisSpacing:16,childAspectRatio:1.0,),itemCount:_gridRows*_gridCols,itemBuilder:(context,index){finalrowindex~/_gridCols;finalcolindex%_gridCols;return_buildHole(row,col);},),);}6.2 地洞组件Widget_buildHole(int row,int col){finalhasMole_moles[row][col];finalisHit_hitStatus[row][col]true;returnGestureDetector(onTap:()_whackMole(row,col),child:Container(decoration:BoxDecoration(color:Colors.brown.shade700,borderRadius:BorderRadius.circular(16),border:Border.all(color:Colors.brown.shade900,width:3,),),child:Stack(children:[// 地洞背景Center(child:Container(width:80,height:40,decoration:BoxDecoration(color:Colors.brown.shade900,borderRadius:BorderRadius.circular(40),),),),// 地鼠if(hasMole!isHit)Positioned(bottom:20,left:0,right:0,child:Center(child:Container(width:60,height:60,decoration:BoxDecoration(color:Colors.brown,shape:BoxShape.circle,border:Border.all(color:Colors.brown.shade700,width:3,),),child:constColumn(mainAxisAlignment:MainAxisAlignment.center,children:[Icon(Icons.pets,size:24,color:Colors.white),SizedBox(height:2),Row(mainAxisAlignment:MainAxisAlignment.center,children:[Icon(Icons.visibility,size:8,color:Colors.black),SizedBox(width:8),Icon(Icons.visibility,size:8,color:Colors.black),],),Icon(Icons.sentiment_satisfied,size:16,color:Colors.white),],),),),),// 打击效果if(isHit)Positioned(bottom:20,left:0,right:0,child:Center(child:Container(width:60,height:60,decoration:BoxDecoration(color:Colors.amber,shape:BoxShape.circle,border:Border.all(color:Colors.orange,width:3),),child:constIcon(Icons.star,size:40,color:Colors.white,),),),),],),),);}6.3 游戏信息面板Container(padding:constEdgeInsets.all(16),color:Colors.brown.shade100,child:Row(mainAxisAlignment:MainAxisAlignment.spaceAround,children:[Column(children:[constIcon(Icons.score,size:20),constSizedBox(height:4),Text(得分:$_score,style:constTextStyle(fontSize:20,fontWeight:FontWeight.bold,),),],),Column(children:[constIcon(Icons.timer,size:20),constSizedBox(height:4),Text(时间:$_timeLeft秒,style:TextStyle(fontSize:20,fontWeight:FontWeight.bold,color:_timeLeft10?Colors.red:Colors.black,),),],),],),)七、资源管理7.1 定时器销毁overridevoiddispose(){_gameTimer?.cancel();_moleTimer?.cancel();super.dispose();}重要在dispose方法中取消所有定时器防止内存泄漏。7.2 游戏重置void_initGame(){_gameTimer?.cancel();// 先取消旧定时器_moleTimer?.cancel();// ... 初始化逻辑 ...setState((){});}八、总结本文详细介绍了使用Flutter for OpenHarthon开发打地鼠游戏的完整过程涵盖了以下核心技术点数据模型地鼠位置、打击状态、游戏配置游戏循环双定时器设计、倒计时实现地鼠生成随机算法、难度调整点击检测状态判断、防止重复UI实现网格布局、堆叠组件、动画效果资源管理定时器销毁、内存管理这个项目展示了Flutter在反应类游戏开发中的完整流程特别是多定时器协调和状态管理的应用。欢迎加入开源鸿蒙跨平台社区: 开源鸿蒙跨平台开发者社区

相关新闻

低查重AI教材编写秘籍,借助AI工具,轻松搞定教材难题

低查重AI教材编写秘籍,借助AI工具,轻松搞定教材难题

谁没有经历过编写教材框架时的苦恼呢?面对空白的文档,常常会无所适从,花费半个小时也没法发掘出知识点的合理排序——应该先介绍概念,还是先给出实例呢?章节该如何划分,是依据逻辑还是课时?不断…

2026/7/3 14:22:49 阅读更多 →
AI架构选择指南:从LLM到Agent,一文读懂4种AI系统设计模式(建议收藏)

AI架构选择指南:从LLM到Agent,一文读懂4种AI系统设计模式(建议收藏)

编者按: 当前 AI 系统建设中的一大痛点是:盲目追求先进技术而忽视业务实际需求,导致系统过度复杂、成本高昂、可靠性差。许多团队在 Agent 热潮中迷失方向,不知道何时该用简单的 LLM,何时需要 RAG,什么场景…

2026/7/3 5:58:18 阅读更多 →
大模型Agent搭建完整指南:从基础到实战,一篇就够了(收藏版)

大模型Agent搭建完整指南:从基础到实战,一篇就够了(收藏版)

前言近一年agent不断火热,或是大模型借助工具自助决策完成任务,或是通过静态编排的工作流自动顺序执行结果,让我们在处理相关任务时效率得到指数级提高。 尽管可以在很多智能体商店找到一些场景下的agent项目,但为了能够个性化满足…

2026/7/3 14:22:52 阅读更多 →

最新新闻

utdnsmasq源码解析:Rust实现的DNS缓存机制

utdnsmasq源码解析:Rust实现的DNS缓存机制

utdnsmasq源码解析:Rust实现的DNS缓存机制 【免费下载链接】utdnsmasq utdnsmasq is a refactoring of dnsmasq. 项目地址: https://gitcode.com/openeuler/utdnsmasq 前往项目官网免费下载:https://ar.openeuler.org/ar/ utdnsmasq是openEuler项…

2026/7/3 15:29:34 阅读更多 →
智驾不是自动驾驶:L2级辅助驾驶的本质与安全边界

智驾不是自动驾驶:L2级辅助驾驶的本质与安全边界

1. 项目概述:一场被误读的技术概念纠偏“智驾”不是“自动驾驶”——这句话从公安部官网发布后,迅速登上各大平台热搜。但很多人点进去只扫了一眼标题就划走,以为又是官媒在喊口号、打预防针。其实这短短十个字背后,是一次对行业术…

2026/7/3 15:27:29 阅读更多 →
AD74413R与PIC32MX675F512L的高精度混合信号系统设计

AD74413R与PIC32MX675F512L的高精度混合信号系统设计

1. 项目概述:AD74413R与PIC32MX675F512L的协同工作 在嵌入式系统设计中,同时实现高精度模拟信号采集(ADC)和输出(DAC)是工业控制、测试测量等领域的常见需求。AD74413R作为ADI公司推出的软件可配置输入/输出…

2026/7/3 15:27:29 阅读更多 →
SIP工艺在电流频率转换模块中的应用:陶瓷封装、金丝键合与气密性设计的技术优势

SIP工艺在电流频率转换模块中的应用:陶瓷封装、金丝键合与气密性设计的技术优势

电流频率(I/F)转换模块作为测控系统中的关键信号链路器件,其封装形式直接影响整体系统的集成度、可靠性和环境适应性。本文从SIP(System in Package)封装工艺的角度,分析将I/F转换电路集成到SIP模块中的技术…

2026/7/3 15:25:28 阅读更多 →
4-20mA电流环原理与INA196工业检测方案

4-20mA电流环原理与INA196工业检测方案

1. 4-20mA电流环基础与行业应用工业现场最让人头疼的莫过于信号传输过程中的干扰问题。记得我第一次在化工厂调试传感器时,电压信号在长距离传输后衰减严重,导致控制室显示的数值和现场实际值相差甚远。这正是4-20mA电流环标准在工业领域经久不衰的根本原…

2026/7/3 15:23:28 阅读更多 →
Windows端微信QQ防撤回原理与实战:RevokeMsgPatcher工具深度解析

Windows端微信QQ防撤回原理与实战:RevokeMsgPatcher工具深度解析

1. 项目概述:为什么我们需要一个“防撤回”工具? 在即时通讯软件成为工作与生活核心的今天,微信和QQ的“消息撤回”功能,就像一把双刃剑。一方面,它给了我们修正口误、弥补失误的机会;另一方面,…

2026/7/3 15:23:28 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻