|
| 1 | +# Vim Chaser — 游戏设计文档 |
| 2 | + |
| 3 | +## 一句话 |
| 4 | + |
| 5 | +**一个让你在「追逐、战斗、解谜」中不知不觉学会 Vim 的网页游戏。** |
| 6 | + |
| 7 | +--- |
| 8 | + |
| 9 | +## 参考实现的问题 |
| 10 | + |
| 11 | +| 问题 | 具体表现 | |
| 12 | +|------|---------| |
| 13 | +| 游戏性弱 | 本质是「教程幻灯片」— 12 个固定关卡,做完点下一步,没有挑战感 | |
| 14 | +| 反馈不足 | 只有一个"任务完成"弹窗,没有实时按键反馈、没音效、没连击感 | |
| 15 | +| 缺乏动机 | 没有分数、排行、成就、解锁机制,做完就结束了 | |
| 16 | +| 模式单一 | 只有教程模式,缺乏重玩价值 | |
| 17 | + |
| 18 | +--- |
| 19 | + |
| 20 | +## 核心设计理念 |
| 21 | + |
| 22 | +### 1. 「学 Vim」隐藏在「玩游戏」背后 |
| 23 | + |
| 24 | +玩家的**主观体验**是在玩一个有趣的游戏,而不是在学习。 |
| 25 | +Vim 命令是游戏的**操作方式**,而不是学习的**目标**。 |
| 26 | + |
| 27 | +类比: |
| 28 | +- ❌ "请用 `w` 跳到下一个单词" → 教程 |
| 29 | +- ✅ "敌人在三个单词之外,你需要快速到达那里" → 游戏 |
| 30 | + |
| 31 | +### 2. 即时反馈 > 延迟反馈 |
| 32 | + |
| 33 | +每一次按键都要有反馈: |
| 34 | +- **正确操作** → 视觉 + 音效 + 得分 |
| 35 | +- **错误操作** → 屏幕抖动 + 提示 |
| 36 | +- **连击** → 加速特效 + 倍率 |
| 37 | +- **完美通关** → 爆炸级庆祝 |
| 38 | + |
| 39 | +### 3. 渐进式难度 |
| 40 | + |
| 41 | +不是 12 个平行的教程关卡,而是一条**有节奏的难度曲线**: |
| 42 | +- 前几关只用 `h j k l`,让玩家建立肌肉记忆 |
| 43 | +- 然后引入 `w b e`,旧知识变成新挑战的基础 |
| 44 | +- 最后组合使用,让玩家感受到"我变强了" |
| 45 | + |
| 46 | +--- |
| 47 | + |
| 48 | +## 游戏模式 |
| 49 | + |
| 50 | +### 🎯 模式 1: 冒险模式(Adventure)— 主线 |
| 51 | + |
| 52 | +**核心玩法:** 在一个「代码世界」中冒险,每一关是一个「代码场景」。 |
| 53 | + |
| 54 | +分为 **10 个章节**,共 84 关,覆盖 123+ 个 Vim 命令(详见 `VIM-CURRICULUM.md`): |
| 55 | + |
| 56 | +| 章节 | 主题 | 教学内容 | 关卡数 | |
| 57 | +|------|------|---------|--------| |
| 58 | +| Ch.1 觉醒 | 基础移动 | `h j k l` `Esc` `:q` | 7 | |
| 59 | +| Ch.2 跳跃 | 词/行级移动 | `w b e W B E 0 $ ^` | 8 | |
| 60 | +| Ch.3 远征 | 行间跳跃 & 搜索 | `gg G { } H M L / ? n N * # f F t T ; ,` | 11 | |
| 61 | +| Ch.4 编辑 | 插入模式 & 基础编辑 | `i I a A o O s S C D r R J` | 9 | |
| 62 | +| Ch.5 组合 | Operator + Motion | `d{motion} c{motion} y{motion}` + 数字前缀 | 8 | |
| 63 | +| Ch.6 内功 | Text Objects | `iw aw i" a" i( a( i{ a{ it at ip ap` | 8 | |
| 64 | +| Ch.7 视界 | 可视模式 & 缩进 | `v V Ctrl+v >> << =` | 7 | |
| 65 | +| Ch.8 传承 | 寄存器 & 撤销 & 重复 | `"a "0 "+ u Ctrl+r . Ctrl+a Ctrl+x` | 9 | |
| 66 | +| Ch.9 奥义 | 宏 & 全局命令 | `q @ :s :%s :g :v` | 9 | |
| 67 | +| Ch.10 登峰 | 高级技巧 | `m % Ctrl+o gU gu zf zo zc` | 8 | |
| 68 | + |
| 69 | +**每关结构:** |
| 70 | + |
| 71 | +``` |
| 72 | +┌─────────────────────────────────────┐ |
| 73 | +│ 📝 场景描述(1-2句,设定情境) │ |
| 74 | +│ 🎯 目标(明确、可量化) │ |
| 75 | +│ ⭐ 评分标准(按步数/时间,1-3星) │ |
| 76 | +│ 💡 新命令提示(首次出现时) │ |
| 77 | +│ 🏆 隐藏挑战(可选,给高手的) │ |
| 78 | +└─────────────────────────────────────┘ |
| 79 | +``` |
| 80 | + |
| 81 | +**示例关卡:** |
| 82 | + |
| 83 | +> **Ch.1 关卡 3:「穿越注释丛林」** |
| 84 | +> |
| 85 | +> 场景:一段代码中有大量注释,光标在第 1 行,出口在第 8 行第 15 列。 |
| 86 | +> 中间有"障碍"(高亮的红色区域),碰到会扣分。 |
| 87 | +> |
| 88 | +> 目标:用 `h j k l` 导航到出口,避开障碍。 |
| 89 | +> |
| 90 | +> ⭐ 3星:≤15 步 | ⭐⭐ 2星:≤25 步 | ⭐ 1星:完成即可 |
| 91 | +
|
| 92 | +--- |
| 93 | + |
| 94 | +### ⚡ 模式 2: 极速模式(Speed Run)— 刷分 |
| 95 | + |
| 96 | +**核心玩法:** 60秒内,屏幕上不断出现「目标」,用最少按键最快速度到达。 |
| 97 | + |
| 98 | +- 初级只出现 `h j k l` 可达的目标 |
| 99 | +- 随着等级提升,目标需要 `w / f` 等高级命令才能高效到达 |
| 100 | +- **关键设计:** 用笨方法(一步步 h j k l)也能到,但会来不及拿高分 |
| 101 | + - 这就自然驱动玩家学习高级命令 |
| 102 | + |
| 103 | +**反馈机制:** |
| 104 | +- 到达目标 → 💥 爆炸特效 + 音效 + "+10"浮动数字 |
| 105 | +- 连续 3 次 → 🔥 进入 "ON FIRE" 状态,双倍得分 |
| 106 | +- 用最优解到达 → ✨ "PERFECT" 字样 + 额外加分 |
| 107 | +- 失误(碰到边界等)→ 屏幕边缘红色闪烁 + combo 中断 |
| 108 | + |
| 109 | +--- |
| 110 | + |
| 111 | +### 🧩 模式 3: 挑战模式(Challenge)— 解谜 |
| 112 | + |
| 113 | +**核心玩法:** 给定初始代码和目标代码,用最少 Vim 操作完成变换。 |
| 114 | + |
| 115 | +``` |
| 116 | +初始状态: 目标状态: |
| 117 | +const x = 10; → const y = 20; |
| 118 | +``` |
| 119 | + |
| 120 | +> 你的操作:`fxry$F1r2` — 6 次按键,⭐⭐⭐ |
| 121 | +
|
| 122 | +- 每道题有「高尔夫」性质 — 用最少按键数完成 |
| 123 | +- 社区排行榜(本地存 localStorage) |
| 124 | +- 解题后展示「最优解」,教玩家更高效的方式 |
| 125 | + |
| 126 | +--- |
| 127 | + |
| 128 | +## 视觉设计 |
| 129 | + |
| 130 | +### 整体风格:Retro Terminal(复古终端) |
| 131 | + |
| 132 | +- **主色调:** 深色背景 (#0a0e17) + 荧光绿主色 (#00ff9f) |
| 133 | +- **辅助色:** 琥珀色目标 (#ffbe0b)、红色危险 (#ff006e)、蓝色信息 (#3a86ff) |
| 134 | +- **字体:** 等宽字体(JetBrains Mono / Fira Code) |
| 135 | +- **氛围:** 像在一个老式终端里冒险,有 CRT 扫描线效果(可选) |
| 136 | +- **光标:** 块状光标,带发光效果,移动时有轨迹 |
| 137 | + |
| 138 | +### 界面布局 |
| 139 | + |
| 140 | +``` |
| 141 | +┌──────────────────────────────────────────────────────┐ |
| 142 | +│ [Logo] Vim Chaser Ch.1 - 关卡 3/8 ⭐⭐☆ │ |
| 143 | +├──────────────────────────────────────────────────────┤ |
| 144 | +│ │ |
| 145 | +│ ┌─ 代码编辑器区域 ──────────────────────┐ ┌────┐ │ |
| 146 | +│ │ 1│ // 穿越注释丛林 │ │任务│ │ |
| 147 | +│ │ 2│ function maze() { │ │面板│ │ |
| 148 | +│ │ 3│ const path = "safe"; █←光标 │ │ │ │ |
| 149 | +│ │ 4│ ████████ // 障碍 │ │💡 │ │ |
| 150 | +│ │ 5│ return exit; // ⭐←目标 │ │提示│ │ |
| 151 | +│ │ 6│ } │ │ │ │ |
| 152 | +│ └───────────────────────────────────────┘ └────┘ │ |
| 153 | +│ │ |
| 154 | +│ ┌─ 状态栏 ─────────────────────────────────────┐ │ |
| 155 | +│ │ NORMAL │ 步数: 8 │ ⚡连击: 3x │ 时间: 45s │ │ |
| 156 | +│ └──────────────────────────────────────────────┘ │ |
| 157 | +│ │ |
| 158 | +│ ┌─ 按键历史 ───────────────────────────────────┐ │ |
| 159 | +│ │ j → j → l → l → l → j → j → ? │ │ |
| 160 | +│ └──────────────────────────────────────────────┘ │ |
| 161 | +└──────────────────────────────────────────────────────┘ |
| 162 | +``` |
| 163 | + |
| 164 | +--- |
| 165 | + |
| 166 | +## 反馈系统(核心差异化) |
| 167 | + |
| 168 | +### 按键级反馈(每次按键) |
| 169 | + |
| 170 | +| 事件 | 视觉反馈 | 音效 | |
| 171 | +|------|---------|------| |
| 172 | +| 有效移动 | 光标滑动动画 + 淡入淡出轨迹 | 轻柔 tick | |
| 173 | +| 到达目标 | 目标爆炸粒子 + 浮动得分 | 清脆 ding | |
| 174 | +| 撞墙/无效 | 屏幕微震 + 红色边框闪烁 | 低沉 buzz | |
| 175 | +| 进入连击 | 屏幕边缘渐变光晕 | 升调 | |
| 176 | +| 连击中断 | 光晕消散 | 降调 | |
| 177 | +| 完美操作 | "PERFECT" 大字 + 金色闪光 | 华丽音效 | |
| 178 | +| 关卡完成 | 全屏庆祝 + 星级评价 + 统计 | 胜利曲 | |
| 179 | + |
| 180 | +### 进度反馈 |
| 181 | + |
| 182 | +- **经验值系统:** 每次操作获得 XP,累积升级 |
| 183 | +- **称号系统:** Vim Novice → Vim Apprentice → Vim Master → Vim God |
| 184 | +- **解锁系统:** 通关解锁新模式、新主题皮肤 |
| 185 | +- **统计面板:** 总按键数、最常用命令、平均通关速度 |
| 186 | + |
| 187 | +### 教学反馈 |
| 188 | + |
| 189 | +- **首次遇到新命令:** 优雅的弹出卡片,动画展示用法 |
| 190 | +- **遇到困难时:** 5 秒无操作 → 温和提示;15 秒 → 详细提示 |
| 191 | +- **通关后:** 展示"你的操作 vs 最优操作"的对比回放 |
| 192 | + |
| 193 | +--- |
| 194 | + |
| 195 | +## 技术方案 |
| 196 | + |
| 197 | +### 技术栈 |
| 198 | + |
| 199 | +- **框架:** React + TypeScript(单页应用,纯前端) |
| 200 | +- **构建:** Vite |
| 201 | +- **样式:** Tailwind CSS(沿用参考实现的选择) |
| 202 | +- **动画:** CSS Animations + Framer Motion(关键动画) |
| 203 | +- **音效:** Web Audio API(轻量,无需加载大文件) |
| 204 | +- **数据持久化:** localStorage(进度、设置、统计) |
| 205 | +- **无需后端** |
| 206 | + |
| 207 | +### 关键架构 |
| 208 | + |
| 209 | +``` |
| 210 | +src/ |
| 211 | +├── components/ # 通用 UI 组件 |
| 212 | +│ ├── CodeEditor.tsx # 代码编辑器(核心渲染) |
| 213 | +│ ├── Cursor.tsx # 光标组件(带动画) |
| 214 | +│ ├── StatusBar.tsx # 底部状态栏 |
| 215 | +│ ├── ScorePopup.tsx # 浮动得分 |
| 216 | +│ └── KeyHistory.tsx # 按键历史 |
| 217 | +├── engine/ # 游戏引擎 |
| 218 | +│ ├── VimEngine.ts # Vim 命令解析与执行 |
| 219 | +│ ├── GameLoop.ts # 游戏主循环 |
| 220 | +│ ├── Scoring.ts # 计分系统 |
| 221 | +│ └── SoundEngine.ts # 音效系统(Web Audio API) |
| 222 | +├── modes/ # 游戏模式 |
| 223 | +│ ├── Adventure.tsx # 冒险模式 |
| 224 | +│ ├── SpeedRun.tsx # 极速模式 |
| 225 | +│ └── Challenge.tsx # 挑战模式 |
| 226 | +├── data/ # 关卡数据 |
| 227 | +│ ├── chapters/ # 按章节组织 |
| 228 | +│ └── challenges/ # 挑战题库 |
| 229 | +├── hooks/ # 自定义 Hooks |
| 230 | +│ ├── useVimEngine.ts # Vim 引擎 hook |
| 231 | +│ ├── useSound.ts # 音效 hook |
| 232 | +│ └── useProgress.ts # 进度管理 hook |
| 233 | +├── pages/ # 页面 |
| 234 | +│ ├── Home.tsx # 主页 |
| 235 | +│ ├── Game.tsx # 游戏页 |
| 236 | +│ └── Stats.tsx # 统计页 |
| 237 | +└── styles/ # 样式 |
| 238 | + └── terminal.css # 终端主题 |
| 239 | +``` |
| 240 | + |
| 241 | +### Vim 引擎设计 |
| 242 | + |
| 243 | +参考实现的一大问题是 Vim 逻辑分散在 hook 的 useEffect 里,难以维护。 |
| 244 | +新方案将 Vim 引擎独立为纯逻辑模块: |
| 245 | + |
| 246 | +```typescript |
| 247 | +// VimEngine — 纯函数,无副作用,易于测试 |
| 248 | +class VimEngine { |
| 249 | + state: EditorState; |
| 250 | + |
| 251 | + // 处理按键,返回新状态 + 执行的命令 |
| 252 | + processKey(key: string): { newState: EditorState; command: VimCommand | null } |
| 253 | + |
| 254 | + // 验证状态是否满足目标 |
| 255 | + checkGoal(goal: Goal): boolean |
| 256 | +} |
| 257 | +``` |
| 258 | + |
| 259 | +--- |
| 260 | + |
| 261 | +## 与参考实现的对比 |
| 262 | + |
| 263 | +| 维度 | 参考实现 | Vim Chaser | |
| 264 | +|------|---------|------------| |
| 265 | +| 本质 | 教程幻灯片 | 游戏 | |
| 266 | +| 关卡数 | 12 个固定教程 | 30+ 冒险关卡 + 无限极速 + 题库 | |
| 267 | +| 反馈 | 完成弹窗 | 每按键反馈 + 音效 + 粒子 + 连击 | |
| 268 | +| 动机 | 学完了就学完了 | 星级、XP、称号、排行、解锁 | |
| 269 | +| 重玩性 | 无 | 刷星、刷分、刷最优解 | |
| 270 | +| 教学方式 | 直接告诉你按什么 | 在游戏情境中引导你发现 | |
| 271 | +| Vim 覆盖 | 基础 12 个命令 | 系统性覆盖,从基础到组合 | |
| 272 | + |
| 273 | +--- |
| 274 | + |
| 275 | +## 开发优先级(MVP) |
| 276 | + |
| 277 | +### Phase 1 — 核心可玩(先做出来) |
| 278 | + |
| 279 | +1. ✅ Vim 引擎(h j k l w b e 0 $ gg G) |
| 280 | +2. ✅ 代码编辑器渲染(等宽网格、光标、高亮) |
| 281 | +3. ✅ 极速模式(最小可玩版本) |
| 282 | +4. ✅ 基础音效(Web Audio API 合成音) |
| 283 | +5. ✅ 按键反馈(视觉 + 音效) |
| 284 | + |
| 285 | +### Phase 2 — 冒险模式 |
| 286 | + |
| 287 | +6. 关卡系统 + Ch.1(h j k l 教学) |
| 288 | +7. Ch.2-3 关卡 |
| 289 | +8. 星级评价 + 进度保存 |
| 290 | +9. 新命令教学卡片 |
| 291 | + |
| 292 | +### Phase 3 — 打磨 |
| 293 | + |
| 294 | +10. 挑战模式 |
| 295 | +11. 统计面板 |
| 296 | +12. 更多关卡 |
| 297 | +13. 成就系统 |
| 298 | + |
| 299 | +--- |
| 300 | + |
| 301 | +## 名字和 Slogan |
| 302 | + |
| 303 | +**Vim Chaser** |
| 304 | +*Chase the cursor. Master the keys.* |
| 305 | + |
| 306 | +中文副标题:追逐光标,掌控按键。 |
0 commit comments