「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏

news2025/1/3 6:32:09

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

在这里插入图片描述


关键词
  • UI互动应用
  • 数字填色
  • 动态交互
  • 逻辑判断
  • 游戏开发

一、功能说明

数字填色小游戏包含以下功能:

  1. 数字选择:用户点击数字按钮后选中一个数字。
  2. 区域填色:选择数字后,点击区域进行填色,颜色根据数字变化。
  3. 颜色逻辑映射:通过逻辑映射,将数字和颜色关联。
  4. 清空重置:支持清空所有区域,恢复默认状态。

二、所需组件
  • @Entry@Component 装饰器
  • Canvas 组件用于绘制填色区域
  • RowColumn 布局组件
  • Button 组件用于选择数字和重置操作
  • @State 修饰符用于状态管理

三、项目结构
  • 项目名称DigitalColoringGame
  • 自定义组件名称ColoringGamePage
  • 代码文件ColorMapping.etsColoringGamePage.etsIndex.ets

四、代码实现
1. 定义颜色映射
// 文件名:ColorMapping.ets

export type ColorMapping = Record<number, string>;

export const colorMapping: ColorMapping = {
  1: '#FF0000', // 红色
  2: '#00FF00', // 绿色
  3: '#0000FF', // 蓝色
  4: '#FFFF00', // 黄色
  5: '#FF00FF', // 品红
};

2. 数字填色游戏页面
// 文件名:ColoringGamePage.ets

import { 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.ets

import { ColoringGamePage } from './ColoringGamePage';

@Entry
@Component
struct Index {
  build() {
    Column() {
      ColoringGamePage() // 调用数字填色游戏页面
    }
    .padding(20);
  }
}

效果示例:通过选择数字并点击区域,填充颜色,享受填色游戏的乐趣。

效果展示
在这里插入图片描述


五、代码解读
  1. 颜色映射逻辑

    • ColorMapping.ets 文件使用 Record<number, string> 定义数字到颜色的映射关系,便于扩展和管理。
  2. 区域填色逻辑

    • fillArea() 方法根据当前选择的数字,为指定区域填色,实时更新画布。
  3. 数字选择与重置

    • 通过 selectNumber() 方法更新用户选择的数字,resetGame() 方法一键清空填色区域并恢复默认状态。
  4. 状态管理

    • 使用 @State 修饰符管理 selectedNumbercoloredAreas,实现组件状态和界面的实时联动。

六、优化建议
  1. 添加“未填色提示”,如动态高亮未填区域。
  2. 支持保存填色进度以便后续继续。
  3. 提供不同的配色主题,增强游戏的趣味性。

七、效果展示
  • 数字选择与区域填色:用户点击数字按钮并点击区域,实现数字填色。
  • 清空重置:一键清空所有区域,重新开始游戏。

八、相关知识点
  • 「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
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


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

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

相关文章

001__VMware软件和ubuntu系统安装(镜像)

[ 基本难度系数 ]:★☆☆☆☆ 一、Vmware软件和Ubuntu系统说明&#xff1a; a、Vmware软件的说明&#xff1a; 官网&#xff1a; 历史版本&#xff1a; 如何下载&#xff1f; b、Ubuntu系统的说明&#xff1a; 4、linux系统的其他版本&#xff1a;红旗(redhat)、dibian、cent…

【NebulaGraph】变化的多跳查询

【NebulaGraph】变化的多跳查询 1. 需求2. 解决方案2.1 确定查询结构2.2 构建查询语句 3. 追加需求&#xff1a;如果增加每一跳都要指定查询某SPACE下的Tag&#xff0c;或者不查询某个Tag怎么办 1. 需求 存在多跳请求&#xff0c;其中每一跳是从上一跳查询结果为基础的。但是 …

【Compose multiplatform教程06】用IDEA编译Compose Multiplatform常见问题

当我们从Kotlin Multiplatform Wizard | JetBrains 下载ComposeMultiplatform项目时 会遇到无法正常编译/运行的情况&#xff0c;一般网页和桌面是可以正常编译的&#xff0c; 我这里着重解决如下问题 1:Gradle版本不兼容或者Gradle连接超时 2:JDK版本不兼容 3:Gradle依赖库连…

如何利用无线路由器实现水泵房远程监测管理

水泵站广泛部署应用在工农业用水、防洪、排涝和抗旱减灾等方面&#xff0c;如果水泵站发生异常&#xff0c;往往会对生产生活造成诸多损失&#xff0c;甚至引发安全事故。因此&#xff0c;建立一套高效、可靠的泵站远程监测管理系统至关重要。 方案背景 目前&#xff0c;我国大…

vue3学习笔记(9)-pinia、storeToRefs、getters

1.新的集中式状态&#xff08;数据&#xff09;管理库&#xff0c;redux vuex pinia 搭建 2.ref拆包 如果在reactive里面定义ref&#xff0c;则打印c时&#xff0c;无需.value 他自动拆包&#xff0c;如果直接在外面定义的ref则需要.value,他没有拆包 3.pinia存储读取数据 存…

【Qt】容器控件、布局管理控件

目录 容器控件 QGroupBox QTabWidget 布局管理控件 QVBoxLayout 例子&#xff1a; QHBoxLayout 例子&#xff1a; QGridLayout 例子&#xff1a; 例子&#xff1a; QFormLayout 例子&#xff1a; QSpacerItem 例子&#xff1a; 容器控件 QGroupBox 表示一个带有…

计算机的错误计算(一百九十六)

摘要 用两个大模型计算 arccos(0.444). 结果保留 4位有效数字。两个大模型的计算结果相同&#xff0c;并均有误差。 例1. 计算 arccos(0.444). 结果保留 4位有效数字。 下面是与一个大模型的对话。 以上为与一大模型的对话。 下面是与另一大模型的对话。 点评&#xff1a; &…

Unity开发微信小游戏踩坑总结

前言 不记录真记不住&#xff0c;这个帖子以后不定时更新。 问题1&#xff1a;图片模糊 问题描述&#xff1a; 在Unity里什么事没有&#xff0c;进入到微信开发者工具里就已经模糊了&#xff0c;人物动画是一团马赛克&#xff0c;图片看着倒是没事。 问题原因&#xff1a;…

Python爬虫教程——7个爬虫小案例(附源码)_爬虫实例

本文介绍了7个Python爬虫小案例&#xff0c;包括爬取豆瓣电影Top250、猫眼电影Top100、全国高校名单、中国天气网、当当网图书、糗事百科段子和新浪微博信息&#xff0c;帮助读者理解并实践Python爬虫基础知识。 包含编程资料、学习路线图、源代码、软件安装包等&#xff01;【…

kafka小实站

需要先在前面的文章里面照着下载好kafka&#xff0c;并且启动 先启动zookeeper 项目目录 package kafka; import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.springframework.kafka.annotation.KafkaListener; import…

【从零开始入门unity游戏开发之——C#篇39】C#反射使用——Type 类、Assembly 类、Activator 类操作程序集

文章目录 前言一、前置知识1、编译器2、程序集&#xff08;Assembly&#xff09;3、元数据&#xff08;Metadata&#xff09; 二、反射1、反射的概念2、反射的作用3、反射的核心Type 类3.1 Type 类介绍3.2 不同方法获取 Type3.3 获取type类型所在的程序集的相关信息 4、反射的常…

(桌面运维学习)通过备份C盘,进行Windows系统的软件初始化

通过PE工具备份C盘&#xff0c;进行Windows系统的软件初始化 需求场景&#xff1a;快速初始化一批型号和主板一样的电脑系统型号也要一致&#xff08;Win10专业版就最好全是WIn10专业版&#xff09;&#xff0c;初始化的内容包括已配置好的环境和已安装的软件。主要用于公司桌面…

【ELK】ES单节点升级为集群模式--太细了!

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言准备工作1. 查看现状【单节点】2. 原节点改集群模式3. 改es配置文件&#xff0c;增加集群相关配置项4. *改docker映射的端口* 启动新节点5. docker-compose起一…

Path-of-Thoughts:将“思维链“升级为“思维图“,三阶段框架取代单一推理,提升大模型复杂关系推理准确性至88.2%与效率提升5%

Path-of-Thoughts&#xff1a;将"思维链"升级为"思维图"&#xff0c;三阶段框架取代单一推理&#xff0c;提升大模型复杂关系推理准确性至88.2%与效率提升5% 论文大纲理解通用流程框架 观察和假设观察现象提出假设实验验证解法拆解解法&#xff1a;Path-of…

ThinkPHP 8高效构建Web应用-第一个简单的MVC应用示例

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 我们先实现一…

No.3十六届蓝桥杯备战|数据类型长度|sizeof|typedef|练习(C++)

数据类型⻓度 每⼀种数据类型都有⾃⼰的⻓度&#xff0c;使⽤不同的数据类型&#xff0c;能够创建出⻓度不同的变量&#xff0c;变量⻓度的不同&#xff0c;存储的数据范围就有所差异。 sizeof操作符 sizeof 是⼀个关键字&#xff0c;也是操作符&#xff0c;专⻔是⽤来计算特…

大数据组件(一)快速入门调度组件Airflow

大数据组件(一)快速入门调度组件Airflow DolphinScheduler和 Airflow是数据领域很流行的两款开源任务调度系统。DolphinScheduler 致力于用可视化的方式去完成一个 DAG 工作流&#xff0c;而 Airflow 则想的是用类似于编程的方式完成一个 DAG 工作流。 Apache DolphinSchedule…

jpeg学习

相关最全的一篇文章链接&#xff1a;https://www.cnblogs.com/wtysos11/p/14089482.html YUV基础知识 Y表示亮度分量&#xff1a;如果只显示Y的话&#xff0c;图像看起来会是一张黑白照。 U&#xff08;Cb&#xff09;表示色度分量&#xff1a;是照片蓝色部分去掉亮度&#x…

内部类(3)

大家好&#xff0c;今天我们继续来看看内部类&#xff0c;今天我们来学习一下内部类的分类&#xff0c;我们来看看一共有几种&#xff0c;它们有什么作用&#xff0c;那么话不多说&#xff0c;我们直接开始。 9.1 内部类的分类 先来看下,内部类都可以在一个类的哪些位置进行定…

你还在用rand()生成随机数?

1. rand() 的缺陷 伪随机数生成器使用数学算法来产生具有良好统计特性的数字序列&#xff0c;但这些数字并非真正随机。 C 标准库中的 rand() 函数并不保证所生成的随机序列的质量。某些 rand() 实现生成的数字周期较短&#xff0c;且这些数字是可以预测的。对于有强伪随机数…