HarmonyOS6.0开发之记忆翻牌游戏,轻松拿捏!

Hello!我是程序员Feri------ 13 年编程老炮,实战派技术人,拆解编程技巧、分享副业心得,记录程序员的进阶路,AI 时代一起稳稳向前。

有没有觉得自己记忆力"堪比超级计算机"?或者想找个既能摸鱼放松、又能偷偷锻炼大脑的小游戏?

今天,咱们就来拆解一款鸿蒙系统上的记忆翻牌游戏------看看它是怎么用ArkTS"变魔术"般做出来的,顺便挑战下自己的记忆力~

一、游戏规则:翻出"记忆王者"的快感

这款游戏长这样:4×6的卡片网格里藏着12对字母,玩家每次翻两张牌。

配对成功 ?那这对牌就会"乖乖留在场上";配对失败?它们会"害羞地翻回去",等你下次挑战。直到所有牌都成功配对,就算"通关封神"!

游戏顶部还会实时显示总分本轮分数,每成功配对一次,分数就"噌"地涨一点,成就感直接拉满~

二、技术拆解:ArkTS是怎么"造"出这个游戏的?

1. 状态管理:让数据和UI"心灵相通"

在鸿蒙的ArkTS里,有个超实用的@State装饰器,它就像"实时同步的魔法标记"。

比如游戏里的分数score1(总分)、score2(本轮分数),还有卡片上的字母数组letters,只要这些数据变了,对应的UI就会自动更新------分数涨了,界面上的数字立刻变;翻牌成功,字母也会马上显示出来。

typescript 复制代码
@State score1: number = 0; // 总分,成功一次加1
@State score2: number = 0; // 本轮分数,通关后重置
@State letters: string[] = []; // 卡片显示的内容(初始是问号"?")

2. UI布局:用Grid搭出"卡片矩阵"

要做4×6的卡片网格,鸿蒙的Grid组件简直是"天选之子"。通过columnsTemplate设置"1fr 1fr 1fr 1fr"(4列,每列占比相同),再用rowsGapcolumnsGap控制间距,就能轻松搭出整齐的卡片布局。

卡片本身是个Text组件,还加了自定义样式(边框、圆角、背景色),让每个"问号卡片"看起来精致又统一:

typescript 复制代码
@Extend(Text)
function textStyles(str: string) {
  .fontSize(30)
  .fontWeight(800)
  .padding(15)
  .width("100%")
  .height(60)
  .fontColor(str == "?" ? Color.Black : Color.Green) // 问号是黑色,配对成功变绿色
  .textAlign(TextAlign.Center)
  .border({ width: 1, color: Color.Gray })
  .backgroundColor(Color.White)
  .borderRadius(8)
}

3. 随机算法:让字母"乱中有序"

游戏最核心的逻辑之一,是随机生成12对不重复的字母。代码里用了一个小技巧:先准备好26个英文字母的数组,然后随机选12个字母,每个字母生成两个"副本",再把这些字母随机分配到24个卡片位置上(确保不重复)。

这个"避免重复"的逻辑,靠reandIndex函数实现------每次从可用索引里随机选一个,选完就从"候选池"里删掉,保证每个位置只被分配一次:

typescript 复制代码
reandIndex() {
  let i = Math.floor(Math.random() * this.indexs.length); // 随机选一个候选索引
  let i1 = this.indexs[i]; // 拿到真正要分配的位置
  this.indexs.splice(i, 1); // 从候选池移除,避免重复
  return i1;
}

4. 翻牌动画与交互:让游戏"活"起来

  • 翻牌交互 :点击卡片时,调用check函数,判断是"第一次翻牌"还是"第二次翻牌"。如果两次翻的字母相同,就"锁定成功";如果不同,就用setTimeout延迟300毫秒,让卡片"翻回去"(把字母重新设为问号)。
  • 通关提示 :当本轮分数score2等于12(12对全部配对),就会弹出"恭喜通关"的Toast提示,给玩家满满的仪式感~
typescript 复制代码
check(index: number) {
  // 点击卡片,显示对应字母
  this.letters[index] = this.letters1[index];
  // ... 省略判断第一次/第二次翻牌的逻辑 ...
  if (this.letters1[this.clickIndex[0]] == this.letters1[this.clickIndex[1]]) {
    // 配对成功,分数+1
    this.score1 += 1;
    this.score2 += 1;
    this.clickIndex = []; // 清空已点击的索引
  } else {
    // 配对失败,延迟300ms翻回去
    setTimeout(() => {
      for (let i = 0; i < this.clickIndex.length; i++) {
        this.letters[this.clickIndex[i]] = '?';
      }
      this.clickIndex = [];
    }, 300)
  }
  // 通关判断
  if (this.score2 == this.letters.length / 2) {
    this.getUIContext().getPromptAction().showToast({
      message: &#34;恭喜你,通关啦,真优秀!&#34;
    })
  }
}

三、玩起来多爽?------ 既练脑,又学技术

实际玩的时候,看着卡片"啪"地翻过来,再"啪"地翻回去(或者稳稳留在场上),动画流畅得像真的在玩实体卡牌~ 而且每成功一次,分数实时上涨,通关时的Toast提示更是"成就感爆棚"。

更妙的是,这款小游戏还藏着ArkTS的核心技术:状态管理、组件化布局、动画交互、异步操作(setTimeout)...... 相当于边玩边学,把枯燥的技术知识点"偷偷塞进游戏里",好玩又能涨知识~

四、最后:快来挑战你的"记忆极限"!

不管你是鸿蒙开发者,还是单纯想找个小游戏放松大脑,这款记忆翻牌都值得试试~

如果大家想考取鸿蒙开发者认证的,欢迎加入我的专属考试链接中:

要是觉得默认难度太简单,甚至可以自己改代码:比如增加卡片数量、换成更复杂的图案,或者调整翻牌后的延迟时间,打造属于自己的"记忆训练神器"~

现在,打开鸿蒙设备,来一场"记忆力大挑战"吧~ 看看你能不能一次通关!

相关推荐
王码码20351 小时前
Flutter for OpenHarmony 实战之基础组件:第三十一篇 Chip 系列组件 — 灵活的标签化交互
android·flutter·交互·harmonyos
坚果派·白晓明2 小时前
在鸿蒙设备上快速验证由lycium工具快速交叉编译的C/C++三方库
c语言·c++·harmonyos·鸿蒙·编程语言·openharmony·三方库
lbb 小魔仙2 小时前
【HarmonyOS实战】OpenHarmony + RN:自定义 useFormik 表单处理
react native·harmonyos
果粒蹬i2 小时前
【HarmonyOS】DAY7:鸿蒙跨平台 Tab 开发问题与列表操作难点深度复盘
华为·harmonyos
王码码20353 小时前
Flutter for OpenHarmony 实战之基础组件:第二十七篇 BottomSheet — 动态底部弹窗与底部栏菜单
android·flutter·harmonyos
ITUnicorn3 小时前
【HarmonyOS6】ArkTS 自定义组件封装实战:动画水杯组件
华为·harmonyos·arkts·鸿蒙·harmonyos6
全栈探索者4 小时前
@Component + struct = 你的新函数组件——React 开发者的鸿蒙入门指南(第 2 期)
react·harmonyos·arkts·前端开发·deveco studio·鸿蒙next·函数组件
廖松洋(Alina)4 小时前
【收尾以及复盘】flutter开发鸿蒙APP之成就徽章页面
flutter·华为·开源·harmonyos·鸿蒙
廖松洋(Alina)5 小时前
【收尾以及复盘】flutter开发鸿蒙APP之打卡日历页面
flutter·华为·开源·harmonyos·鸿蒙
廖松洋(Alina)5 小时前
【收尾以及复盘】flutter开发鸿蒙APP之本月数据统计页面
flutter·华为·开源·harmonyos·鸿蒙