# Playtest Report · Mole Tap Rush

## 试玩路径推演（设计层）

| 时刻 | 玩家行为 | 系统反馈 | 预期心理 |
|---|---|---|---|
| 0:00 | 看菜单 3 条规则 + emoji 示例 | 静态页 | "懂了" |
| 0:02 | 点 START | 菜单消失，地鼠开始弹 | 进入战斗状态 |
| 0:03 | 第 1 个普通鼠弹出 | tap → +10 弹字 + 缩放 | "我会玩了" |
| 0:05 | 第 2-3 只接连弹出 | tap 多个 → combo 累积 | "节奏感" |
| 0:08 | 第 1 个金鼠弹出 | tap → +30 金光 | "爽" |
| 0:12 | 第 1 个炸弹弹出 | 误 tap → -20 红震 | "草，要看清" |
| 0:20 | 进中级 | 全屏黄闪 + "中级！加速！" | "心跳加速" |
| 0:25 | 连击达 5 | "×5 连击！" + bonus | "保持手感" |
| 0:35 | 进高级 + 炸弹密集 | 红震频繁 | "紧张" |
| 0:45 | 倒计时变红 | "5s" 闪烁 | "冲刺" |
| 0:50 | 时间到 | gameover + stats | "差点破 200 分" |
| 0:55 | 点 RESTART | 立刻重开 | "再来" |

## 难度 3 问

| 问题 | 答 | 证据 |
|---|---|---|
| Q1 玩家在第 1 秒知道要干嘛？ | 是 | 菜单页 3 条规则 + START 按钮，进入后第 1 个目标 < 0.8s 弹出 |
| Q2 玩家在第 3 秒能否反馈"我做对了"？ | 是 | 第 1 次 tap 普通鼠 +10 浮字 + 缩放 + 分数滚动 |
| Q3 玩家在第 30 秒能否决定"再来一局"？ | 是 | gameover 直接 RESTART 按钮 + 击中分类激发挑战 |

3 问全过 → 复玩动力 / 策略空间 ≥ 7。

## Juice 真实生效核对

| Juice | 计划 | 实现 | 生效证据 |
|---|---|---|---|
| J1 弹分浮字 | tap 时浮字 +10/+30/-20 | `floatHole()` | tap 触发 .float 元素 1s 动画 |
| J3 缩放反馈 | tap 时缩放消失 | `.target.hit` @keyframes hit | scale 1→1.35→.1 |
| J5 屏幕震动 | 炸弹 tap 全屏闪 | `.flash-screen.red` | opacity .5→0 |
| J7 难度档闪光 | 档变化全屏黄闪 + 字弹 | `#tier-flash` + `.flash-screen.yellow` | 进档时触发 |

✅ 4 项 Juice 真实生效。

## 静态可达

- ✅ JS `node --check` PASS
- ✅ build/index.html 双份同步
- ✅ 单文件无外部依赖
- ✅ 移动端 viewport 适配 480×720 无横向滚动

## 异常路径

| 路径 | 处理 |
|---|---|
| 没 tap 普通鼠/金鼠 | 自动 expire → totalMissed +1 / combo 归零 |
| 没 tap 炸弹 | 自动 expire → 视为安全（合理） |
| 重复 tap 同洞 | 第 2 次 onHoleTap 见 S.holes[i]=null 直接 return |
| 横屏切换 | viewport user-scalable=0 + body flex 居中 + 固定 480×720 |
