11 KiB
11 KiB
第 1 关开发文档:1-1 左手基准键 ASDF
对应规划:分关难度规划.md → 第 1 章 · 基准键入门 → 1-1。
本文只覆盖第 1 关的实现范围,作为后续关卡的模板。第 1 关同时要搭好练习页的通用骨架,后关复用,不重做。
1. 目标
让完全新手在不看键盘的情况下,用正确指法打出左手四个基准键:
| 键 | 手指 |
|---|---|
A |
左手小指 |
S |
左手无名指 |
D |
左手中指 |
F |
左手食指 |
本关不考速度,只考正确率和指法习惯。
通关条件:正确率 ≥ 90%(无速度门槛)。
2. 范围
2.1 本关要做
- 关卡选择页中,1-1 默认解锁,可进入
- 练习页:待打文本、实时对错着色、键盘指法图、实时数据条
- 约 40 个目标键,字符集仅
a s d f(小写) - 击键判定、正确率、键/分、进度
- 结束结算:通过 / 未通过,可重打
- 通过后解锁 1-2
- 记录本关历史最好正确率(本地存储)
2.2 本关不做
- 右手键
j k l ;、空格、大写、数字、符号 - 速度门槛、限时模式
- 中文拼音、单词、文章
- 热力图统计(可先预留数据结构,本关不展示)
- 账号 / 云同步
3. 页面与信息架构
建议单页 HTML,用视图切换,不必多文件路由。
启动
└─ 关卡选择(第 1 章四关列表)
└─ 练习中(1-1)
└─ 结算弹层
├─ 再打一次 → 回到练习中(重新抽题)
└─ 返回选关 → 关卡选择
3.1 关卡选择页(本关相关)
| 元素 | 说明 |
|---|---|
| 章标题 | 第 1 章 · 基准键入门 |
| 关卡卡片 1-1 | 标题「左手基准键 ASDF」;状态:已解锁 / 已通关 |
| 关卡卡片 1-2~1-4 | 未通关 1-1 前置灰,不可点 |
| 最佳成绩 | 若打过 1-1,显示历史最高正确率 |
3.2 练习页布局(自上而下)
- 顶栏:关卡名「1-1 左手基准键」、返回选关
- 数据条:进度
已打/总数、正确率、速度(键/分)、用时 - 文本区:一行待打字符,当前目标键放大/下划线,已打正确为绿、错误为红
- 键盘区:QWERTY 示意图,强制显示;当前目标键高亮;四指提示
- 提示文案:「食指放在 F,小指放在 A,不要看键盘」
结算用遮罩弹层盖在练习页上,不跳新页。
4. 关卡配置
实现时用一份配置驱动,后关只改配置、少改逻辑。
{
id: "1-1",
chapter: 1,
title: "左手基准键 ASDF",
charset: ["a", "s", "d", "f"],
length: 40,
allowSpace: false,
caseSensitive: false, // 本关只产生小写;Shift+A 视为错误
passAccuracy: 0.90,
passKpm: null, // 本关不卡速度
unlockNext: "1-2",
showKeyboard: true, // 强制显示,不可关
generate: "random-from-charset"
}
4.1 题目生成规则
- 从
charset均匀随机抽取length个字符,连成一串,例如:asdfafsdasfd... - 不要出现空格、换行
- 建议约束:同一字符连续不超过 3 次(避免
aaaa失去指法切换训练) - 每次进入或「再打一次」都重新生成,不固定题库
4.2 允许输入
| 按键 | 行为 |
|---|---|
a s d f |
有效击键,进入对错判定 |
| 其他字母 / 数字 / 符号 | 记为一次错误击键,不前进光标(卡住当前目标,直到打对) |
Shift / CapsLock 产生的 A 等 |
视为错误(本关只认小写) |
Backspace |
忽略,本关不允许改错(对标金山打字通初级指法:打错就记错,必须打对当前键才继续) |
Enter Tab Esc |
忽略,不计入对错 |
Alt Meta Ctrl 组合 |
忽略 |
采用「必须打对才前进」:错了标红提示,光标停在当前目标,直到按下正确键。
正确率分母按「总击键次数(含错键)」计算,而不是按「已完成字符数」。见第 6 节。
5. 指法与键盘 UI
5.1 手指映射(本关只用左手)
| 键 | 手指 | 建议高亮色 |
|---|---|---|
| A | 小指 | 橙 |
| S | 无名指 | 黄 |
| D | 中指 | 绿 |
| F | 食指 | 蓝 |
其余键绘制出来但呈禁用态(降低透明度),避免误导用户去打。
5.2 键盘交互
- 当前目标键:描边 + 放大/脉冲
- 按下正确键:该键闪绿后熄灭,切到下一目标
- 按下错误键:目标键闪红,可加轻微震动(CSS)
- 键盘图下方固定文案:
「左手:小指 A · 无名指 S · 中指 D · 食指 F」
5.3 文本区表现
假设目标串为 asdf,用户先打对 a s,第三个该打 d 却打了 f:
[a] [s] [d] [f]
绿 绿 当前(红闪) 灰
- 已正确:绿色
- 当前目标:深色底 + 下划线;若刚打错则红框
- 未打到:灰色
- 不把错误字符插入文本(文本始终是标准答案,只改颜色/状态)
6. 判定与统计
从第一次有效击键开始计时(a/s/d/f 或其他会记错的可见字符)。纯功能键不开始计时。
6.1 字段
| 字段 | 定义 |
|---|---|
targetLength |
40 |
cursor |
当前待打下标,0~40;到 40 结束 |
correctHits |
打对次数(每前进一格 +1,最大 40) |
wrongHits |
打错次数(每次错误按键 +1,可大于 40) |
totalHits |
correctHits + wrongHits |
elapsedMs |
从首次有效击键到结束(或当前)的毫秒 |
6.2 公式
正确率 accuracy = correctHits / totalHits
进度 percent = cursor / targetLength
速度 kpm = correctHits / (elapsedMs / 60000)
用时 time = elapsedMs
展示:
- 正确率:百分数,保留 1 位小数,如
92.5% - 速度:整数「键/分」,未开始时显示
-- - 进度:
12 / 40+ 进度条 - 用时:
mm:ss
6.3 通关判定(结束时一次性算)
passed = accuracy >= 0.90
本关 passKpm 为空,不判断速度。
totalHits 为 0 时(理论上不会结束)正确率按 0。
6.4 结束时机
cursor === targetLength 立即结束,弹出结算。不再接收击键。
7. 结算
7.1 展示
| 项 | 说明 |
|---|---|
| 结果标题 | 「通关」或「未通关」 |
| 正确率 | 实际值,并标明门槛「≥ 90%」 |
| 速度 | 键/分(仅展示,不影响通关) |
| 用时 | mm:ss |
| 击键 | 正确 / 错误 / 总计 |
| 操作 | 「再打一次」「返回选关」 |
通关时额外一行:「已解锁 1-2 右手基准键」。
7.2 进度写入
使用 localStorage,键名建议:typing-progress-v1。
{
unlocked: ["1-1", "1-2"], // 通关 1-1 后写入 1-2
records: {
"1-1": {
bestAccuracy: 0.95,
bestKpm: 62,
passed: true,
lastPlayedAt: "2026-08-13T15:30:00+08:00"
}
}
}
规则:
- 初始
unlocked含1-1 - 通关才把
unlockNext加入unlocked bestAccuracy/bestKpm只升不降- 未通关也写入
lastPlayedAt和当前成绩,但不把passed从 true 改回 false - 重打失败不锁回 1-2
8. 状态机
idle 进入练习页,题目已生成,等待第一击
playing 已开始计时,接收击键
finished 40 键打完,弹出结算,忽略击键
转移:
idle→playing:第一次有效/错误可见击键playing→finished:cursor达到 40finished→idle:点「再打一次」(新题、清零统计)- 任意 → 选关:点返回(练习中途返回不保存通关,可选择是否写入 lastPlayedAt;本关规定:中途退出不记成绩)
9. 技术约定
| 项 | 约定 |
|---|---|
| 形态 | 单文件或「HTML + CSS + JS」,先保证双击即可打开 |
| 输入 | window 上 keydown;用 event.key 判定字符 |
| 防干扰 | 练习中 preventDefault 掉会滚动/选中的键;不要用隐藏 <input> 抢焦点(避免 IME) |
| 本关 IME | 不需要中文输入;若系统处于中文输入法,提示「请切换到英文」 |
| 样式 | 深色背景、大字号文本区,适合全屏练习 |
| 兼容 | 现代桌面 Chrome / Edge / Safari;本关按物理键盘设计,不做触屏键盘 |
9.1 建议模块划分(同一文件内亦可)
config:关卡配置progress:读写 localStoragegenerator:按 charset 生成题目engine:状态机、击键、统计keyboardView:键盘高亮textView:文本着色hud:数据条resultModal:结算stageSelect:选关
第 1 关实现时就把 1~8 做成可复用,选关先只列第 1 章四关。
10. 文案
| 位置 | 文案 |
|---|---|
| 选关卡片标题 | 1-1 左手基准键 |
| 选关卡片副标 | 只打 A S D F,正确率 90% 即可通关 |
| 练习顶栏 | 第 1 关 · 左手基准键 ASDF |
| 指法提示 | 食指放 F,小指放 A。请看着屏幕,不要看键盘。 |
| 通关 | 通关!基准键已经记住了。 |
| 未通关 | 再练一次。先求正确,再求速度。 |
| 输入法提示 | 请切换到英文输入法后再开始。 |
11. 验收标准
- 打开页面即可进入 1-1,无需登录
- 题目长度为 40,仅含
a s d f,无空格 - 同一字符连续不超过 3 次
- 打对前进一格,打错不前进并记一次错误
- Backspace 不影响进度与统计
- 正确率按
正确 / (正确+错误)计算,≥ 90% 判定通关 - 无速度门槛;结算仍显示键/分
- 键盘图始终显示,当前键高亮,非 ASDF 键呈禁用态
- 通关后 1-2 可点;未通关 1-2 仍锁
- 刷新页面后解锁状态仍在
- 中途返回选关不记本局成绩
- 「再打一次」重新抽题并清零
12. 测试用例
| 编号 | 操作 | 期望 |
|---|---|---|
| T1 | 40 次全对 | 正确率 100%,通关,解锁 1-2 |
| T2 | 打对 36、打错 4(错键后补对) | 总击键 44,正确率 ≈ 81.8%,未通关 |
| T3 | 打对 36、打错 4 之外再算:正确 36 / 总击键 40 | 注意:因打错不前进,40 个正确键必须打满;未通关局 correctHits 仍为 40,wrongHits > 0。例如错 5 次则正确率 = 40/45 ≈ 88.9%,未通关 |
| T4 | 正确率刚好 90%(40 对 + 约 4.44 错不可整除) | 用 40 对 + 5 错 = 88.9% 未过;40 对 + 4 错 = 90.9% 通过。门槛按 >= 0.90 |
| T5 | 练习中按 Backspace、方向键 | 无效果 |
| T6 | 打 g 或其他非 charset 键 |
错误 +1,光标不动 |
| T7 | 通关后刷新 | 1-2 仍解锁 |
| T8 | 通关后再打失败 | 1-2 保持解锁 |
| T9 | 第一键前等待 | 速度显示 --,用时 00:00 |
| T10 | 中途点返回 | 无结算、不改 best、不解锁 |
正确率要点(务必实现一致):
本关结束时 correctHits 恒为 40。通关只取决于错了多少次:
accuracy = 40 / (40 + wrongHits)
90% 通关 ⇒ 40 / (40 + wrongHits) >= 0.90 ⇒ wrongHits <= 4
即:全程最多允许打错 4 次。
13. 后续关卡复用说明
第 1 关落地后,1-2 只需改配置:
| 项 | 1-1 | 1-2(预告,不在本文实现) |
|---|---|---|
| charset | a s d f | j k l ; |
| 手指 | 左手四指 | 右手四指 |
| 通关 | 正确率 ≥ 90% | 同 1-1 |
| 键盘禁用态 | 非 ASDF | 非 JKL; |
不要为 1-2 另写一套引擎。