「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏
本篇教程将带你实现一个数字填色小游戏,通过简单的交互逻辑,学习如何使用鸿蒙开发组件创建趣味性强的应用。

关键词
- UI互动应用
- 数字填色
- 动态交互
- 逻辑判断
- 游戏开发
一、功能说明
数字填色小游戏包含以下功能:
- 数字选择:用户点击数字按钮后选中一个数字。
- 区域填色:选择数字后,点击区域进行填色,颜色根据数字变化。
- 颜色逻辑映射:通过逻辑映射,将数字和颜色关联。
- 清空重置:支持清空所有区域,恢复默认状态。
二、所需组件
@Entry和@Component装饰器Canvas组件用于绘制填色区域Row和Column布局组件Button组件用于选择数字和重置操作@State修饰符用于状态管理
三、项目结构
- 项目名称:
DigitalColoringGame - 自定义组件名称:
ColoringGamePage - 代码文件:
ColorMapping.ets、ColoringGamePage.ets、Index.ets
四、代码实现
1. 定义颜色映射
// 文件名:ColorMapping.etsexport type ColorMapping = Record<number, string>;export const colorMapping: ColorMapping = {1: '#FF0000', // 红色2: '#00FF00', // 绿色3: '#0000FF', // 蓝色4: '#FFFF00', // 黄色5: '#FF00FF', // 品红
};
2. 数字填色游戏页面
// 文件名:ColoringGamePage.etsimport { colorMapping } from './ColorMapping';@Component
export struct ColoringGamePage {@State selectedNumber: number = 0; // 当前选择的数字@State coloredAreas: number[] = Array(9).fill(0); // 每个区域的颜色状态private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(); // 创建 Canvas 渲染上下文// 选择数字selectNumber(num: number): void {this.selectedNumber = num; // 更新选中数字}// 填色区域fillArea(index: number): void {if (this.selectedNumber !== 0) {this.coloredAreas[index] = this.selectedNumber; // 更新颜色状态this.redrawCanvas(); // 重新绘制画布}}// 绘制初始画布drawInitialCanvas(): void {for (let i = 0; i < 9; i++) {const x = (i % 3) * 110; // 计算区域的 x 坐标const y = Math.floor(i / 3) * 110; // 计算区域的 y 坐标this.context.fillStyle = colorMapping[this.coloredAreas[i]] || '#FFFFFF'; // 设置填充颜色this.context.fillRect(x, y, 100, 100); // 绘制填充矩形this.context.strokeStyle = '#000000'; // 边框颜色this.context.strokeRect(x, y, 100, 100); // 绘制边框}}// 重新绘制画布redrawCanvas(): void {this.context.clearRect(0, 0, 330, 330); // 清空画布this.drawInitialCanvas(); // 重新绘制}// 重置游戏resetGame(): void {this.coloredAreas = Array(9).fill(0); // 清空状态this.selectedNumber = 0; // 重置选中数字this.redrawCanvas(); // 重置画布}build() {Column({ space: 20 }) {Text('数字填色游戏').fontSize(24).fontWeight(FontWeight.Bold).alignSelf(ItemAlign.Center);// 显示填色区域Canvas(this.context).width(330).height(330).onReady(() => {this.drawInitialCanvas(); // 初始化画布}).onTouch((event: TouchEvent) => {const touch = event.touches[0]; // 获取触控点const x = Math.floor(touch.x / 110); // 计算列索引const y = Math.floor(touch.y / 110); // 计算行索引const index = y * 3 + x; // 计算区域索引if (index >= 0 && index < 9) {this.fillArea(index); // 更新对应区域颜色}});// 数字选择按钮Row({ space: 10 }) {ForEach([1, 2, 3, 4, 5], (num: number) => {Button(`${num}`).width(60).height(60).backgroundColor(colorMapping[num]).onClick(() => this.selectNumber(num)); // 选择数字});}// 重置按钮Button('重置').onClick(() => this.resetGame()) // 重置游戏.margin({ top: 20 }).width(100).height(50);}.padding(20).width('100%').height('100%');}
}
3. 主入口文件
// 文件名:Index.etsimport { ColoringGamePage } from './ColoringGamePage';@Entry
@Component
struct Index {build() {Column() {ColoringGamePage() // 调用数字填色游戏页面}.padding(20);}
}
效果示例:通过选择数字并点击区域,填充颜色,享受填色游戏的乐趣。
效果展示:
五、代码解读
-
颜色映射逻辑
ColorMapping.ets文件使用Record<number, string>定义数字到颜色的映射关系,便于扩展和管理。
-
区域填色逻辑
fillArea()方法根据当前选择的数字,为指定区域填色,实时更新画布。
-
数字选择与重置
- 通过
selectNumber()方法更新用户选择的数字,resetGame()方法一键清空填色区域并恢复默认状态。
- 通过
-
状态管理
- 使用
@State修饰符管理selectedNumber和coloredAreas,实现组件状态和界面的实时联动。
- 使用
六、优化建议
- 添加“未填色提示”,如动态高亮未填区域。
- 支持保存填色进度以便后续继续。
- 提供不同的配色主题,增强游戏的趣味性。
七、效果展示
- 数字选择与区域填色:用户点击数字按钮并点击区域,实现数字填色。
- 清空重置:一键清空所有区域,重新开始游戏。
八、相关知识点
- 「Mac畅玩鸿蒙与硬件16」鸿蒙UI组件篇6 - List和Grid组件展示数据列表
- 「Mac畅玩鸿蒙与硬件20」鸿蒙UI组件篇10 - Canvas组件自定义绘图
小结
通过本篇教程,用户掌握了使用鸿蒙组件实现数字填色小游戏的核心方法,进一步提升了开发互动性应用的能力。
下一篇预告
在下一篇「UI互动应用篇27 - 水果掉落小游戏」中,我们将学习如何实现一个互动性更强的水果掉落小游戏,增强用户的娱乐体验。
上一篇: 「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 简易购物车功能实现
下一篇: 「Mac畅玩鸿蒙与硬件50」UI互动应用篇27 - 水果掉落小游戏
作者:SoraLuna
链接:https://www.nutpi.net
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关文章:
「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏
本篇教程将带你实现一个数字填色小游戏,通过简单的交互逻辑,学习如何使用鸿蒙开发组件创建趣味性强的应用。 关键词 UI互动应用数字填色动态交互逻辑判断游戏开发 一、功能说明 数字填色小游戏包含以下功能: 数字选择:用户点击…...
机器学习经典算法——逻辑回归
目录 算法介绍 算法概念 算法的优缺点 LogisticRegression()函数理解 环境准备 算法练习 算法介绍 算法概念 逻辑回归(Logistic Regression)是一种广泛应用于分类问题的机器学习算法。 它基于线性回归的思想,但通过引入一个逻辑函数&…...
【数据仓库金典面试题】—— 包含详细解答
大家好,我是摇光~,用大白话讲解所有你难懂的知识点 该篇面试题主要针对面试涉及到数据仓库的数据岗位。 以下都是经典的关于数据仓库的问题,希望对大家面试有用~ 1、什么是数据仓库?它与传统数据库有何区别? 数据仓库…...
【UE5 C++课程系列笔记】19——通过GConfig读写.ini文件
步骤 1. 新建一个Actor类,这里命名为“INIActor” 2. 新建一个配置文件“Test.ini” 添加一个自定义配置项 3. 接下来我们在“INIActor”类中获取并修改“CustomInt”的值。这里定义一个方法“GetINIVariable” 方法实现如下,其中第16行代码用于构建配…...
JS 中 json数据 与 base64、ArrayBuffer之间转换
JS 中 json数据 与 base64、ArrayBuffer之间转换 json 字符串进行 base64 编码 function jsonToBase64(json) {return Buffer.from(json).toString(base64); }base64 字符串转为 json 字符串 function base64ToJson(base64) {try {const binaryString atob(base64);const js…...
USB 驱动开发 --- Gadget 驱动框架梳理
编译链接 #----》 linux_5.10/drivers/usb/gadget/Makefileobj-$(CONFIG_USB_LIBCOMPOSITE) libcomposite.o libcomposite-y : usbstring.o config.o epautoconf.o libcomposite-y composite.o functions.o configfs.o u_f.oobj-$(CONFIG_USB_GADG…...
细说STM32F407单片机中断方式CAN通信
目录 一、工程配置 1、时钟、DEBUG、USART6、GPIO、CodeGenerator 2、CAN1 3、NVIC 二、软件设计 1、KEYLED 2、can.h 3、can.c (1)CAN1中断初始化 (2)RNG初始化和随机数产生 (3) 筛选器组设置…...
Python应用指南:高德交通态势数据
在现代城市的脉络中,交通流量如同流动的血液,交通流量的动态变化对出行规划和城市管理提出了更高的要求。为了应对这一挑战,高德地图推出了交通态势查询API,旨在为开发者提供一个强大的工具,用于实时获取指定区域或道路…...
医学图像分析工具01:FreeSurfer || Recon -all 全流程MRI皮质表面重建
FreeSurfer是什么 FreeSurfer 是一个功能强大的神经影像学分析软件包,广泛用于处理和可视化大脑的横断面和纵向研究数据。该软件由马萨诸塞州总医院的Martinos生物医学成像中心的计算神经影像实验室开发,旨在为神经科学研究人员提供一个高效、精确的数据…...
.NET框架用C#实现PDF转HTML
HTML作为一种开放标准的网页标记语言,具有跨平台、易于浏览和搜索引擎友好的特性,使得内容能够在多种设备上轻松访问并优化了在线分享与互动。通过将PDF文件转换为HTML格式,我们可以更方便地在浏览器中展示PDF文档内容,同时也更容…...
mamba-ssm安装
注意1:mamba-ssm要与casual-conv1d一起安装。 注意2:mamba-ssm与cuda、pytorch版本要对应。需要看你下载的代码的requirements.txt causal-conv1d与mamba的whl包官网下载: https://github.com/Dao-AILab/causal-conv1d/releases?page3 htt…...
网络IP协议
IP(Internet Protocol,网际协议)是TCP/IP协议族中重要的协议,主要负责将数据包发送给目标主机。IP相当于OSI(图1)的第三层网络层。网络层的主要作用是失陷终端节点之间的通信。这种终端节点之间的通信也叫点…...
双指针算法详解
目录 一、双指针 二、双指针题目 1.移动零 解法: 代码: 2.复写零 编辑 解法: 代码: 边界情况处理: 3.快乐数 编辑 解法:快慢指针 代码: 4.盛水最多的容器 解法:(对撞指针)…...
MySQL的最左匹配原则是什么
最左匹配原则是应用于联合索引的规则。 对于以下表F:f1,f2,f3;建立了联合索引(f2,f3),那么我们在查询的时候如果是: select * from F where f2 ? and f3 ?; 或 sele…...
LeetCode:106.从中序与后序遍历序列构造二叉树
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:106.从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder ,其中 inorder …...
22. 【.NET 8 实战--孢子记账--从单体到微服务】--记账模块--切换主币种
这篇文章我们将结合主币种设置以及收支记录实现切换主币种后重新计算以前记录的转换后的金额。那么,为什么要在切换主币种后要重新计算转换后的金额呢?有以下两个原因: 统一的币种,方便我们统计数据方便用户按照当地的币种查看收…...
01.02周四F34-Day43打卡
文章目录 1. 地是湿的。昨晚估计下雨了。2. 你可能把包丢在餐厅里了吧?3. 她说他可能误了航班。4. 我本来应该早点来的,但路上特别堵。5. 约翰可能在那次事故中受了重伤。6. 这是一个情景对话7. 我本可以走另一条路的。8. 我准是瘦了不少,你看我这裤子现在多肥。9. 钱没了!会…...
行业商机信息付费小程序系统开发方案
行业商机信息付费小程序系统,主要是整合优质行业资源,实时更新的商机信息。在当今信息爆炸的时代,精准、高效地获取行业商机信息对于企业和个人创业者而言至关重要。 一、使用场景 日常浏览:用户在工作间隙或闲暇时间,…...
cut-命令详解
一、命令 1.cut列截取命令 cut命令的默认分隔符是制表符 2.参数: -f 列号 #提取第几列-d 分隔符 #按照指定分隔符分割列-c 字符范围 #不依赖分隔符来区分列,而是通过字符范围(行首为0)来进行字段提取。“n-”表…...
Apache MINA 反序列化漏洞CVE-2024-52046
漏洞描述: Apache MINA 是一个功能强大、灵活且高性能的网络应用框架。它通过抽象网络层的复杂性,提供了事件驱动架构和灵活的 Filter 链机制,使得开发者可以更容易地开发各种类型的网络应用。 Apache MINA 框架的 ObjectSerializationDeco…...
Veo 2提示词效能跃迁实战(工业级Prompt链构建全图谱)
更多请点击: https://codechina.net 第一章:Veo 2提示词编写的核心范式演进 Veo 2作为新一代视频生成模型,其提示词(prompt)工程已从早期的“关键词堆叠”转向结构化、语义分层与意图对齐的复合范式。这一演进并非简…...
Taurus多执行器对比实战:JMeter/Gatling/Locust统一压测方案
1. 为什么选Taurus做多执行器对比——不是为了炫技,而是为了少踩坑在性能测试领域,我见过太多团队卡在“选型”这一步:刚招来一个会写JMeter脚本的工程师,项目突然要压测WebSocket接口,发现JMeter原生支持弱、插件维护…...
MCP Server生产级配置:Playwright与LLM集成的避坑指南
1. 这不是又一个“Playwright入门教程”,而是一份能直接塞进CI流水线的MCP Server生产级配置实录你有没有遇到过这样的场景:团队刚决定用AI驱动自动化测试,技术选型会上大家一致看好Playwright MCP(Model Context Protocol&#…...
为什么92%的DeepSeek二次开发团队在6个月内遭遇交付延迟?——基于17个真实项目的技术债务归因分析
更多请点击: https://intelliparadigm.com 第一章:为什么92%的DeepSeek二次开发团队在6个月内遭遇交付延迟?——基于17个真实项目的技术债务归因分析 在对17个采用DeepSeek-R1/VL模型开展定制化开发的工业级项目进行回溯审计后,我…...
3分钟掌握HashCalculator:你的文件完整性守护专家
3分钟掌握HashCalculator:你的文件完整性守护专家 【免费下载链接】HashCalculator 哈希值计算工具,批量计算/批量校验/查找重复文件/改变哈希值等,支持集成到系统右键菜单 项目地址: https://gitcode.com/gh_mirrors/ha/HashCalculator …...
PCL 基于强度的双边滤波【2026最新版】
目录 一、算法原理 1、计算步骤 2、算法源码 3、函数解析 4、参考文献 二、代码实现 三、结果展示 四、滤波后未发生变化的原因 五、解决办法 六、结果展示 七、相关链接 本文由CSDN点云侠原创,博客长期更新,本文最近一次更新时间为:2026年5月24日。 一、算法原理 1、计算…...
GIS工程应用记录(AI辅助编程)
问题的问题:语境坍缩“从各个角度提出问题,AI做出对应积极答复和修改,结果没有什么变化。”这,就是元问题最核心的症状。你尝试了所有你已知的“高级”协作手段,但就像重拳打在棉花上,AI永远在积极回应&…...
通过Taotoken实现Hermes Agent自定义模型供应商接入
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过Taotoken实现Hermes Agent自定义模型供应商接入 Hermes Agent是一个流行的AI智能体开发框架,它支持通过配置自定义…...
告别坐标点击!用Poco精准定位UI控件,让你的Airtest安卓自动化脚本更稳定
告别坐标点击!用Poco精准定位UI控件,让你的Airtest安卓自动化脚本更稳定每次UI微调就导致脚本大面积失效?分辨率变化让精心编写的自动化测试瞬间崩溃?作为从坐标点击转型到控件识别的实践者,我深刻理解这种挫败感。三年…...
学了几天 Web 安全,终于搞懂什么是 XSS 了
xss的详细介绍最近开始正式学习 Web 安全。前面陆续学了:HTTPCookieSessionJWT RBAC然后发现很多地方都会提到一个东西:XSS以前一直感觉这个漏洞很抽象。网上很多文章一上来就是:<script>alert(1)</script>然后说:“弹…...
