「Mac畅玩鸿蒙与硬件38」UI互动应用篇15 - 猜数字增强版

简介: 本篇将带你实现一个升级版的数字猜谜游戏。相比基础版,新增了计分和历史记录功能,用户可以在每次猜测后查看自己的得分和猜测历史。此功能展示了状态管理的进阶用法以及如何保存和显示历史数据。

本篇将带你实现一个升级版的数字猜谜游戏。相比基础版,新增了计分和历史记录功能,用户可以在每次猜测后查看自己的得分和猜测历史。此功能展示了状态管理的进阶用法以及如何保存和显示历史数据。

20241130_005559.gif


关键词
  • UI互动应用
  • 数字猜谜
  • 状态管理
  • 历史记录
  • 用户交互

一、功能说明

在猜数字增强版中,应用会随机生成一个目标数字,用户可以反复猜测,直到猜中目标数字。应用会记录每次猜测的历史信息,包括猜测的数字和提示信息,同时为每次猜对目标数字的用户加分。


二、所需组件

  • @Entry@Component 装饰器
  • Column 布局组件
  • TextInput 组件用于用户输入
  • Text 组件用于显示提示信息
  • Button 组件用于提交答案
  • @State 修饰符用于状态管理

三、项目结构

  • 项目名称GuessGameEnhancedApp
  • 自定义组件名称GuessGameEnhancedPage
  • 代码文件GuessGameEnhancedPage.etsIndex.ets

四、代码实现

// 文件名:GuessGameEnhancedPage.ets

@Component
export struct GuessGameEnhancedPage {
   
  @State targetNumber: number = this.generateRandomNumber(); // 随机目标数字
  @State guess: string = ''; // 用户当前输入
  @State feedback: string = '输入一个数字开始猜谜'; // 提示信息
  @State score: number = 0; // 用户得分
  @State history: string[] = []; // 猜测历史记录
  @State isGameOver: boolean = false; // 游戏状态

  private generateRandomNumber(): number {
   
    return Math.floor(Math.random() * 100) + 1; // 生成1-100的随机整数
  }

  build() {
   
    Column({
    space: 20 }) {
    // 创建垂直布局
      // 显示提示信息
      Text(this.feedback)
        .fontSize(20)
        .alignSelf(ItemAlign.Center);

      // 显示当前得分
      Text(`当前得分: ${
     this.score}`)
        .fontSize(18)
        .fontColor(Color.Blue)
        .alignSelf(ItemAlign.Center);

      // 输入数字
      TextInput({
    placeholder: '输入你的猜测数字' })
        .type(InputType.Number)
        .onChange((value: string) => this.guess = value)
        .enabled(!this.isGameOver)
        .width('80%')
        .alignSelf(ItemAlign.Center);

      // 提交按钮
      Button(this.isGameOver ? '重新开始' : '提交猜测')
        .onClick(() => {
   
          if (this.isGameOver) {
   
            this.resetGame();
          } else {
   
            this.checkGuess();
          }
        })
        .fontSize(18)
        .backgroundColor(this.isGameOver ? Color.Green : Color.Blue)
        .fontColor(Color.White)
        .width('50%')
        .alignSelf(ItemAlign.Center);

      // 显示猜测历史记录
      Column({
    space: 10 }) {
   
        ForEach(this.history, (entry: string) => {
   
          Text(entry)
            .fontSize(16)
            .fontColor(Color.Gray);
        });
      }
      .alignSelf(ItemAlign.Start);
    }
    .padding(20)
    .width('100%')
    .height('100%')
    .alignItems(HorizontalAlign.Center);
  }

  private checkGuess() {
   
    const guessNumber = parseInt(this.guess);
    if (isNaN(guessNumber)) {
   
      this.feedback = '请输入一个有效的数字!';
      return;
    }

    if (guessNumber < this.targetNumber) {
   
      this.feedback = '高一点!';
    } else if (guessNumber > this.targetNumber) {
   
      this.feedback = '低一点!';
    } else {
   
      this.feedback = '恭喜你,猜对了!';
      this.isGameOver = true;
      this.score += 1; // 猜对加分
    }
    this.history.push(`你猜的是 ${
     guessNumber},提示: ${
     this.feedback}`);
  }

  private resetGame() {
   
    this.targetNumber = this.generateRandomNumber();
    this.guess = '';
    this.feedback = '输入一个数字开始猜谜';
    this.isGameOver = false;
    this.history = []; // 清空历史记录
  }
}
// 文件名:Index.ets

import {
    GuessGameEnhancedPage } from './GuessGameEnhancedPage';

@Entry
@Component
struct Index {
   
  build() {
   
    Column() {
   
      GuessGameEnhancedPage() // 调用增强版猜数字游戏页面
    }
    .padding(20)
  }
}

效果示例:用户在输入数字并提交后,应用显示提示信息,同时记录每次的猜测历史。当猜对时,得分加1,并可以点击“重新开始”重置游戏。

20241130_005559.gif


五、代码解读

  • 历史记录管理:通过 @State history 保存用户的每次猜测和提示,实时更新显示内容。
  • 得分系统:通过 @State score 记录用户的猜对次数,并在每次猜对时加分。
  • 复用组件:借助 ForEach 动态渲染历史记录内容,提高代码可读性和扩展性。

六、优化建议

  1. 难度选择:添加选项允许用户选择不同的数字范围(如1-50或1-200)。
  2. 时间限制:设置每轮游戏的时间限制,提升挑战性。
  3. 分享功能:用户可以将自己的高分通过社交平台分享给朋友。

七、相关知识点


小结

通过猜数字增强版的实现,用户能够体验状态管理和历史记录功能的应用,同时熟悉如何在应用中添加多种动态功能。该游戏趣味性强,是展示 UI 和逻辑结合的优秀案例。


下一篇预告

在下一篇「UI互动应用篇16 - 倒计时环形进度条」中,我们将实现一个结合倒计时功能的动态环形进度条,展示时间管理和动画效果。


上一篇: 「Mac畅玩鸿蒙与硬件37」UI互动应用篇14 - 随机颜色变化器

下一篇: 「Mac畅玩鸿蒙与硬件39」UI互动应用篇16 - 倒计时环形进度条


作者:SoraLuna
链接:https://www.nutpi.net/thread?topicId=327
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


目录
相关文章
|
4天前
|
UED
「Mac畅玩鸿蒙与硬件52」UI互动应用篇29 - 模拟火车票查询系统
本篇教程将实现一个模拟火车票查询系统,通过输入条件筛选车次信息,并展示动态筛选结果,学习事件处理、状态管理和界面展示的综合开发技巧。
35 13
|
3天前
「Mac畅玩鸿蒙与硬件53」UI互动应用篇30 - 打卡提醒小应用
本篇教程将实现一个打卡提醒小应用,通过用户输入时间进行提醒设置,并展示实时提醒状态,实现提醒设置和取消等功能。
33 10
|
7天前
|
存储 人工智能 JavaScript
Harmony OS开发-ArkTS语言速成二
本文介绍了ArkTS基础语法,包括三种基本数据类型(string、number、boolean)和变量的使用。重点讲解了let、const和var的区别,涵盖作用域、变量提升、重新赋值及初始化等方面。期待与你共同进步!
63 47
Harmony OS开发-ArkTS语言速成二
|
9天前
|
API 索引
鸿蒙开发:实现一个超简单的网格拖拽
实现拖拽,最重要的三个方法就是,打开编辑状态editMode,实现onItemDragStart和onItemDrop,设置拖拽移动动画和交换数据,如果想到开启补位动画,还需要实现supportAnimation方法。
64 13
鸿蒙开发:实现一个超简单的网格拖拽
|
8天前
|
索引 API
鸿蒙开发:自定义一个股票代码选择键盘
金融类的软件,特别是股票基金类的应用,在查找股票的时候,都会有一个区别于正常键盘的键盘,也就是股票代码键盘,和普通键盘的区别就是,除了常见的数字之外,也有一些常见的股票代码前缀按钮,方便在查找股票的时候,更加方便的进行检索。
鸿蒙开发:自定义一个股票代码选择键盘
|
8天前
|
API
鸿蒙开发:自定义一个英文键盘
实现方式呢,有很多种,目前采用了比较简单的一种,如果大家采用网格Grid组件实现方式,也是可以的,但是需要考虑每行的边距以及数据,还有最后两行的格子占位问题。
鸿蒙开发:自定义一个英文键盘
|
8天前
|
存储 JSON 数据库
鸿蒙元服务项目实战:备忘录内容编辑开发
富文本内容编辑我们直接使用RichEditor组件即可,最重要的就是参数,value: RichEditorOptions,通过它,我们可以用来设置样式,和获取最后的富文本内容,这一点是很重要的。
鸿蒙元服务项目实战:备忘录内容编辑开发
|
9天前
|
开发框架 JavaScript 前端开发
Harmony OS开发-ArkT语言速成一
本文介绍ArkTS语言,它是鸿蒙生态的应用开发语言,基于TypeScript,具有静态类型检查、声明式UI、组件化架构、响应式编程等特性,支持跨平台开发和高效性能优化。ArkTS通过强化静态检查和分析,提升代码健壮性和运行性能,适用于Web、移动端和桌面端应用开发。关注我,带你轻松掌握HarmonyOS开发。
31 5
Harmony OS开发-ArkT语言速成一
|
7天前
|
前端开发 API 数据库
鸿蒙开发:异步并发操作
在结合async/await进行使用的时候,有一点需要注意,await关键字必须结合async,这两个是搭配使用的,缺一不可,同步风格在使用的时候,如何获取到错误呢,毕竟没有catch方法,其实,我们可以自己创建try/catch来捕获异常。
鸿蒙开发:异步并发操作

热门文章

最新文章