【OpenHarmony/HarmonyOs 】成就系统设计:用等级、进度与徽章提升学习动力

本文基于我的 OpenHarmony/HarmonyOS 项目「物理视界 PhysicsVision」整理。项目中的「成就殿堂」模块通过挑战次数、最高正确率、收藏数量、模型探索数量等数据,生成成就、等级、进度和称号。
这一篇单独拆解成就系统:如何用轻量规则提升学习动力。🏅

一、为什么学习 App 需要成就系统?

学习是一件长期行为。
如果应用只展示内容,用户很难感受到自己的成长;如果加入成就系统,就能把学习过程变成可见进度。

成就系统的作用包括:

  • 记录用户做过什么;
  • 给阶段性目标;
  • 鼓励继续探索;
  • 增强复习动力;
  • 让抽象学习变成可视化成长。

「物理视界」的成就系统没有依赖服务器,而是直接基于本地学习状态计算。

二、成就数据结构

项目定义了 AchievementItem

interface AchievementItem {
  id: string
  icon: string
  title: string
  desc: string
  condition: string
  color: string
}

每个成就包含:

  • 唯一 ID;
  • 图标;
  • 标题;
  • 描述;
  • 解锁条件;
  • 主题色。

这种结构足够简单,也便于后续扩展。

三、成就示例:挑战类

{ id: 'first_challenge', icon: '🎯', title: '初出茅庐', desc: '完成第一次物理挑战', condition: 'totalPlayed >= 1', color: '#4CAF50' }
{ id: 'challenge_5', icon: '🔥', title: '坚持不懈', desc: '完成5次物理挑战', condition: 'totalPlayed >= 5', color: '#FF9800' }
{ id: 'score_100', icon: '👑', title: '满分王者', desc: '挑战正确率达到100%', condition: 'highScore >= 100', color: '#FFD700' }

挑战类成就鼓励用户多做题、提高正确率。
其中“第一次挑战”门槛很低,适合给用户初始正反馈。

四、成就示例:学习类

{ id: 'fav_1', icon: '❤️', title: '初次收藏', desc: '收藏第1个物理模型', condition: 'favCount >= 1', color: '#E91E63' }
{ id: 'visit_10', icon: '🧪', title: '实验家', desc: '学习10个不同的物理模型', condition: 'visitCount >= 10', color: '#009688' }
{ id: 'visit_all', icon: '🎓', title: '学霸', desc: '学习全部28个物理模型', condition: 'visitCount >= 28', color: '#1A73E8' }

学习类成就鼓励用户探索模型和收藏重点内容。
这和项目核心功能绑定得很紧,不是为了成就而成就。

五、读取全局学习状态

成就页通过 @StorageLink 读取全局数据:

@StorageLink('highScore') highScore: number = 0
@StorageLink('totalPlayed') totalPlayed: number = 0
@StorageLink('favorites') favStr: string = ''
@StorageLink('visitedModels') visitedModels: string = ''

这些数据来自其他模块:

  • 挑战页更新 highScoretotalPlayed
  • 实验室页更新 visitedModels
  • 收藏功能更新 favorites

成就页不直接参与学习行为,只负责汇总和展示。

六、计算收藏数和访问数

getFavCount(): number {
  if (this.favStr.length === 0) return 0
  return this.favStr.split(',').length
}

getVisitCount(): number {
  if (this.visitedModels.length === 0) return 0
  return this.visitedModels.split(',').length
}

因为收藏和浏览都用逗号字符串保存,所以统计时直接 split 即可。
这种实现简单直接,适合当前 28 个模型的规模。

七、判断成就是否解锁

核心方法是 isUnlocked

isUnlocked(achievement: AchievementItem): boolean {
  let cond = achievement.condition
  let favCount = this.getFavCount()
  let visitCount = this.getVisitCount()

  if (cond === 'always') return true
  if (cond === 'combo') return favCount > 0 && this.totalPlayed > 0
  if (cond === 'totalPlayed >= 1') return this.totalPlayed >= 1
  if (cond === 'highScore >= 80') return this.highScore >= 80
  if (cond === 'favCount >= 5') return favCount >= 5
  if (cond === 'visitCount >= 10') return visitCount >= 10
  return false
}

当前实现用字符串条件进行判断。
优点是直观,缺点是条件多了之后会比较长。后续可以把条件改成函数:

condition: () => boolean

不过在 ArkTS 页面中,当前写法已经足够清晰。

八、等级系统:成就数量映射等级

项目根据已解锁成就数量计算等级:

getLevel(): number {
  let unlocked: number = this.getUnlockedCount()
  if (unlocked >= 18) return 6
  if (unlocked >= 14) return 5
  if (unlocked >= 10) return 4
  if (unlocked >= 6) return 3
  if (unlocked >= 3) return 2
  if (unlocked >= 1) return 1
  return 0
}

称号也随等级变化:

getLevelTitle(): string {
  let level: number = this.getLevel()
  if (level >= 6) return '物理宗师'
  if (level >= 5) return '物理学家'
  if (level >= 4) return '物理达人'
  if (level >= 3) return '物理好手'
  if (level >= 2) return '物理新星'
  if (level >= 1) return '物理学徒'
  return '物理小白'
}

这种等级设计很适合教育 App。
它不是竞技排名,而是自我成长反馈。

九、成就进度计算

项目还为每个成就计算进度百分比:

getProgress(achievement: AchievementItem): number {
  let cond = achievement.condition
  let favCount = this.getFavCount()
  let visitCount = this.getVisitCount()

  if (cond === 'totalPlayed >= 5') return Math.min(this.totalPlayed / 5 * 100, 100)
  if (cond === 'highScore >= 80') return Math.min(this.highScore / 80 * 100, 100)
  if (cond === 'favCount >= 10') return Math.min(favCount / 10 * 100, 100)
  if (cond === 'visitCount >= 28') return Math.min(visitCount / 28 * 100, 100)
  return 0
}

进度比单纯“未解锁”更友好。
用户看到自己已经完成 70%,会更愿意继续努力。

十、成就系统的设计原则

我觉得教育类成就系统要注意:

  1. 不要只奖励刷题数量,也要奖励探索和收藏;
  2. 初期成就门槛要低,给用户启动反馈;
  3. 中后期成就要有挑战性;
  4. 成就条件要和真实学习行为绑定;
  5. 不要制造焦虑,避免排名和过度竞争;
  6. 成就文案可以轻松一点,让学习有温度。

总结

「物理视界」的成就系统没有复杂后端,也没有大型游戏化框架,但它已经能把学习行为转化为可见成长。
挑战次数、正确率、收藏数量、模型探索数量,这些本地数据被组合成成就、等级和称号。

对 OpenHarmony/HarmonyOS 学习类应用来说,这是一种很实用的设计:轻量、可解释、可扩展,还能提升用户持续学习的动力。🏅

img

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐