关卡与解谜
兔子会自己跑自己跳(见 玩法 第三、四节)。 玩家唯一的操作就在这里:岔路口看线索、选出口。
一、这一版的原创点#
轻解谜最难的地方是:线索不能靠猜,但又不能难。 太难玩家去网上搜答案,太简单等于没有。
这套设计取的办法是——线索不是文字谜语,是自然界里真实存在的方向指认。
| 常见做法 | 这一版 | |
|---|---|---|
| 线索形态 | 谜语、数字、密码 | 环境本身的物理特征(苔藓长在哪面、水往哪边流) |
| 玩家要调用的知识 | 联想 / 试错 | 观察(答案就画在屏幕上,仔细看就能看出来) |
| 需要的前置知识 | 可能很多 | 几乎为零。苔藓背着阳光长,这是常识 |
| 犯错成本 | 重来 / 扣命 | 零。折返还能多捡一样东西 |
一句话给玩家听:"答案不在我脑子里,在我眼睛里。"
二、关卡结构#
一关 = 约 18000px(跑 60 秒),由段落拼成。段落类型固定,顺序随机。
| 段落 | 长度 | 内容 | 玩家状态 |
|---|---|---|---|
| 平缓草坡 | 800~1600px | 只长花,无坎 | 放松、看风景 |
| 石块带 | 1000~2000px | 石头(高 24~72px) | 看兔子自己跳 |
| 沟壑 | 900~1500px | 缺口(宽 90~150px) | 看兔子贴边起跳 |
| 溪流栈道 | 1200~1800px | 木桩桥(间距 120~170px) | 连续小跳(唯一的"连招") |
| 花丛 | 900~1400px | 花密度 ×3,无坎 | 纯收益 |
| 坡地 | 1000~1600px | 上下坡(4°~9°) | 视觉变化 |
| 岔路口 | 240px | 一块木牌 + 2~3 个出口 | ★ 停下,读卡,点一下 |
| 观察点 | 单个物体 | 一件会自己动的遗物(如飘动的布条) | 看,然后收 |
| 小游戏点 | 单个装置 | 如三只挂铃(见 小游戏) | ★ 停下,动手十几秒 |
| 终点 | 400px | 本关结算 | 看手账涨了 |
硬约束(保证一关里有明确的高潮和明确的喘息,不是均匀噪声):
- 同一类段落不连出三次。
- 花丛每关至少一次,溪流栈道每关最多一次。
- 岔路口每关 2~3 个,前 1/3 段落里必定有一个(让玩家很快知道这一关要动脑)。 3.5 小游戏点每关 0~1 个,间隔 9000~13000px。触发时和岔路比谁更近,不重叠(见 小游戏 第五节)。
- 两个岔路口之间至少隔 4000px(否则一直在选,累)。
2.1 配表格式#
段落在代码里生成、参数在配表里(照工程约定:数值走配表,公式在代码里)。
配表已经生成好了:demo/data/levels.json(20 关全在里面)。
它由 tools/sim/gen_levels.py 产出,改关卡请改那个脚本再重新生成,不要手改 JSON——
脚本里带着 8 条硬约束的校验,手改就绕过了校验。
{
"levels": [
{
"id": "spring-02",
"band": 1,
"name": "苔原草坡 · 第二段",
"length": 17000,
"paragraphs": ["slope", "bloom", "rocks", "branch", "gully", "bloom", "slope",
"branch", "rocks", "slope", "bloom", "gully", "slope", "finish"],
"paragraphLengths": [1454, 1318, 1621, 240, 1245, 1392, 1520,
240, 1706, 1433, 1187, 1350, 1494, 400],
"branches": [
{
"at": 4393,
"clue": "lichen-north",
"options": [
{ "label": "左边的石阶", "correct": false },
{ "label": "中间的苔石路", "correct": true }
],
"reward": [],
"detour": ["crayon-half"]
}
]
}
]
}
| 字段 | 说明 |
|---|---|
paragraphs |
段落序列。类型固定、顺序每关不同 |
paragraphLengths |
每段的实际像素长度。由脚本按 length 精确分配,加起来正好等于 length |
branches[].at |
岔路在关卡里的像素位置。必须落在前 1/3(否则玩家要跑很久才知道这关要动脑) |
branches[].clue |
线索模板编号(见第四节十个模板) |
branches[].options |
2~3 个出口,恰好一个 correct: true,正确项固定放中间 |
branches[].detour |
折返兜底奖励。每个岔路都带,选错不惩罚、折返必定有收获 |
bait |
诱饵线索(秋章起),必须另配一条能自证的线索 |
paddedParagraphs |
脚本为撑满长度补出来的段数。有值说明这关的段落列表是自动补过的 |
单关 6090 秒是含岔路停留的(见剧情与世界观 六),
而岔路停留 1220 秒是"停着读卡"的时间、不产生像素。
所以配表里的 length 对应的是跑动那一段(4560 秒),不是总时长。
实测:单关 17000px(跑 52length 1550057 秒)+ 02 个岔路(035 秒)= **5289 秒**。
这一条一开始搞错过:配表按 18000px(=60 秒纯跑)填,加上岔路停留就顶到 90 秒以上, 一周目算出来 32 分钟,和"26~28 分钟"对不上。
三、岔路口的界面#
兔子走到木牌前自动停下,然后:
┌──────────────────────────────┐
│ 🪨 岔路 · 石楠台地 │ ← 标题:在哪
├──────────────────────────────┤
│ 线索 │
│ 这三块石头上都长着苔藓, │ ← 观察:一句话
│ 苔藓只长在朝北的那一面。 │
│ │
│ [ 图 ] 一块石头,苔藓在阴影面 │ ← 小图:把答案画出来
├──────────────────────────────┤
│ [ 左边的石阶 ] │ ← 出口:点一下就选了
│ [ 中间的苔石路 ] │
│ [ 右边的浅溪 ] │
└──────────────────────────────┘
| 元素 | 规则 |
|---|---|
| 标题 | 「岔路」+ 当前风景带名 |
| 线索 | 一句话,不超过 24 个字 |
| 小图 | 一张 1:1 的小观察图(64×64 逻辑像素),把线索指的东西画出来 |
| 出口 | 2~3 个,用地貌特征命名("左边的石阶"),不用"左/中/右" |
| 计时 | 无 |
| 提示 | 停留超过 30 秒后,正确出口轻微发光一下(每 15 秒一次)。照顾真正卡住的玩家 |
"左边"没有任何信息,玩家只能回头再对一遍线索。 "左边的石阶" 让选项本身也承载线索信息——玩家可以用排除法缩小范围, 卡住的概率明显降低,而且读起来更像在看一张地图。
四、十个线索模板(可直接用)#
全部基于真实存在的自然现象。每个模板都能用一行的代码勾出来,不需要美术额外画东西。
4.1 植物类#
| # | 线索(一句话) | 答案 | 为什么成立 |
|---|---|---|---|
| 1 | 苔藓只长在石头朝北的那一面 | 选苔藓多的那块石头 | 北面少日照、更潮 |
| 2 | 向日葵的花盘朝着太阳,现在是上午 | 选朝东的那边 | 上午太阳在东 |
| 3 | 芦苇顺着风倒,风从西边来 | 选风倒向的那条路(下风处更开阔) | 风从西来,芦苇倒向东 |
| 4 | 蘑菇围成一圈长,圈心是老的 | 圈心有旧路基 | 蘑菇圈(仙环)逐年外扩 |
| 5 | 蒲公英的种子往一边飘 | 选种子飘向的那条路 | 飘向 = 下风 = 开阔 |
4.2 地形类#
| # | 线索(一句话) | 答案 | 为什么成立 |
|---|---|---|---|
| 6 | 溪水从高处往低处流,水纹朝东 | 选东边(下游,通向河谷) | 水往低处走 |
| 7 | 树桩的年轮一边密一边疏,疏的一侧朝南 | 选朝南的那条路 | 南侧日照足、长得快 |
| 8 | 倒下的树,苔藓长在朝上的那一面 | 选苔藓朝上的路 | 上面更潮、见光少 |
| 9 | 地面上的脚印朝一个方向 | 选脚印朝向的那条路 | —(也可能是诱饵,见下) |
| 10 | 鸟群往一个方向飞,离巢是去觅食 | 选鸟飞去的方向 | 觅食方向通常通向水/食物 |
4.3 关于"诱饵"#
脚印和鸟群在真实世界里都可能是任意方向,所以它们不能当唯一的正确线索。 规则是:用诱饵的岔路口,必须有第二个能自证的线索(比如牌子上同时写了苔藓)。 诱饵的作用是让玩家"多看一眼",不是"坑他"。没有第二个线索就不许用 9/10。
五、选错了会怎样(零失败的实现)#
这是整套设计里最需要写清楚的一节——"不惩罚"必须落在具体行为上,不能只是一句口号。
| 步骤 | 发生什么 |
|---|---|
| 1 | 兔子走向选错的那个出口,速度 0.8 倍(比正常慢,像是在犹豫) |
| 2 | 走约 3 秒(900px)后,路渐渐变成死路:草变稀、天色偏暗、鸟声停 |
| 3 | 兔子自己停下、回头、走回来。回来路上必定能捡到 1 件东西(随机花或碎片) |
| 4 | 回到岔路口,牌子上多出一行新线索("刚才那条路是断的"这类),再选一次 |
| 5 | 第二次选错 → 第三次直接给出唯一剩下的出口(不会卡住) |
损失清单:不扣种子、不倒退进度、不重复计时、不减少本关的收集上限。唯一损失是 8 秒时间。
如果折返路上什么都没有,玩家的感受是"我白走了"。 塞一样东西进去,感受立刻变成"我顺便还捡了个东西"—— 一样的 8 秒,一个是惩罚,一个是奖励。 这就是零失败在细节上的写法。
六、种子、难度与长期曲线#
| 关 | 岔路口数 | 线索可读性 | 出口数 |
|---|---|---|---|
| 1~3(第 1 季) | 1~2 | 线索直接写在牌子上,看图就懂 | 2 |
| 4~9 | 2 | 线索在牌子上,但小图需要看一眼 | 2~3 |
| 10~18 | 2~3 | 线索在场景里(牌子只写"看看四周"),要自己找 | 3 |
| 19+ | 3 | 同上,且开始出现诱饵(必须有第二线索) | 3 |
选项变多、线索变长,都只是变烦。"线索从牌子上移到场景里" 才是真正的难度提升—— 它要求玩家看画面,而看画面正是这个游戏的核心动作。 难度加在核心动作上,玩家会觉得"我在变强";加在阅读量上,只会觉得"我在做阅读理解"。