Skip to content

经验值规则

段位系统

5大级别 × 每级别10小段(共50段):

级别名称颜色EXP范围起始段位每段EXP
bronze青铜#cd7f320-9991100
silver白银#c0c0c01000-249911150
gold黄金#ffd7002500-449921200
platinum铂金#42a5f54500-699931250
king王者#ab47bc7000-999941300

段位计算逻辑:

  • segment = startSegment + Math.floor((totalEXP - tier.min) / segmentExp),最大50段
  • 当前段位进度 = (totalEXP - 当前段位起始EXP) / segmentExp
  • 大级别进度 = (totalEXP - tier.min) / (nextTier.min - tier.min)

升级所需总EXP表:

  • 青铜→白银:1000
  • 白银→黄金:2500
  • 黄金→铂金:4500
  • 铂金→王者:7000
  • 王者满级:9999

EXP获取途径

1. 书写练习

核心函数:handleNewRecord() in achievement.ts

场景EXP触发条件
基础书写+10每次完成书写(type !== "recognition")
满分奖励+10score === 100
首次学会+5score ≥ 60 且 char 不在 learned[] 中

单次书写最大:+25 EXP(基础10 + 满分10 + 首次学会5)

2. 认读练习

核心函数:handleNewRecord() in achievement.ts

场景EXP触发条件
认读通过+5score ≥ 60
认读失败+1score < 60(鼓励参与)

3. 复习系统

核心函数:awardReviewCharReward(), handleDailyReviewComplete()

场景EXP触发条件
复习单字全流程+5完成认读→书写→字源三步(去重,同字同会话只计一次)
每日复习100%+50当日所有待复习字全部完成(每天只奖励一次)
每日复习80%++30当日完成80%以上但未全完成(每天只奖励一次)

4. 游戏系统

核心函数:awardGameReward()

奖励公式:starReward.exp = baseExp × starMultiplier × diffMultiplier

星级倍率:1星=1.0x, 2星=1.5x, 3星=2.0x 难度倍率:1=1.0x, 2=1.0x, 3=1.2x, 4=1.5x, 5=1.8x, 6=2.0x

象形配对 (pictograph_match)

关卡名称难度基础EXP1星2星3星
1初识甲骨文115152230
2动物世界120203040
3人体奥秘225253750
4金文进阶230304560
5器物大观340487296
6小篆挑战3506090120
7混合大乱斗46090135180
8大师级挑战470105157210
9隶书入门580144216288
10书体大师5100180270360

拼图闯关 (stroke_puzzle)

关卡名称难度基础EXP1星2星3星
1一笔画115152230
2基础笔画120203040
3自然万物225253750
4动物乐园230304560
5人体部位340487296
6合体字挑战3506090120
7复杂结构46090135180
8大师级拼图470105157210
9笔画大师580144216288
10神话传说5100180270360

汉字消消乐 (char_match3)

关卡名称难度基础EXP1星2星3星
1初识消消乐115152230
2自然元素120203040
3动物世界225253750
4收集挑战230304560
5破冰行动340487296
6限时挑战3506090120
7五行挑战46090135180
8终极挑战470105157210
9神兽传奇580144216288
10万物归一5100180270360

失败(stars ≤ 0)不发放任何奖励。

5. 徽章解锁

每枚徽章解锁:+50 EXP(自动发放)

30枚徽章详情:

  • 书写类6枚:first_write, write_10, write_50, write_100, perfect_10, perfect_30
  • 探索类6枚:learn_10, learn_50, learn_100, learn_200, learn_300, learn_500
  • 恒心类6枚:streak_3, streak_7, streak_14, streak_30, streak_60, streak_100
  • 字源类6枚:etymology_10, etymology_30, etymology_50, etymology_100, etymology_200, etymology_300
  • 游戏类6枚:game_1, game_5, game_10, game_26, game_perfect_3, game_perfect_10

6. 游戏成就奖励

games.json中定义的游戏内成就(非徽章系统):

游戏成就EXP
象形配对配对新手10
象形配对配对达人50
象形配对配对大师100
象形配对连击王80
拼图闯关拼图新手10
拼图闯关拼图达人50
拼图闯关拼图大师100
拼图闯关完美书写80
汉字消消乐消除新手10
汉字消消乐消除达人50
汉字消消乐消除大师100
汉字消消乐连击大师80
汉字消消乐坚持就是胜利200
全局游戏爱好者100
全局三冠王500

书写评分公式

modules/write/utils/score-calculator.ts: calculateScore({ totalStrokes, currentStroke, totalMistakes, totalTime, quizComplete })

新评分公式(三部分):

  • accuracyScore = (1 - totalMistakes / attempted) × 70 — 准确率分(0-70),attempted = quizComplete ? totalStrokes : currentStroke
  • completionScore = completionRatio × 25 — 完成度分(0-25),completionRatio = quizComplete ? 1 : currentStroke / totalStrokes
  • speedBonus = quizComplete ? Math.round(5 × min(1, (totalStrokes × 4) / totalTime)) : 0 — 速度奖励(0-5),以每笔4秒为基准

总分 = accuracyScore + completionScore + speedBonus(0-100),clamp 到 [0, 100]

评分等级(score-calculator.ts getStarCount):

  • ≥95分:5星
  • ≥80分:4星
  • ≥60分:3星
  • ≥40分:2星
  • <40分:1星

复习阶段规则

艾宾浩斯遗忘曲线:1天 → 3天 → 7天 → 15天 → 30天

computeNextStage(currentStage, score):

  • score ≥ 80: stage + 1(最大4)
  • 60 ≤ score < 80: stage 不变
  • score < 60: stage 重置为 0

数据流

  1. 书写/游戏/复习 → reward-service.ts → achievement.ts (handleNewRecord/awardWriteReward/awardGameReward) → user.ts (addEXP)
  2. achievement.ts 通过 watch 监听 records/learned/streak/gameProgress/etymologyViewed 自动检测徽章
  3. 徽章解锁自动调用 unlockBadge() → addEXP(50) + addPoints(5)
  4. totalEXP 存储在 userData 中,通过 Mock API 持久化到 localStorage

经验值总结

场景单次EXP上限
基础书写10无上限
书写满分+10每次
首次学会+5每字仅一次
认读通过5无上限
认读参与1无上限
复习单字5每字每日一次
每日复习全完成50每日一次
每日复习80%+30每日一次
游戏关卡15-360每关一次(取最高星级差额)
徽章解锁50每枚一次
游戏成就10-500每成就一次