从 0 开发一个鸿蒙小游戏(完整实战)

从 0 开发一个鸿蒙小游戏(完整实战)
在这里插入图片描述

子玥酱(掘金 / 知乎 / ZEEKLOG / 简书 同名)

大家好,我是子玥酱,一名长期深耕在一线的前端程序媛 👩‍💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚焦于业务型系统的工程化建设与长期维护。

我持续输出和沉淀前端领域的实战经验,日常关注并分享的技术方向包括前端工程化、小程序、React / RN、Flutter、跨端方案,
在复杂业务落地、组件抽象、性能优化以及多端协作方面积累了大量真实项目经验。

技术方向:前端 / 跨端 / 小程序 / 移动端工程化
内容平台:掘金、知乎、ZEEKLOG、简书
创作特点:实战导向、源码拆解、少空谈多落地
文章状态:长期稳定更新,大量原创输出

我的内容主要围绕 前端技术实战、真实业务踩坑总结、框架与方案选型思考、行业趋势解读 展开。文章不会停留在“API 怎么用”,而是更关注为什么这么设计、在什么场景下容易踩坑、真实项目中如何取舍,希望能帮你在实际工作中少走弯路。

子玥酱 · 前端成长记录官 ✨
👋 如果你正在做前端,或准备长期走前端这条路
📚 关注我,第一时间获取前端行业趋势与实践总结
🎁 可领取 11 类前端进阶学习资源(工程化 / 框架 / 跨端 / 面试 / 架构)
💡 一起把技术学“明白”,也用“到位”

持续写作,持续进阶。
愿我们都能在代码和生活里,走得更稳一点 🌱

文章目录

引言

前面我们聊了很多:

  • 架构
  • AI
  • 多端
  • 设计理念

但很多人心里还是有一个问题:

“能不能从 0 带我做一个完整的鸿蒙小游戏?”

很简单:

一个角色左右移动 点击得分 简单 AI 敌人 

同时,我们会遵循 HarmonyOS 推荐的结构:

State + UI + Service +(可选)Agent

一、项目结构(先搭骨架)

先不要写代码,先把结构定好:

entry ├─ pages │ └─ GamePage.ets │ ├─ components │ └─ Player.ets │ ├─ services │ └─ GameService.ets │ ├─ models │ └─ GameModel.ets │ └─ store └─ GameStore.ets 

核心思想:

UI / 逻辑 / 状态 分离 

二、定义游戏数据

// models/GameModel.etsexportinterfacePlayer{ x:number y:number}exportinterfaceEnemy{ x:number y:number}exportinterfaceGameState{ player: Player enemy: Enemy score:number}

先把“世界”定义出来。

三、状态管理

// store/GameStore.etsimport{ GameState }from'../models/GameModel'exportclassGameStore{ state: GameState ={ player:{ x:100, y:300}, enemy:{ x:200, y:100}, score:0}update(partial: Partial<GameState>){this.state ={...this.state,...partial }}}exportconst gameStore =newGameStore()

所有数据,都走这里。

四、业务逻辑

// services/GameService.etsimport{ gameStore }from'../store/GameStore'exportclassGameService{moveLeft(){ gameStore.update({ player:{...gameStore.state.player, x: gameStore.state.player.x -10}})}moveRight(){ gameStore.update({ player:{...gameStore.state.player, x: gameStore.state.player.x +10}})}addScore(){ gameStore.update({ score: gameStore.state.score +1})}}exportconst gameService =newGameService()

页面不直接改数据,只调用 Service。

五、UI 组件

// components/Player.ets@Componentexport struct Player {@Prop x:number@Prop y:numberbuild(){Image("player.png").width(50).height(50).position({ x:this.x, y:this.y })}}

UI 只负责展示。

六、主页面

// pages/GamePage.etsimport{ gameStore }from'../store/GameStore'import{ gameService }from'../services/GameService'import{ Player }from'../components/Player'@Entry@Component struct GamePage {@State state = gameStore.state aboutToAppear(){this.loop()}loop(){setInterval(()=>{this.enemyMove()},500)}enemyMove(){const newX =this.state.enemy.x +(Math.random()*20-10) gameStore.update({ enemy:{...this.state.enemy, x: newX }})this.state = gameStore.state }build(){Column(){// 玩家Player({ x:this.state.player.x, y:this.state.player.y })// 敌人Image("enemy.png").width(50).height(50).position({ x:this.state.enemy.x, y:this.state.enemy.y })// 分数Text(`Score: ${this.state.score}`).fontSize(20)// 操作按钮Row(){Button("←").onClick(()=> gameService.moveLeft())Button("→").onClick(()=> gameService.moveRight())Button("+1").onClick(()=> gameService.addScore())}}.width('100%').height('100%')}}

到这里,一个完整小游戏已经跑起来了。

七、加入简单 AI

我们让敌人“聪明一点”。

// services/EnemyAI.etsimport{ gameStore }from'../store/GameStore'exportclassEnemyAI{decide(){const{ player, enemy }= gameStore.state if(player.x > enemy.x){return'right'}else{return'left'}}act(){const action =this.decide()const delta = action ==='right'?5:-5 gameStore.update({ enemy:{...gameStore.state.enemy, x: gameStore.state.enemy.x + delta }})}}

页面中替换:

enemyAI.act()

现在敌人会“追你”。

八、优化结构

当前问题

this.state = gameStore.state 

手动同步。

优化方向

  • 使用状态订阅
  • 自动更新 UI

九、扩展方向

1、加入碰撞检测

if(distance(player, enemy)<50){gameOver()}

2、加入音效

audio.play("hit.mp3")

3、加入排行榜

leaderboard.submit(score)

4、加入 AI NPC

npcAgent.decide(state)

5、多设备扩展

手机控制 TV 显示 

这就是完整演进路径。

十、你刚刚做了什么?

很多人做完 Demo 会觉得:

“好像挺简单?”

但其实你已经完成了一件很重要的事情:

从:

写 UI 

到:

设计系统: State Service Component AI 

这就是鸿蒙开发的核心。

总结

我们从 0 做了一个完整鸿蒙小游戏,核心结构是:

Model(数据) Store(状态) Service(逻辑) Component(UI) 

并且扩展了:

AI(Enemy) 

如果用一句话总结这次实战:

你不是在“写一个小游戏”,而是在“搭一个可扩展的游戏系统”。

最后给你一个建议:不要停在这个 Demo。

你可以继续把它升级为:

  • 多端游戏
  • AI 游戏
  • 社交游戏

在 HarmonyOS 上,这样的项目,才刚刚开始有意思。

Read more

opencv之图像轮廓

opencv之图像轮廓

图像轮廓(Image Contour)是计算机视觉中用于识别和分析物体形状的核心概念。简单来说,它指的是图像中所有连续且具有相同颜色或灰度的点所组成的边界曲线。 要成功提取轮廓,最关键的一步是图像预处理:必须先将原始图像转换为二值图像(即只有纯黑和纯白,像素值分别为0和255)。通常,白色(255)代表前景物体,黑色(0)代表背景。 🔍 轮廓与边缘的区别 这是一个常见的混淆点,理解它们的差异至关重要: * 边缘 (Edge):是图像中像素灰度发生剧烈变化的点,是离散的、不连续的。例如,通过Canny算子检测出的就是边缘。 * 轮廓 (Contour):是连接起来的边缘点,形成一条连续的、有序的曲线,能够完整地勾勒出物体的外形。 🛠️ 核心工具:cv2.findContours() 在OpenCV库中,我们使用 cv2.findContours() 函数来查找轮廓。这个函数有几个关键参数,其中 mode(轮廓检索模式)决定了如何组织和返回找到的轮廓。 以下是四种主要的查找模式,它们决定了你如何处理物体及其内部的“孔洞”

AI-Security-05-AI隐私安全深度剖析

AI 隐私安全深度剖析:模型逆向、成员推断与数据重建 整理时间:2026-04-02 权威来源:arXiv Model Extraction Survey (2506.22521)、ACM S&P Model Extraction Paper、 Carlini et al. 训练数据记忆研究、Keysight TPUXtract 案例、Herish AI Model Extraction 实战分析 一、AI 隐私安全的三个维度 AI 隐私安全与传统数据隐私有本质区别: 传统数据隐私: ├─ 问题:如何防止未授权访问用户数据? ├─ 解决方案:加密、访问控制、差分隐私 └─ 边界:数据是静态的,有明确边界 AI 隐私安全的三个维度: 维度

Linux权限详解:从入门到掌握

Linux权限详解:从入门到掌握

Linux权限详解:从入门到掌握 在Linux系统中,权限管理是一个核心概念。如果你是初学者,可能会觉得它有些抽象,但只要理解了设计思想,你会发现它既严谨又优雅。本文将带你深入理解Linux权限体系,让你轻松管理文件和目录的访问控制。 一、Linux中的两类用户 Linux系统将用户分为两种: 用户类型提示符权限范围超级用户(root)#可以在系统中做任何事情,不受限制普通用户$只能做有限的操作,无法影响系统核心 切换用户命令:su bash # 从普通用户切换到root(需要输入root密码) su root # 从root切换到普通用户 su username 💡 小贴士:日常操作建议使用普通用户,只有在需要系统级配置时才切换到root,这样更安全。 二、文件访问者的三类身份 Linux将访问文件的用户划分为三个角色: 角色代号说明所有者(User)u创建文件的用户,拥有最高控制权所属组(Group)g与所有者同组的用户,用于团队协作其他人(Others)o既不是所有者也不在所属组中的用户 这种设计非常巧妙:既保证了文件主人的控制权,

GraphPad Prism 介绍是干啥的?安装教程

安装教程 安教和安包https://qqstone.top/blog/graphpad-prism-10.1.2 一、GraphPad Prism 是什么、用来干什么 GraphPad Prism 是专门面向生物医学、药学、生命科学、基础医学的科研统计与绘图软件,主打不用编程、操作简单、结果规范,是发表 SCI 论文最常用的工具之一。 主要用途: 1. 实验数据录入与管理:适合细胞、动物、分子、蛋白、免疫等各类实验数据。 2. 统计分析:t 检验、方差分析(ANOVA)、非参数检验、非线性回归(IC50/EC50)、生存曲线、ROC 曲线等。 3. 专业绘图:柱状图、散点图、