鸿蒙开发案例:进京赶考(4)

news2024/11/15 4:49:57

系列文章目录

鸿蒙开发案例:进京赶考(1)

鸿蒙开发案例:进京赶考(2)

鸿蒙开发案例:进京赶考(3)

鸿蒙开发案例:进京赶考(4)


案例介绍

“进京赶考”是一款抽卡游戏,玩家在游戏界面中通过随机抽取到不同颜色的卡片,可获得不 同积分;抽卡结束后,根据积分的高低对游戏成绩进行判定(状元、榜眼、探花、进士)。本篇接上篇实现GameAbility的游戏界面及抽卡功能,运行效果如图所示


一、完成 Ability 间通信

在 GameAbility.ts 文件中获取 Entryability 传递过来的数据,通过 AppStorage 来存储 Want 对象,修改GameAbility的onCreate方法如下:该方法的want参数携带着参数,首先通过want取得传递的参数name的值,然后通过AppStorage的SetOrCreate方法存储成应用级变量

onCreate(want, launchParam) {
    let index:string=want?.parameters?.name;
    AppStorage.SetOrCreate('name',index);
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }

修改 GamePage.ets文件,增加如下代码获取应用级变量的值

let name=AppStorage.Get<string>('name');

二、游戏功能实现

1.规则

在着手游戏功能的代码实现之前,先阐明游戏的具体规则如下:

⚫ 共有红黄蓝绿四张卡,初始分数 10 分,抽卡机会共 3 次;

⚫ 红卡+50,黄卡+10,蓝卡-5,绿卡归 0;

⚫ 每轮游戏共 3 次抽卡机会,每抽一次、记录一次得分

⚫ 抽卡结束后根据总得分进行成绩分段:状元(≥50)、榜眼(40)、探花(25)、进士 (10)、壮志未酬(<10);

⚫ 抽到红卡(得分≥50)游戏结束,再次点击抽卡时会自动清 0 剩余次数;

⚫ 抽到绿卡(得分归 0)游戏结束,自动清 0 剩余次数;

⚫ 3 次机会用完,游戏结束;

⚫ 游戏结束可点击 “看结果”按钮可查看最终成绩。

2.修改GamePage.ets文件

注意:为方便通过数组操作图片资源,把图片资源移到resources-rawfile-images(images为新建目录)目录下,如图所示

代码如下:

let name=AppStorage.Get<string>('name');
@Entry
@Component
struct GamePage {
  imgArray:string[]=['images/red.jpg','images/yellow.jpg','images/blue.jpg','images/purple.jpg','images/green.jpg']
  @State score:number=10//分数
  @State times:number=3//抽卡次数
  build() {
    Column({space:4}){
      //统计栏
      Row({space:5}){
         Text(name+'得分'+this.score).textStyle()
         Text('抽卡次数'+this.times).textStyle()
      }.rowStyle()

      //展示区
      Row({space:4}){
        Column({space:4}){
          Image($rawfile(`${this.imgArray[0]}`)).borderColor(0xf21225).imgStyle()
          Text('状元')
        }
        Column({space:4}){
          Image($rawfile(`${this.imgArray[1]}`)).borderColor(0xfbd501).imgStyle()
          Text('榜眼')
        }
      }

      Row({space:4}){
        Column({space:4}){
          Image($rawfile(`${this.imgArray[2]}`)).borderColor(0x3f97fd).imgStyle()
          Text('探花')
        }
        Column({space:4}){
          Image($rawfile(`${this.imgArray[3]}`)).borderColor(0x9800fc).imgStyle()
          Text('榜眼')
        }
      }
      Button('去抽卡')
        .cardStyle()
      Button('看结果')
        .cardStyle()

    }.width('100%')
    .height('100%')
  }
}

//自定义按钮样式
@Extend(Button) function cardStyle () {
  .width('50%')
  .height('8%')
  .borderRadius(8)
  .fontSize(24)
  .fontWeight(600)
  .shadow({ radius: 10, color: 0xD3D3D3, offsetX: 20, offsetY: 20 })
  .margin({ top: '2%' })
}
//自定义图片样式
@Extend(Image) function imgStyle () {
  .width('45%')
  .height('25%')
  .borderWidth(4)
  .borderRadius(30)
}
//自定义文本样式
@Extend(Text) function textStyle () {
  .fontSize(24)
  .fontWeight(600)
  .fontColor(0xB0C4DE)
}
//自定义行样式
@Extend(Row) function rowStyle () {
  .width('80%')
  .height('10%')
  .borderRadius(10)
  .margin({ top: '1%', bottom: '4%' })
  .shadow({ radius: 10, color: 0xD3D3D3, offsetX: 20, offsetY: 20 })
  .backgroundColor(0xFF8247)
  .justifyContent(FlexAlign.Center)
}

经过如上修改,在真机上的运行效果如图所示:

 3.实现去抽卡功能

点击“去抽卡”按钮,随机获取四张卡中的任意一张,随机获取势必要生成1-4之间的随机数

继续修改GamePage.ets文件,增加如下变量的定义:

  @State rangNumber: number = 0 //随机生成数
  @State level: number = 0 //卡等级

增加随机生成卡等级的函数

//定义随机抽卡函数
  randomGrad(){
     let rand=Math.random();
     this.rangNumber=1+Math.round(rand*3);//四舍五入
     switch (this.rangNumber){
       //抽到红卡,+50
       case 1:this.score=this.score+50
              break;
       //抽到黄卡,+50
       case 2:this.score=this.score+10
              break;
      //抽到蓝卡,-5
       case 3:this.score=this.score-5
              break;
       //抽到绿卡,归0
       case 4:this.score=0
     }
    //弹窗回显相应颜色卡片
    this.level=this.rangNumber
  }

 在common文件夹下新建customComponent文件夹,如图所示:

新建CustomDialog.ets文件,创建自定义弹窗组件,用以呈现抽卡过程,代码如下:

//自定义弹窗组件
@CustomDialog
export struct CustomDialogExample {
  @Link level: number //双向传递
  @Link score: number
  imgArray:string[]=['images/redCard.png','images/yellowCard.png','images/blueCard.png','images/greenCard.png']
  controller: CustomDialogController
  cancel: () => void
  confirm: () => void
  build() {
    Column() {
      Text('再抽一次').fontSize(24).margin({ top: '5%',bottom:'5%' })
        .onClick(() => {
          this.controller.close()
          this.cancel()
        })
      Image($rawfile(this.imgArray[this.level-1])).height('80%').width('90%').margin({bottom:'10%'})
    }
  }
}

 自定义弹窗

  //自定义弹窗
  dialogController: CustomDialogController = new CustomDialogController({
    builder: CustomDialogExample({
      cancel: this.onCancel,
      confirm: this.onAccept,
      score: $score,
      level: $level
    }),
    cancel: this.existApp,
    autoCancel: true
  })
  //弹窗回调
  onCancel() {
    console.info('Callback when the first button is clicked')
  }

  onAccept() {
    console.info('Callback when the second button is clicked')
  }

  existApp() {
    console.info('Click the callback in the blank area')
  }

 创建抽卡积分和抽卡次数判断函数

//创建抽卡积分和抽卡次数判断函数
  judgeFunction() {
    this.times--
    if (this.times >= 0 && this.score < 50 && this.score > 0) {
      this.randomGrade()
      this.dialogController.open()
    } else {
      if (this.times < 0) {
        this.times = 0
        AlertDialog.show(
          {
            title: '提示',
            message: '您的抽卡次数已用完',
            confirm: {
              value: '关闭',
              action: () => {
                console.info('Button-clicking callback')
              }
            },
            cancel: () => {
              console.info('Closed callbacks')
            }
          }
        )
      }
      if (this.score >= 50) {
        this.times = 0
        AlertDialog.show(
          {
            title: '提示',
            message: '您已高中状元,无须再抽',
            confirm: {
              value: '关闭',
              action: () => {
                console.info('Button-clicking callback')
              }
            },
            cancel: () => {
              console.info('Closed callbacks')
            }
          }
        )
      }
      if (this.score <= 0) {
        this.times = 0
        AlertDialog.show(
          {
            title: '提示',
            message: '很遗憾,下次继续努力', confirm: {
            value: '关闭',
            action: () => {
              console.info('Button-clicking callback')
            }
          },
            cancel: () => {
              console.info('Closed callbacks')
            }
          }
        )
      }
    }
  }

总结

例如:本篇实现了抽卡界面及其抽卡功能,主要涉及自定义对话框组件及其调用,随机数生成,应用级数据生成。

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

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

相关文章

计算机服务器中了mallox勒索病毒怎么解密,mallox勒索病毒解密流程

科技技术的第一生产力&#xff0c;网络技术的不断发展与应用&#xff0c;让企业逐步走向数字化时代&#xff0c;通过网络的力量可以为企业更好地开展各项业务工作&#xff0c;网络数据安全问题也由此成为众多企业关心的主要话题。近日&#xff0c;云天数据恢复中心接到某化工集…

Python + Appium 自动化操作微信入门看这一篇就够了

Appium 是一个开源的自动化测试工具&#xff0c;支持 Android、iOS 平台上的原生应用&#xff0c;支持 Java、Python、PHP 等多种语言。 Appium 封装了 Selenium&#xff0c;能够为用户提供所有常见的 JSON 格式的 Selenium 命令以及额外的移动设备相关的控制命令&#xff0c;…

5GC SBA架构

协议标准&#xff1a;Directory Listing /ftp/Specs/archive/23_series/23.501/ (3gpp.org) NF描述说明NSSFNetwork Slice Selection Function网络切片选择&#xff0c;根据UE的切片选择辅助信息、签约信息等确定UE允许接入的网络切片实例。NEF Network Exposure Function网络开…

Docker与虚拟机比较

在对比Docker和虚拟机前&#xff0c;先简单了解下虚拟化&#xff0c;明确Docker和虚拟机分别对应的虚拟化级别&#xff0c;然后对Docker和虚拟机进行比较。需要注意的是&#xff0c;Docker和虚拟机并没有什么可比性&#xff0c;而是Docker使用的容器技术和虚拟机使用的虚拟化技…

git介绍4.2

git(版本控制工具) 一、git 介绍 1、git是目前世界上最先进的分布式版本控制系统&#xff0c;可以有效&#xff0c;高速的处理从小到大的项目版本管理。 2、git是linux torvalds 为了帮助管理linux内核开发二开发的一个开放源码的版本控制软件。 3、git作用&#xff1a;更好…

【深度学习笔记】计算机视觉——图像增广

图像增广 sec_alexnet提到过大型数据集是成功应用深度神经网络的先决条件。 图像增广在对训练图像进行一系列的随机变化之后&#xff0c;生成相似但不同的训练样本&#xff0c;从而扩大了训练集的规模。 此外&#xff0c;应用图像增广的原因是&#xff0c;随机改变训练样本可以…

Java宝典-类和对象

目录 1.面向对象1.1 面向过程与面向对象 2. 类的定义和使用2.1 如何定义类3.类的实例化4.this引用5.构造方法5.1 什么是构造方法5.2 构造方法的特点 6.包6.1 导包6.2 自定义包 7.封装8.访问限定符9.static9.1 static修饰的成员变量9.2 static修饰的成员方法 10.代码块10.1 普通…

大数据信用报告如何查询?有哪些需要注意的?

大数据信用对于有资金周转的人来说是比较重要的&#xff0c;主要由于大数据信用无形的被不少机构用于贷前风控&#xff0c;无论是机构要求的还是自查&#xff0c;提前了解大数据信用情况是常规操作&#xff0c;那大数据信用报告如何查询?有哪些需要注意的呢?本文详细为大家讲…

Linux使用基础命令

1.常用系统工作命令 (1).用echo命令查看SHELL变量的值 qiangziqiangzi-virtual-machine:~$ echo $SHELL /bin/bash(2).查看本机主机名 qiangziqiangzi-virtual-machine:~$ echo $HOSTNAME qiangzi-virtual-machine (3).date命令用于显示/设置系统的时间或日期 qiangziqian…

数据结构篇十:红黑树

文章目录 前言1. 红黑树的概念2. 红黑树的性质3. 红黑树节点的定义4. 红黑树的插入4.1 情况一&#xff1a; cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u存在且为红4.2 情况二: cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u不存在/u存在且为黑。4.2.1 …

图论 - Trie树(字符串统计、最大异或对)

文章目录 前言Part 1&#xff1a;Trie字符串统计1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 Part 2&#xff1a;最大异或对1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 前言 本篇博客将介绍Trie树的常见应用&#xff0c;包括&#xff1a;Trie…

30道python自动化测试面试题(全)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、什么项目适合做自动化测试&#xff1f; 关键字&#xff1a;…

【Pytorch】论文复现 Vision Transformer (ViT)

文章目录 0. 进行设置1. 获取数据2. 创建Dataset和DataLoader3. 复现 ViT 论文&#xff1a;概述4. Equation 1: 将数据拆分为 patch 并创建类、位置和 patch 嵌入5. Equation 2: Multi-Head Attention (MSA)6. Equation 3: Multilayer Perceptron (MLP)7. 创建 Transformer 编码…

【计算机网络_应用层】协议定制序列化反序列化

文章目录 1. TCP协议的通信流程2. 应用层协议定制3. 通过“网络计算器”的实现来实现应用层协议定制和序列化3.1 protocol3.2 序列化和反序列化3.2.1 手写序列化和反序列化3.2.2 使用Json库 3.3 数据包读取3.4 服务端设计3.5 最后的源代码和运行结果 1. TCP协议的通信流程 在之…

每个人都应该知道的AI大模型:通往智能未来的桥梁

人工智能大模型已成为我们通往智能未来的桥梁。这些模型&#xff0c;如OpenAI的GPT-4&#xff0c;不仅是技术的巅峰&#xff0c;更是人类智慧的结晶。在这篇文章中&#xff0c;我们将深入探讨AI大模型的重要性&#xff0c;它们是如何工作的&#xff0c;以及它们对社会的潜在影响…

算法------(13)KMP

例题&#xff1a;&#xff08;1&#xff09;AcWing 831. KMP字符串 。。其实写完也不太理解。。随便写点吧 KMP就是求next数组和运用next的数组的过程。相比传统匹配模式一次更新一单位距离的慢速方法&#xff0c;next数组可以让下表字符串一次更新n - next【n】个距离&#x…

Java项目layui分页中文乱码

【问题描述】这部分没改之前中文乱码。 【解决办法】在layui.js或者layui.all.js文件中替换共、页、条转换成Unicode码格式。 字符Unicode共&#x5171页&#x9875条&#x6761【完美解决】改完之后重新运行项目&#xff0c;浏览器F12缓存清除就好了&#xff0c;右键

从键盘输入5个整数,将这些整数插入到一个链表中,并按从小到大次序排列,最后输出这些整数。

设节点定义如下struct Node {int Element; // 节点中的元素为整数类型struct Node * Next; // 指向下一个节点 }; 从键盘输入5个整数&#xff0c;将这些整数插入到一个链表中&#xff0c;并按从小到大次序排列&#xff0c;最后输出这些整数。注释那段求指出错误&#xff0c;求解…

【QT+QGIS跨平台编译】之六十二:【QGIS_CORE跨平台编译】—【错误处理:未定义类型QgsPolymorphicRelation】

文章目录 一、未定义类型QgsPolymorphicRelation二、解决办法一、未定义类型QgsPolymorphicRelation 报错信息: 错误原因为,使用了未定义类型 QgsPolymorphicRelation 二、解决办法 QgsRelation.h文件中 ①注释第36行: //class QgsPolymorphicRelation;②注释第414行: …

leetcode括号生成

题目描述 解题思路 首先看到题目&#xff0c;一开始是并没有思路的。这时候可以在纸上进行演算一下结果。当只有一对括号的时候&#xff0c;我们可以得知结果[“()”],当有两对括号的时候&#xff0c;我们可以发现&#xff0c;括号在第一个基础上&#xff0c;要么在括号内部出…