产品与技术方案

这套站点的设计决策、数据模型、自适应算法与工程取舍。完整文档见仓库 docs/SPEC.md。

核心设计决策

决策选择理由
难度来源按能力评分实时计算原产品的静态阶梯无法做到真个性化;参数化关卡使动态选档成为可能
评分粒度按能力(19 项)而非按游戏同一能力跨游戏累积,才能反映真实能力而非单个游戏的熟练度
难度阶梯抽象轴 + paramMap 映射让一套阶梯可被多款玩法复用(借鉴原产品 09/11 共用阶梯的做法,并做成显式机制)
关卡生成程序化生成自适应要求每条参数随人变化,无法预先枚举
渲染方式服务端渲染 HTML网站相对 App 的核心优势是 SEO 可索引;SPA 会放弃这一点
引擎位置服务端客户端无法自行调难度;评分与进度不可被篡改
冷启动标定斜坡 0.92→0.88→0.84新玩家初始评分 1000 无信息量,前 3 局用高目标快速定位真实水平

数据模型

players(id, created_at, last_seen, streak, best_streak, last_daily, rounds_total)
ratings(player_id, ability, rating, rounds, updated_at)   -- ★ 引擎核心表
results(id, player_id, game, difficulty, tier_index, score, accuracy,
        correct, total, duration_ms, deltas, created_at)
progress(player_id, game, plays, best_score, last_tier, updated_at)
daily_log(player_id, day, game, tier_index, score, created_at)

自适应算法

# 1) 期望表现(Elo)
E = 1 / (1 + 10^((dR - r) / 400))           r  = 该游戏关联能力的评分均值
                                            dR = 600 + d * 800   (d ∈ [0,1])

# 2) 表现得分
S = 正确率,全对时按剩余时间给最多 +0.06 的速度加成

# 3) 更新(同一游戏的全部关联能力收到相同增量)
r' = clamp(r + K·(S - E), 400, 1800)        K = 24,单轮增量上限 ±60

# 4) 反解下一局难度(目标期望正确率 0.78)
dR* = r + 400·log10(1/0.78 - 1)
d*  = clamp((dR* - 600) / 800, 0, 1) → 取最近档位

当前引擎参数:{"algorithm":"per-ability Elo (provisional-K variant)","baseK":24,"provisionalK":[{"maxRounds":5,"factor":2.2},{"maxRounds":15,"factor":1.5},{"maxRounds":null,"factor":1}],"surpriseGain":0.7,"dominance":{"threshold":0.9,"max":3},"targetExpectedAccuracy":0.78,"calibrationRamp":[0.92,0.88,0.84],"ratingRange":[400,1800],"difficultyRatingRange":[600,1400],"maxDeltaPerRound":60,"note":"难度档位离散(10 档),实际收敛正确率在目标附近波动(实测 0.78–0.88)"}

内容自检

✅ 内容配置无悬空引用

覆盖度提示(非缺陷):
  • 7 项能力当前没有对应玩法(peripheral-vision, quick-thinking, spatial-memory, decision-making, problem-solving, numerical-fluency, comparison)—— 补齐 5 个品类下的其余玩法即可覆盖

已知局限(诚实声明)