经验值规则
段位系统
5大级别 × 每级别10小段(共50段):
| 级别 | 名称 | 颜色 | EXP范围 | 起始段位 | 每段EXP |
|---|---|---|---|---|---|
| bronze | 青铜 | #cd7f32 | 0-999 | 1 | 100 |
| silver | 白银 | #c0c0c0 | 1000-2499 | 11 | 150 |
| gold | 黄金 | #ffd700 | 2500-4499 | 21 | 200 |
| platinum | 铂金 | #42a5f5 | 4500-6999 | 31 | 250 |
| king | 王者 | #ab47bc | 7000-9999 | 41 | 300 |
段位计算逻辑:
- 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") |
| 满分奖励 | +10 | score === 100 |
| 首次学会 | +5 | score ≥ 60 且 char 不在 learned[] 中 |
单次书写最大:+25 EXP(基础10 + 满分10 + 首次学会5)
2. 认读练习
核心函数:handleNewRecord() in achievement.ts
| 场景 | EXP | 触发条件 |
|---|---|---|
| 认读通过 | +5 | score ≥ 60 |
| 认读失败 | +1 | score < 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)
| 关卡 | 名称 | 难度 | 基础EXP | 1星 | 2星 | 3星 |
|---|---|---|---|---|---|---|
| 1 | 初识甲骨文 | 1 | 15 | 15 | 22 | 30 |
| 2 | 动物世界 | 1 | 20 | 20 | 30 | 40 |
| 3 | 人体奥秘 | 2 | 25 | 25 | 37 | 50 |
| 4 | 金文进阶 | 2 | 30 | 30 | 45 | 60 |
| 5 | 器物大观 | 3 | 40 | 48 | 72 | 96 |
| 6 | 小篆挑战 | 3 | 50 | 60 | 90 | 120 |
| 7 | 混合大乱斗 | 4 | 60 | 90 | 135 | 180 |
| 8 | 大师级挑战 | 4 | 70 | 105 | 157 | 210 |
| 9 | 隶书入门 | 5 | 80 | 144 | 216 | 288 |
| 10 | 书体大师 | 5 | 100 | 180 | 270 | 360 |
拼图闯关 (stroke_puzzle)
| 关卡 | 名称 | 难度 | 基础EXP | 1星 | 2星 | 3星 |
|---|---|---|---|---|---|---|
| 1 | 一笔画 | 1 | 15 | 15 | 22 | 30 |
| 2 | 基础笔画 | 1 | 20 | 20 | 30 | 40 |
| 3 | 自然万物 | 2 | 25 | 25 | 37 | 50 |
| 4 | 动物乐园 | 2 | 30 | 30 | 45 | 60 |
| 5 | 人体部位 | 3 | 40 | 48 | 72 | 96 |
| 6 | 合体字挑战 | 3 | 50 | 60 | 90 | 120 |
| 7 | 复杂结构 | 4 | 60 | 90 | 135 | 180 |
| 8 | 大师级拼图 | 4 | 70 | 105 | 157 | 210 |
| 9 | 笔画大师 | 5 | 80 | 144 | 216 | 288 |
| 10 | 神话传说 | 5 | 100 | 180 | 270 | 360 |
汉字消消乐 (char_match3)
| 关卡 | 名称 | 难度 | 基础EXP | 1星 | 2星 | 3星 |
|---|---|---|---|---|---|---|
| 1 | 初识消消乐 | 1 | 15 | 15 | 22 | 30 |
| 2 | 自然元素 | 1 | 20 | 20 | 30 | 40 |
| 3 | 动物世界 | 2 | 25 | 25 | 37 | 50 |
| 4 | 收集挑战 | 2 | 30 | 30 | 45 | 60 |
| 5 | 破冰行动 | 3 | 40 | 48 | 72 | 96 |
| 6 | 限时挑战 | 3 | 50 | 60 | 90 | 120 |
| 7 | 五行挑战 | 4 | 60 | 90 | 135 | 180 |
| 8 | 终极挑战 | 4 | 70 | 105 | 157 | 210 |
| 9 | 神兽传奇 | 5 | 80 | 144 | 216 | 288 |
| 10 | 万物归一 | 5 | 100 | 180 | 270 | 360 |
失败(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
数据流
- 书写/游戏/复习 → reward-service.ts → achievement.ts (handleNewRecord/awardWriteReward/awardGameReward) → user.ts (addEXP)
- achievement.ts 通过 watch 监听 records/learned/streak/gameProgress/etymologyViewed 自动检测徽章
- 徽章解锁自动调用 unlockBadge() → addEXP(50) + addPoints(5)
- totalEXP 存储在 userData 中,通过 Mock API 持久化到 localStorage
经验值总结
| 场景 | 单次EXP | 上限 |
|---|---|---|
| 基础书写 | 10 | 无上限 |
| 书写满分 | +10 | 每次 |
| 首次学会 | +5 | 每字仅一次 |
| 认读通过 | 5 | 无上限 |
| 认读参与 | 1 | 无上限 |
| 复习单字 | 5 | 每字每日一次 |
| 每日复习全完成 | 50 | 每日一次 |
| 每日复习80%+ | 30 | 每日一次 |
| 游戏关卡 | 15-360 | 每关一次(取最高星级差额) |
| 徽章解锁 | 50 | 每枚一次 |
| 游戏成就 | 10-500 | 每成就一次 |