feat: version campaigns and document original puzzle design

Restore v0.1 and v0.2 archives with separate progress, publish the curved v0.3 campaign, and document the original 24-level design with reproducible evidence. Refine board presentation and movement, and keep video lab tooling within its own directory.
This commit is contained in:
cabinw
2026-09-09 13:17:30 +08:00
parent 70b021d4cc
commit e92cccba82
52 changed files with 76449 additions and 15076 deletions
+63 -51
View File
@@ -1,58 +1,70 @@
# 主线关卡验收与节奏表
自动生成:`npm run levels`。共 48 关,8 章,每章顺序为进入、换路、展开、小挑战、释放、长局回报。认知难度与棋盘规模分别记录。
自动生成:`npm run levels`;固定布局参数见 `levels/campaign-seeds.json`。共 48 关,8 章,每章顺序为进入、换路、展开、小挑战、释放、长局回报。认知难度与棋盘规模分别记录。
全部关卡:可解且回放通关;每枚棋子在全部六朝向独立路线无闭环;参考解答无路线格外擦碰阻挡;相邻消除之间最多连续旋转一次。参考解答检查不等于穷尽玩家的任意旋转顺序,实际阻挡对象会在游戏中标记。
**每关至少 65% 的参考消除路径实际经过弯道,至少 3 枚弯路棋子;空格中没有走过的弯线不计入。** 全部参考解答合计 706 次消除,其中 530 次经过弯道(75.1%);纯直出关卡 0 个。这里统计的是求解器的实际离场路径,不是任意玩家操作顺序。
**预计时长只用于内部比较,没有真人测试数据。** 公式为 3 × 棋子数 + 0.75 × 初始独立路线总转弯 + 4 × 最少旋转。所有时间均为估计秒数,不能当作通关时限。
| 关 | 名称 | 节奏 | 格数 | 棋子 | 认知难度 | 开局可解 | 必要旋转 | 预计秒数 |
|---|---|---|---:|---:|---:|---:|---:|---:|
| 1 | 一眼看见出口 | 进入 | 37 | 12 | 0 | 12 | 0 | 36 |
| 2 | 转一下,就通了 | 换路 | 19 | 4 | 27 | 2 | 1 | 18 |
| 3 | 顺着线出发 | 展开 | 61 | 14 | 20 | 7 | 0 | 43 |
| 4 | 解开小结 | 小挑战 | 19 | 9 | 40 | 4 | 1 | 40 |
| 5 | 一片畅通 | 释放 | 37 | 16 | 21 | 6 | 0 | 48 |
| 6 | 轻松清空大盘 | 长局回报 | 37 | 18 | 18 | 8 | 0 | 54 |
| 7 | 熟悉的方向 | 进入 | 37 | 14 | 15 | 8 | 0 | 42 |
| 8 | 换条短路 | 换路 | 19 | 5 | 32 | 3 | 1 | 22 |
| 9 | 接连找到出口 | 展开 | 61 | 16 | 18 | 8 | 0 | 49 |
| 10 | 小小转机 | 小挑战 | 19 | 4 | 41 | 2 | 1 | 21 |
| 11 | 一路放行 | 释放 | 37 | 18 | 18 | 8 | 0 | 54 |
| 12 | 铺开好心情 | 长局回报 | 37 | 20 | 19 | 8 | 0 | 60 |
| 13 | 找到节奏 | 进入 | 37 | 16 | 21 | 6 | 0 | 48 |
| 14 | 转出一条新路 | 换路 | 19 | 4 | 34 | 2 | 1 | 18 |
| 15 | 继续向外走 | 展开 | 61 | 16 | 25 | 6 | 0 | 50 |
| 16 | 先解哪一枚 | 小挑战 | 19 | 7 | 45 | 2 | 1 | 30 |
| 17 | 宽阔的回报 | 释放 | 61 | 22 | 20 | 8 | 0 | 66 |
| 18 | 长路也轻巧 | 长局回报 | 61 | 24 | 21 | 8 | 0 | 72 |
| 19 | 慢慢看,都来得及 | 进入 | 37 | 18 | 18 | 8 | 0 | 54 |
| 20 | 只换一个方向 | 换路 | 19 | 4 | 33 | 2 | 1 | 19 |
| 21 | 连成顺畅的路 | 展开 | 61 | 18 | 26 | 6 | 0 | 57 |
| 22 | 轻巧绕一个弯 | 小挑战 | 19 | 6 | 45 | 3 | 1 | 30 |
| 23 | 松一口气 | 释放 | 61 | 24 | 21 | 8 | 0 | 72 |
| 24 | 从容的大舞台 | 长局回报 | 61 | 26 | 19 | 10 | 0 | 78 |
| 25 | 又是新的出口 | 进入 | 37 | 20 | 19 | 8 | 0 | 60 |
| 26 | 看见新的可能 | 换路 | 19 | 8 | 28 | 3 | 1 | 28 |
| 27 | 顺路解开 | 展开 | 61 | 18 | 25 | 7 | 0 | 56 |
| 28 | 留意这个转角 | 小挑战 | 19 | 6 | 44 | 2 | 1 | 30 |
| 29 | 满盘好走 | 释放 | 61 | 26 | 20 | 10 | 0 | 78 |
| 30 | 长长的成就感 | 长局回报 | 61 | 28 | 22 | 8 | 0 | 84 |
| 31 | 熟练地出发 | 进入 | 61 | 22 | 20 | 8 | 0 | 66 |
| 32 | 一点小变化 | 换路 | 19 | 10 | 32 | 6 | 1 | 42 |
| 33 | 接住这个节奏 | 展开 | 61 | 20 | 24 | 7 | 0 | 61 |
| 34 | 两条路的相遇 | 小挑战 | 19 | 5 | 47 | 2 | 1 | 24 |
| 35 | 把出口打开 | 释放 | 61 | 28 | 22 | 8 | 0 | 84 |
| 36 | 顺畅走到最后 | 长局回报 | 61 | 30 | 21 | 10 | 0 | 90 |
| 37 | 从容观察 | 进入 | 61 | 24 | 19 | 10 | 0 | 72 |
| 38 | 换个角度看 | 换路 | 19 | 7 | 32 | 3 | 1 | 30 |
| 39 | 一枚接着一枚 | 展开 | 61 | 20 | 24 | 7 | 0 | 61 |
| 40 | 给路线松个结 | 小挑战 | 19 | 4 | 45 | 2 | 1 | 24 |
| 41 | 轻轻一扫 | 释放 | 61 | 28 | 20 | 10 | 0 | 84 |
| 42 | 大盘小心思 | 长局回报 | 61 | 32 | 22 | 10 | 0 | 96 |
| 43 | 自在出发 | 进入 | 61 | 26 | 22 | 8 | 0 | 78 |
| 44 | 最后一个新转角 | 换路 | 19 | 8 | 38 | 3 | 1 | 34 |
| 45 | 熟悉的长路 | 展开 | 61 | 20 | 23 | 7 | 0 | 61 |
| 46 | 小结轻解 | 小挑战 | 19 | 9 | 40 | 4 | 1 | 43 |
| 47 | 收获一片畅通 | 释放 | 61 | 30 | 21 | 10 | 0 | 90 |
| 48 | 自在回响 | 长局回报 | 61 | 33 | 22 | 10 | 0 | 99 |
| 关 | 名称 | 节奏 | 格数 | 棋子 | 弯路离场 | 弯路占比 | 认知难度 | 开局可解 | 必要旋转 | 预计秒数 |
|---|---|---|---:|---:|---:|---:|---:|---:|---:|---:|
| 1 | 跟着弯道走 | 进入 | 37 | 8 | 8 | 100.0% | 7 | 8 | 0 | 30 |
| 2 | 转一下,路会变 | 换路 | 19 | 6 | 5 | 83.3% | 32 | 3 | 1 | 27 |
| 3 | 交叉处不换线 | 展开 | 37 | 12 | 12 | 100.0% | 28 | 7 | 0 | 50 |
| 4 | 先解开这道弯 | 小挑战 | 19 | 6 | 4 | 66.7% | 37 | 3 | 1 | 28 |
| 5 | 一弯接一弯 | 释放 | 61 | 12 | 10 | 83.3% | 21 | 7 | 0 | 44 |
| 6 | 把弯路连起来 | 长局回报 | 61 | 16 | 15 | 93.8% | 21 | 9 | 0 | 59 |
| 7 | 沿着轨道看出口 | 进入 | 61 | 14 | 12 | 85.7% | 19 | 9 | 0 | 51 |
| 8 | 换条短路 | 换路 | 19 | 6 | 4 | 66.7% | 33 | 3 | 1 | 24 |
| 9 | 接连找到出口 | 展开 | 61 | 14 | 14 | 100.0% | 25 | 7 | 0 | 53 |
| 10 | 小小转机 | 小挑战 | 19 | 7 | 5 | 71.4% | 42 | 3 | 1 | 34 |
| 11 | 一路放行 | 释放 | 61 | 16 | 12 | 75.0% | 20 | 11 | 0 | 62 |
| 12 | 铺开好心情 | 长局回报 | 61 | 18 | 14 | 77.8% | 24 | 9 | 0 | 65 |
| 13 | 找到节奏 | 进入 | 61 | 16 | 12 | 75.0% | 17 | 11 | 0 | 57 |
| 14 | 转出一条新路 | 换路 | 19 | 6 | 4 | 66.7% | 31 | 3 | 1 | 25 |
| 15 | 继续向外走 | 展开 | 61 | 16 | 14 | 87.5% | 27 | 6 | 0 | 59 |
| 16 | 先解哪一枚 | 小挑战 | 19 | 7 | 6 | 85.7% | 45 | 2 | 1 | 30 |
| 17 | 宽阔的回报 | 释放 | 61 | 18 | 12 | 66.7% | 24 | 8 | 0 | 63 |
| 18 | 长路也轻巧 | 长局回报 | 61 | 20 | 15 | 75.0% | 22 | 10 | 0 | 71 |
| 19 | 慢慢看,都来得及 | 进入 | 61 | 18 | 13 | 72.2% | 23 | 9 | 0 | 64 |
| 20 | 只换一个方向 | 换路 | 19 | 6 | 5 | 83.3% | 37 | 3 | 1 | 29 |
| 21 | 连成顺畅的路 | 展开 | 61 | 18 | 16 | 88.9% | 29 | 6 | 0 | 66 |
| 22 | 轻巧绕一个弯 | 小挑战 | 19 | 6 | 5 | 83.3% | 43 | 2 | 1 | 30 |
| 23 | 松一口气 | 释放 | 61 | 20 | 13 | 65.0% | 23 | 11 | 0 | 76 |
| 24 | 从容的大舞台 | 长局回报 | 61 | 22 | 15 | 68.2% | 23 | 10 | 0 | 77 |
| 25 | 又是新的出口 | 进入 | 61 | 18 | 12 | 66.7% | 27 | 7 | 0 | 63 |
| 26 | 看见新的可能 | 换路 | 19 | 6 | 6 | 100.0% | 38 | 2 | 1 | 27 |
| 27 | 顺路解开 | 展开 | 61 | 20 | 14 | 70.0% | 29 | 6 | 0 | 71 |
| 28 | 留意这个转角 | 小挑战 | 19 | 6 | 4 | 66.7% | 45 | 2 | 1 | 28 |
| 29 | 满盘好走 | 释放 | 61 | 20 | 13 | 65.0% | 21 | 10 | 0 | 70 |
| 30 | 长长的成就感 | 长局回报 | 61 | 22 | 17 | 77.3% | 26 | 9 | 0 | 79 |
| 31 | 熟练地出发 | 进入 | 61 | 20 | 13 | 65.0% | 25 | 8 | 0 | 70 |
| 32 | 一点小变化 | 换路 | 19 | 6 | 4 | 66.7% | 38 | 3 | 1 | 30 |
| 33 | 接住这个节奏 | 展开 | 61 | 20 | 14 | 70.0% | 28 | 8 | 0 | 75 |
| 34 | 两条路的相遇 | 小挑战 | 19 | 6 | 6 | 100.0% | 49 | 2 | 1 | 31 |
| 35 | 把出口打开 | 释放 | 61 | 22 | 15 | 68.2% | 24 | 9 | 0 | 77 |
| 36 | 顺畅走到最后 | 长局回报 | 61 | 24 | 16 | 66.7% | 25 | 10 | 0 | 84 |
| 37 | 从容观察 | 进入 | 61 | 22 | 15 | 68.2% | 25 | 9 | 0 | 77 |
| 38 | 换个角度看 | 换路 | 19 | 6 | 4 | 66.7% | 34 | 2 | 1 | 25 |
| 39 | 一枚接着一枚 | 展开 | 61 | 22 | 15 | 68.2% | 28 | 8 | 0 | 80 |
| 40 | 给路线松个结 | 小挑战 | 19 | 6 | 6 | 100.0% | 46 | 2 | 1 | 32 |
| 41 | 轻轻一扫 | 释放 | 61 | 24 | 17 | 70.8% | 29 | 10 | 0 | 92 |
| 42 | 大盘小心思 | 长局回报 | 61 | 25 | 21 | 84.0% | 30 | 9 | 0 | 98 |
| 43 | 自在出发 | 进入 | 61 | 20 | 15 | 75.0% | 29 | 8 | 0 | 76 |
| 44 | 最后一个新转角 | 换路 | 19 | 6 | 4 | 66.7% | 37 | 2 | 1 | 27 |
| 45 | 熟悉的长路 | 展开 | 61 | 22 | 16 | 72.7% | 31 | 8 | 0 | 84 |
| 46 | 小结轻解 | 小挑战 | 19 | 6 | 5 | 83.3% | 47 | 2 | 2 | 31 |
| 47 | 收获一片畅通 | 释放 | 61 | 24 | 16 | 66.7% | 29 | 9 | 0 | 90 |
| 48 | 自在回响 | 长局回报 | 61 | 25 | 17 | 68.0% | 26 | 11 | 0 | 94 |
## 前七关的路径教学
1. **跟着弯道走**:箭头决定起步方向,棋子会沿弯轨自动转向。
2. **转一下,路会变**:转动底盘会换路,棋子和箭头留在原位。
3. **交叉处不换线**:交叉处不会换轨,沿同一条线找到出口。
4. **先解开这道弯**:先看谁挡住了路线,再决定消除或免费转盘。
5. **一弯接一弯**:跟过一两处弯道,接连解开棋子的出口。
6. **把弯路连起来**:盘面变大,仍然顺着每条弯轨逐一解开。
7. **沿着轨道看出口**:先看完整路线,再选择出口或免费转盘。
+39
View File
@@ -0,0 +1,39 @@
# 关卡版本
在游戏左上角打开选关窗口,通过“关卡版本”切换。首次打开默认使用 v0.3;选择其他版本后会记住选择。各版本有独立的上次选关位置与通关记录。切换时重新开始目标版本上次选择的关卡,不保存进行到一半的棋盘。
原始版本的设计理念、案例和逐关结构清单见 [v0.1 · 最初 24 关设计理念](v0.1-design-philosophy.md)。本文记录版本管理;两者共同为后续优化提供参照。
| 版本 | 内容 | 关数 | 章节 | 布局来源 |
| --- | --- | ---: | --- | --- |
| v0.1 · 最初设计 | 最初制作的完整关卡,保留名称、顺序、轨道、棋子和原离场额度 | 24 | 3 章 × 8 关 | `ef2724b` 的 `levels/campaign.json` |
| v0.2 · 直线较多版 | 扩展为 48 关时的设计,直线较多 | 48 | 8 章 × 6 关 | `70b021d` 的 `levels/campaign.json` |
| v0.3 · 弯轨观察版 | 当前的弯轨教学与观察版本 | 48 | 8 章 × 6 关 | `levels/campaign-seeds.json` 生成的当前主线 |
版本号指关卡布局。三版统一使用当前界面、碰撞检测、免费旋转、免费失败试路与撤销规则;没有恢复旧版代码或扣除旋转额度的规则。旧版文件的 `moveLimit` 原样保留,游戏主界面仍显示待解棋子数。JSON 内的 `version: 1` 是数据格式版本,与 v0.1 等布局版本号无关。
v0.1 的旧闭环与扫掠阻挡也原样保留,可以通过旋转和消除找到解答。24 关与 v0.2 的 48 关均已在当前引擎中求解并完整回放。v0.3 的“每关至少 65% 参考消除路径经过弯道”等发布门槛仅适用于该版,不套用于历史布局。
## 归档与生成
- `levels/versions/v0.1.json`、`v0.2.json` 是对应 Git 文件的原始字节,不重新序列化。
- `levels/versions/provenance.json` 记录来源完整提交、Git blob、SHA-256、字节数、关数与回放结果。
- `npm run levels:versions` 校验归档哈希,生成 `src/levels-archive.js`,供浏览器直接导入。
- `src/campaign-versions.js` 注册版本、章节、关卡模块与旧存档键;`src/levels.js` 继续暴露最新版本,供生成器、设计指南与 Cocos 示例使用。
- `npm run levels` 仅重新生成当前主线,再同步历史模块。`npm run build` 校验并同步历史模块,三版均进入静态站点。
后续发布新的布局版本时,先将当前主线与出处归档、登记哈希,再在注册表中添加新版本并更新默认版本。为新版本分配新的存档键,不复用旧版完成记录。历史归档保持不变;为历史布局改版应另发版本,不能直接覆盖。
## 进度隔离与迁移
版本选择保存在 `hex-trails-campaign-version`,各版进度保存在 `hex-trails-campaign-v0.1`、`hex-trails-campaign-v0.2`、`hex-trails-campaign-v0.3`。旧键仅在对应新键不存在时读取,写入新键,不删除或覆盖旧数据。
| 目标版本 | 对应旧存档键 |
| --- | --- |
| v0.1 | `hex-trails-v2` |
| v0.2 | `hex-trails-observe-v3-r1`(若存在),否则 `hex-trails-observe-v3` |
| v0.3 | `hex-trails-observe-v3-r2` |
v0.2 与 v0.3 内部关卡 ID 相同但布局不同,完成记录只按版本隔离,不能按 ID 合并。非法版本回到默认版本,越界关卡索引回到该版第一关,完成列表过滤越界值和重复值。浏览器不允许保存时,当前页面仍可切换并保留各版进度,刷新后无法保留。
自动测试验证历史文件与模块一致、72 关完整回放、版本数量与章节、默认选择、跨版本隔离、旧存档迁移与异常存储。Cocos 示例默认加载最新主线,本次未实现原生版本选择控件或完成原生实机验证。
+37 -3
View File
@@ -1,8 +1,10 @@
# HEX TRAILS 玩法方向与主线制作要求
版本:2026-09-08。本文用于关卡制作、生成器筛选与玩法验收,不规定美术样式。
版本:2026-09-09。本文用于关卡制作、生成器筛选与玩法验收,不规定美术样式。
当前方向是让喜欢轻松观察、逐步整理并获得连续反馈的玩家,在越来越丰富的棋盘上保持推进感。玩家偏好以观察行为、试路习惯和体验反馈描述,不按性别推断。48 关已通过生成器结构检查、完整解答回放与替代操作顺序测试;逐关记录见 [主线验收表](campaign-review.md)。这属于规则与结构验收,玩家体验和真实完成时长仍待真人测试。
适用范围:本文记录后续 48 关、尤其 v0.3 的制作方向。最初 24 关的设计理念另见 [v0.1 设计理念](v0.1-design-philosophy.md);本文的弯轨比例、无闭环及六拍门槛不代表原版要求。下一轮优化将对照原版结构讨论,本轮未改关卡。
当前方向是让喜欢轻松观察、逐步整理并获得连续反馈的玩家,在越来越丰富的棋盘上保持推进感。玩家偏好以观察行为、试路习惯和体验反馈描述,不按性别推断。9 月 9 日版通过[种子清单](../levels/campaign-seeds.json)重新编排全部 48 关,将真正经过弯道的成功离场路径作为制作核心;逐关结构记录见 [主线验收表](campaign-review.md)及[完整分析数据](../levels/campaign-analysis.json)。验收结论以当前清单重新生成的报告与测试输出为准,不能沿用旧关卡结果;玩家体验和真实完成时长仍待真人测试。
## 1. 核心循环
@@ -12,6 +14,8 @@
试路是学习规则的一部分。一次没有成功的尝试应帮助玩家理解阻挡原因,不能同时带来隐性的通关成本。主线不靠最后一枚棋子的隐藏闭环、路线之外的擦碰或连续无进展旋转制造困难。
玩家需要顺着实际将要走过的轨道观察出口。每一关都以弯轨消除为主,直线路径只作为少量节奏调剂,不安排纯直出关。空格上画了多少弯线不代表玩家真的需要读这些路线;没有被成功离场棋子使用的装饰性曲线不计入这一目标。
## 2. 免费尝试与计数语义
- 左转、右转免费,不扣步,也不因多转几次而失败。
@@ -39,6 +43,8 @@
增加底格数而没有增加有效内容,不算延长体验;增加棋子却把所有出口堵成唯一解,也不算舒缓长局。制作时应检查是否形成足够多的连续成功机会,以及玩家能否在若干局部区域之间自然选择。
当前种子清单的单关棋子数最多为 25。后期长局增加的是实际需要沿弯轨观察、解开的内容,不能只沿用更多直出棋子的数量目标。比较工作量时同时查看有效消除数量、真实离场路径的转弯与连续成功机会。
## 4. 48 关:8 章,每章 6 拍
主线按章节节奏编排,不按认知难度分数从低到高排序。每章允许自然回落;后期主要增加熟悉规则下的工作量,认知挑战上限不必随章节不断升高。
@@ -52,7 +58,21 @@
| 5 | 释放 | 明显低于上一关的认知负担,让出口、连续成功和自由选择重新变多。 |
| 6 | 长局回报 | 使用熟悉关系提供更长的整理过程;可以更大、更长,但不自动更难。 |
第 1 关要有直接可见的进展,完整解答不依赖旋转。它不承担识别闭环的教学任务。后续换路关再通过短而明确的因果关系介绍旋转。
第 1 关使用 37 格、8 枚棋子。开局朝向下全部棋子可直接离场,每枚成功路径恰好经过 1 处弯道,完整解答不依赖旋转或强制先后顺序。它教的是“箭头决定起步,弯轨决定后续转向”,不承担识别闭环的任务。“全部可离场”只描述开局朝向,不要求玩家转到任意朝向后也全部可出。
前 7 关的学习内容写入各关的 `lesson` 字段,并与实际参考路径一起验收:
| 关卡 | 学习重点 |
| --- | --- |
| 1 | 箭头决定起步方向,沿弯轨自动转向。 |
| 2 | 旋转底盘改变路线,棋子位置与箭头方向不动。 |
| 3 | 交叉处不换轨,沿同一条线找到出口。 |
| 4 | 看清阻挡关系,再决定先后消除或免费转盘。 |
| 5 | 跟过一两处弯道,获得舒缓的连续消除。 |
| 6 | 在更大棋盘上仍逐条解开实际弯轨路径。 |
| 7 | 先观察完整路线,再选择出口或免费转盘。 |
这些学习重点补充章节六拍,不改变小挑战后释放、再以长局回报收束的节奏。
第 5 关的释放应落实为结构差异,例如更多初始出口、更浅的依赖、更少的必要判断,不能只换一个轻松的名字。第 6 关应延长熟悉操作的愉快过程,不用反复试方向、难以解释的阻挡或长时间等待补足时长。
@@ -72,6 +92,12 @@
对每一枚初始棋子,分别在全部 6 个棋盘朝向下忽略其他棋子追踪独立路线。每条路线都必须离场,独立闭环数必须为 0。该要求覆盖主线所有章节,避免移除障碍后才发现最后一枚棋子一直绕圈。
### 真正使用弯轨
对参考解答逐步回放,只统计成功离场时实际走过的路线。每关至少 65% 的成功离场棋子经过 1 处或更多弯道,且这类棋子至少有 3 枚;完整回放的成功移除数应等于初始棋子数。
统计使用 `analyze().pathUsage`,不使用整张棋盘的弯线数量,也不以初始朝向忽略占用的路线统计替代真实回放。旋转会改变轨道,成功路径必须按每次实际消除时的棋盘朝向计算。单纯增加空白格上的曲线,或让绝大多数棋子从边缘直线离场,不能满足发布要求。
### 阻挡可以从路线解释
在已验证解答回放的每个决策状态,对所有剩余棋子的路线进行检查。阻挡对象必须位于该棋子的独立路线所经过的格子中,不能出现路线格子之外的侧面擦碰阻挡。
@@ -88,6 +114,12 @@
每关记录章节、节奏角色、底格数、棋子数、认知指标与工作量。完成 48 关的组内检查:小挑战之后确有释放,长局回报的工作量增长没有被等量的认知负担增长抵消。这里要求的是候选结构和回放验证,玩家的实际感受仍需后续测试。
### 来源与可重复验证
`levels/campaign-seeds.json` 保存全部 48 关的种子与生成参数,是主线布局的制作来源;不能只编辑生成后的 `campaign.json`。修改清单后运行 `npm run levels`,同步关卡、共享模块与报告,再运行测试。
`levels/campaign-analysis.json` 中每关的 `pathUsage` 记录真实参考成功路径,包括直出/弯轨棋子数、弯轨比例、单弯/多弯数量、总转弯、最长连续直出段,以及逐棋子的路径明细。前 7 关还应核对 `lesson` 是否被实际动作支持。报告记录的是参考解答,不是穷尽玩家所有任意旋转和点击顺序。
## 6. 内部时长假设
当前仅用下式比较候选的潜在体验长度:
@@ -98,6 +130,8 @@
`N` 是初始棋子数;总转弯数采用当前分析器对初始朝向、忽略占用时各棋子独立路线的转弯数求和;最少旋转数来自规则求解器。各系数都是内部制作假设,尚未经过真人用时标定。
上述总转弯口径与 `pathUsage.totalBends` 的实际参考成功路径口径不同,不得混用。后者用于验证弯轨体验与阅读负担,前者仍是现行估时公式的输入;即使弯轨比例达到发布要求,也不能据此宣称真人体验时长已增加。
该结果不是玩家平均通关时长、完成承诺或难度分数。它没有完整模拟玩家的扫描速度、主动停顿、错误尝试、动画等待、提示使用与设备差异。大棋盘的估计数值更高,只能说明当前结构模型认为工作量更大,不能据此宣称玩家一定会玩得更久或更开心。
候选尚未确认可解、出现独立闭环或搜索未确定时,不应将估时作为可发布关卡的数据。公式调整时保留版本,避免把不同计算口径下的数字当作体验提升证据。
+26
View File
@@ -66,10 +66,34 @@ minimumActions = N + R // 最少交互数:消除 + 旋转
基础生成器在碰撞规则下逆向放入可离场棋子,主线编排在候选基础上进行独立筛选与回放。主线制作规模为 48 关、8 章,每章 6 拍:进入、换路、展开、小挑战、释放、长局回报。顺序不按认知难度非递减排序,也不再要求每一关都必须旋转。
9 月 9 日版的全部布局由 `levels/campaign-seeds.json` 中的种子及 `options` 明确指定;`scripts/generate-levels.mjs` 据此生成关卡、共享模块和验收数据。修改种子或参数后运行 `npm run levels`,不要直接编辑派生的关卡文件。参考成功路径统计保存在 `levels/campaign-analysis.json` 的逐关 `pathUsage` 中。
`minBaseTurns` / `maxBaseTurns` 限制逆向放置时的基准朝向,`startRotation` 在此之后施加。发布门槛另按最终朝向的真实参考解答统计,不能把基准朝向的参数当成旋转后的路径保证。
大棋盘用于增加熟悉规则下的工作量:早期就可使用 37 格,后期舒缓关采用 61 格,19 格也可承载较难的局部关系。小挑战后必须有认知负担回落,长局回报不能仅靠更复杂的路线或反复空转延长时间。
当前清单单关最多 25 枚棋子,长局的工作量来自更多实际弯轨消除,不以直出棋子数量或空白格上的弯线充数。每关参考解答至少 65% 的成功离场棋子经过弯道,且至少 3 枚;直线只作少量调剂,主线不安排纯直出关。
第 1 关为 37 格、8 枚棋子,开局全部可离场,参考解答每枚恰好经过 1 处弯道,无需旋转或强制先后顺序;这不意味着转到任意朝向后仍全部可出。前 7 关通过 `lesson` 字段依次明确:箭头起步与弯轨转向、旋转换路而棋子箭头不动、交叉不换轨、阻挡先后、一两弯的舒缓消除、大盘连续解路径、完整路线观察。对应制作说明见 [前期学习与章节节奏](gameplay-direction.md)。
发布要求包括:每枚棋子在 6 个朝向下忽略占用的独立路线均无闭环;参考解答全程排除路线格外擦碰阻挡;换路和小挑战关在参考解答中最多连续旋转 1 次就打开下一次消除进展。它们是候选发布门槛,不能用来代替实际生成结果或玩家验收。完整制作方向见 [玩法方向](gameplay-direction.md),生成后逐关核对 [主线审阅报告](campaign-review.md)。
## 实际参考路径使用量
`solutionPathUsage(level, actions)` 按参考动作回放旋转和成功移除,在每次移除时调用同一 `trace()` 读取实际离场路径。它忽略没有成功离场的尝试,不统计棋盘上未使用的装饰曲线;正式通过验收的完整解答还必须满足 `pathUsage.removals === N`。
| `pathUsage` 字段 | 含义 |
| --- | --- |
| `removals` | 参考解答中的成功移除数量 |
| `curvedRemovals` / `straightRemovals` | 经过至少 1 处弯道 / 没有经过弯道的成功棋子数 |
| `curvedRatio` | `curvedRemovals / removals`;主线要求至少 0.65 |
| `singleBendRemovals` / `multiBendRemovals` | 实际经过恰好 1 处 / 多于 1 处弯道的成功棋子数 |
| `totalBends` / `maxBends` | 全部实际成功路径的总转弯数 / 单枚最大转弯数 |
| `maxConsecutiveStraight` | 参考解答中连续直出棋子的最长段落 |
| `paths` | 逐棋子的 `id`、`bends` 和路线步骤数 `cells` |
弯轨门槛同时检查 `curvedRatio >= 0.65` 与 `curvedRemovals >= 3`。它约束参考解答中真正发生的消除,不证明所有其他操作顺序具有相同比例。初始独立路线的平均转弯数也不能替代这个指标,尤其是必须先旋转才有出口的关卡。
## 认知难度(0–100)
`analyze()` 的分数只估计路线阅读与依赖判断,不直接给棋盘面积、棋子数或试错预算加分。设:
@@ -105,4 +129,6 @@ estimatedSeconds = round(3 × N + 0.75 × 总转弯数 + 4 × R)
总转弯数是初始朝向下、忽略占用的各棋子独立路线转弯数之和。该公式仅为内部制作假设,没有真人用时数据支撑,不能称为平均通关时长或向玩家承诺的完成时间。搜索未确定或关卡不可解时,不应将其作为可发布关卡的估时。
此处总转弯数与 `pathUsage.totalBends` 口径不同:前者是初始独立路线,后者是逐步旋转后真正成功走过的参考路径。两者应分别保留,不将弯轨覆盖率、增加的路线内容或最多 25 枚棋子的规模直接换算成已验证的真人时长。
后续测试应观察主动停顿、成功消除间隔、旋转到下一次成功的间隔、失败试路原因、最后一枚棋子阶段,以及提示、撤销和重开的发生位置;明确区分观察停顿、动画占用和离开游戏的时间,再校准认知评分与工作量估计。
File diff suppressed because it is too large Load Diff
+235
View File
@@ -0,0 +1,235 @@
# v0.1 · 最初 24 关的设计理念
**原始 24 关围绕“旋转换路、逐层让路、解开交织轨道”组织体验。** 玩家先找出当前能离场的棋子,移开它们改变占用关系,再通过旋转底盘改变路线,逐步把整盘解开。每一次操作都应能让玩家理解后续条件发生了什么变化。
这是对原始实现的设计归纳。本文以初始提交 `ef2724b` 的说明、生成器、规则、测试及原始 24 关布局为依据,记录已实现的结构与可继承的理念,供后续关卡优化对照。本次只整理文档和分析证据,未修改任何版本的关卡。
## 1. 先明确原版的核心体验
原版让玩家处理三个互相影响的问题:
1. **路线问题:** 这枚棋子从箭头方向出发,沿途会走到哪里?
2. **空间问题:** 它的整个身体能否通过?需要先移开哪一枚棋子?
3. **朝向问题:** 当前路线走不通,底盘换一个朝向后,哪些出口和阻挡关系会改变?
核心体验可以归纳为:**看懂关系 → 找到突破口 → 让局面松开 → 换一个朝向继续解。** 其中“局面松开”既可以来自移走障碍,也可以来自重新接通轨道。长路径的成功离场,则把之前逐步清理的结果展示出来。
原版采用轻量点击与 60° 整盘旋转,规则动作少,但同一套轨道与棋子会形成多阶段关系。以下章节将“历史明确规定”“布局中实际存在的结构”“本次体验解释”分别说明,不把后来的制作标准反写为原始要求。
## 2. 六项设计支柱
### 2.1 旋转承担解题作用
**历史事实:** 生成器会剔除不需要旋转的候选,原测试也要求每一关在不旋转时无法清空。24 关全部至少需要 1 次旋转;其中 12 关需要 1 次、8 关需要 2 次、4 关需要 3 次。
旋转时,上层棋子的位置和箭头保持不变,下层的格子位置与轨道连接整体变化。玩家重新判断的是路线、出口和阻挡,而不只是观看盘面转动。
**设计归纳:** 旋转是关卡内容的一部分,应与当前清场状态发生联系。原版存在“清掉一批,再换路”的阶段,也存在“转过去移走一个关键棋子,再转回来”的结构。后者说明同一个朝向在不同占用状态下会产生不同的解题机会。
### 2.2 棋子之间存在可推演的让路关系
**历史事实:** 最初 24 关开局合计 404 枚棋子,只有 125 枚可以直接离场,约占 30.9%。每关都有可行开局,但都无法仅靠初始朝向一路清空。参考解答包含 3–13 个消除批次。
这里的“批次”指求解器在一个状态下找到的全部可离场棋子;移除这批后,再寻找下一批。它是结构指标,不能当作玩家必须严格执行的唯一点击顺序,也不等于真人思考次数。
**设计归纳:** 棋子的价值同时来自自身路线和它为其他棋子占据的空间。一个容易移走的棋子也可能承担关键的让路作用。玩家的收获包含“原来移走它,就能放出后面这一串”。
原求解器依赖一个重要性质:安全移走棋子只会减少障碍,不会凭空破坏其他路线。因此,关系可以复杂,但并不要求玩家担心一次合法消除永久毁掉关卡。关卡可以有多种安全操作顺序。
### 2.3 判断完整的移动空间
**历史明确规定:** 棋子整个顶面参与连续碰撞检测,路径经过的格子为空,也可能在转角或经过相邻格之间时擦到另一枚棋子。交叉轨道不会自动换线,颜色不参与解题规则。
**布局事实:** 原版 24 关均有初始侧擦阻挡,共涉及 119 枚棋子。此处统计的是:实际发生阻挡,但阻挡棋子所在格不属于移动棋子的独立中心路线所经过的格子。
**设计归纳:** 玩家既要读线,也要判断棋子的宽度和通行空间。这里产生的是空间关系题。后续表现可以把接触位置和阻挡对象解释得更清楚;是否保留某类侧擦结构,需要结合可读性讨论,不能把“碰撞规则存在”和“所有擦碰都容易看懂”混为一谈。
### 2.4 短出口、让路棋子与长绕行共同组成内容
**历史事实:** 原生成器给候选路径的经过格数加权,偏向更长的路线;它并没有“每关至少多少比例经过弯道”的要求。固定原引擎回放 24 关,404 次成功消除中有 227 次经过弯道,占 56.2%;其余是直出。最长一条成功路径有 16 次转弯。
直出与弯轨在原版中共同工作。容易离场的外围棋子可能先释放空间;更深处的路线在障碍移开和朝向变化后才可贯通。不能仅从一枚棋子自身走得短,就判定它没有解题作用。
**设计归纳:** 需要关注“这条路线怎样参与整盘关系”。弯道数量可以描述阅读量,但无法单独代表旋转价值、解锁关系或阶段变化。原版长绕行所带来的观察内容,也不能用大量彼此独立的单弯路径完全替代。
### 2.5 同一盘面可以经历多个解题阶段
原版允许当前朝向下出现无法直接离场的状态,只要可以通过后续旋转完成。初始独立路线中共有 6 个闭环,分别出现在第 1、6、7、16、20、21 关。
其中第 1 关“清到最后一枚后,它的路线仍为闭环,向右转一次后离场”被明确写入历史测试。闭环在初始独立路线中就已存在,移除棋子不会让轨道新形成闭环。第 22 关的参考解还包含“转一次仍无出口,再转一次才有出口”的阶段。原版没有要求每一枚棋子在所有六个朝向下都能独立离场,也没有承诺每次必要旋转立刻获得出口。
**设计归纳:** 局部走不通可以构成换路理由,阶段之间可以有关联。但这种状态也可能使玩家不理解最后一枚为何走不了,需要清楚的路线反馈。闭环是否适合第一关、连续旋转如何给出线索,属于后续教学和反馈问题;原版存在这些结构,不等于必须原样复制它们的呈现缺点。
### 2.6 后期加深关系,盘面体量较早稳定
**历史事实:** 首章混合 19 格与 37 格,第 5、8 关已使用 37 格;第二、三章均为 37 格。最大棋子数出现在第 15 关,共 24 枚;最终关为 18 枚。第三章的全部关卡需要 2–3 次旋转。
**设计归纳:** 原版后期主要增加需要追踪的关系、绕行程度与旋转阶段。相同大小的盘面可以逐渐表达更复杂的题目,关卡体量不必不断增长。规模、空间密度、路线长度和关系深度应分别说明。
## 3. 用原关卡理解这些原则
### 第 1 关:先让路,再理解旋转换路
19 格、5 枚棋子,历史分数 25。以原数据 ID 标识棋子,参考解如下;ID 仅方便设计师在数据和工坊中核对。
| 阶段 | 实际状态 | 所表达的关系 |
| --- | --- | --- |
| 开局 | `t0`、`t2`、`t4` 可离场;`t1` 被 `t0` 挡住 | 有明确入口,同时有一层让路关系 |
| 先清理 | 移走开局可行棋子,`t1` 获得出口 | 成功消除改变其他棋子的条件 |
| 剩最后一枚 | `t3` 在这个朝向的独立轨道是闭环 | 清空障碍后,路线问题仍需处理 |
| 向右转 60° | `t3` 获得出口,随后离场 | 旋转改变路线,完成整关 |
这关把“让路”与“换路”放在同一局里。最初版本的教学重点包含旋转的必要性。如今 v0.3 第 1 关的“8 枚全可走、各转一个弯”则承担另一种教学目标:认识沿轨转向。两者的结构功能不同。
### 第 17 关:回到原朝向,局面已经不同
20 枚棋子,最少需要 2 次旋转。参考解先清理到剩余 5 枚,再出现以下过程:
```mermaid
flowchart LR
A[原朝向:剩 5 枚,无出口] -->|向右转 60°| B[t1 获得出口]
B -->|移走 t1| C[剩 4 枚,当前无出口]
C -->|向左转 60°| D[回到原朝向,t0 获得出口]
D --> E[继续逐步清空]
```
这一例最能表达旋转与消除的相互作用:回到同一个朝向不等于回到同一个局面,因为棋子的占用已经变化。解题对象是“朝向与剩余棋子共同构成的状态”。
### 第 24 关:在固定体量中分阶段解开长路
37 格、18 枚棋子,历史分数 75。参考解先移走 7 枚,随后经历三次向右旋转;三次旋转分别发生在剩余 11、9、6 枚时。每一阶段先处理当时打开的出口,再继续换路。
最后一段中出现 12、13、14、15 次转弯的成功路径。这些长路径与先前清场、换路形成连续关系。最终关的棋子数少于第 15 关,却包含更多旋转阶段与更长的绕行,说明原版高潮来自关系组合。
## 4. 原始章节与难度递进
历史地图分为三章,每章 8 关。原版整体按旧评分非递减排列,没有后来的“挑战—释放—长局回报”六拍结构。
| 章节 | 历史分数 | 实际盘面 | 最少旋转 | 平均消除批次 | 开局可离场比例逐关均值 |
| --- | --- | --- | --- | ---: | ---: |
| 转盘初体验(1–8) | 25–49 | 19 / 37 格 | 1–2 次 | 5.75 | 40.6% |
| 糖果回旋(9–16) | 50–59 | 37 格 | 1–2 次 | 8.63 | 30.8% |
| 碰撞大挑战(17–24) | 60–75 | 37 格 | 2–3 次 | 10.38 | 27.3% |
上述逐关比例均值与全体棋子的加权比例 30.9% 使用不同口径。批次数也是参考解的结构信息;这些数字支持“后期关系更深、初始选择比例更少”的归纳,不能据此宣称已经验证玩家感到更有趣或更流畅。
章节名称提供了体验主题,但原制作过程主要是程序生成、可解性筛选和评分排序。没有证据证明 24 关最初就有逐关人工编写、逐项隔离新机制的教学剧本。本文的案例解读是对已存在结构的整理。
## 5. 原版怎样生成与筛选关卡
1. 为六边形格子随机生成完整的六端口配对,保持轨道连续和交叉不换线规则。
2. 逆向插入棋子:新加入的棋子必须能在已有棋子存在时先离场,以建立可解布局。
3. 候选位置和方向按随机项与经过格数加权,从靠前候选中抽取,让盘面保留变化与绕行。
4. 将初始底盘旋转 1–3 次,重新求解,剔除不可达以及无需旋转即可完成的候选。
5. 按旧步数规则,为最短解之外留出一定余量,再计算难度。
6. 按评分排序,选取 24 关,并使用完整动作序列回放验证。
生成脚本中的目标棋子数不是最终棋子数:逆向插入可能提前停止。原始脚本给 37 格候选设置过 16–33 枚的目标范围,但实际发布的 24 关最多 24 枚。解释已发布版本时,以归档布局为准。
原版的硬要求是:**规则一致、确实可解、每关必须旋转、整体评分递进。** 弯路覆盖率、六朝向全部无闭环、参考决策状态不许侧擦、相邻消除间最多一次旋转,都不是当时的发布标准。
## 6. 历史评分与尝试成本
原评分同时考虑以下六项:
| 因素 | 上限 | 原始意图或作用 |
| --- | ---: | --- |
| 棋子规模 | 15 | 用棋子数量粗略描述处理量;没有直接按棋盘面积加分 |
| 平均转弯 | 20 | 描述初始朝向下、忽略占用的路线追踪量 |
| 解锁层数 | 20 | 描述参考解的分批释放过程 |
| 初始阻塞 | 15 | 可立即离场的选择越少,分数越高 |
| 必要旋转 | 20 | 将换路需求作为重要的挑战来源 |
| 步数压力 | 10 | 可用步数越接近最短解,容错越少 |
历史最短步数是“棋子数 + 最少旋转数”。当时成功点击、失败试路和旋转都扣步,实际关卡在最优解以外留有 2–7 步余量。撤销恢复状态,没有倒计时。
这些是历史实现事实。**当前已经采用的免费旋转、免费失败试路规则继续有效;整理原版理念不构成恢复扣步惩罚的决定。** 旋转是否免费,与关卡是否需要玩家判断何时换路,是可以分别设计的两个问题。
同样,原版把规模和尝试压力计入难度,也不意味着后续必须恢复旧公式。保留清晰的空间与路线关系,可以与规模、工作量分开计量以及起伏式节奏同时成立。原评分从未经过真人通关率校准,不能被当作客观心理难度。
## 7. 后续两版具体改变了什么
下表统一使用固定的原始引擎复算,以隔离后续评分和碰撞实现变化。布局来源及哈希见[分析证据](v0.1-design-evidence.json)。后两版的参考回放使用充足额度,只比较路线结构;不将旧扣步规则重新应用到现行玩法。
| 结构指标 | v0.1 原始 24 关 | v0.2 直线较多版 | v0.3 弯轨观察版 |
| --- | ---: | ---: | ---: |
| 必须旋转才能完成 | 24 / 24 关 | 16 / 48 关 | 16 / 48 关 |
| 参考消除批次数范围 | 3–13 | 1–5 | 1–6 |
| 初始可离场棋子占全部棋子比例 | 30.9% | 38.6% | 44.8% |
| 成功消除路径经过弯道的比例 | 56.2% | 7.0% | 75.1% |
| 每条弯轨成功路径的平均转弯数 | 3.75 | 1.45 | 1.25 |
这些结果说明:v0.2 明显增加了宽松直出;v0.3 增加了真实弯轨路径,但这些弯轨平均更短,必须换路的关卡占比和分批释放层次仍低于原版。**弯道占比提高,不能单独证明原来的解谜关系已经恢复。**
后续制作还采用了全六朝向独立路线无闭环、参考决策状态排除侧擦、限制连续无进展旋转等筛选。这些要求着眼于减少难以解释的反馈,也同时缩小了可用的空间和换路结构。后续优化需要分别审视可读性、关系深度和舒缓节奏,不能用一个“更好走”的条件替代全部目标。
这里记录的是设计方向的变化及结构证据,没有真人通关率或体验数据来决定哪组数值最优。
## 8. 留给下一轮优化的对照基准
以下是基于原版整理的检查问题,供下一轮逐关讨论,不是本轮自动执行的新生成门槛。
| 要保留的设计价值 | 评审时应能说明 |
| --- | --- |
| 旋转有解题意义 | 哪个局面需要换路?转动后改变了谁的出口或阻挡? |
| 移除会改变局面 | 哪些棋子承担让路作用?它们离场后释放了什么? |
| 路线承担实际内容 | 短出口与长绕行各自负责什么?弯道是否参与后续关系? |
| 同一盘面有阶段 | 清理、换路、继续清理之间如何关联?是否存在值得理解的状态变化? |
| 空间关系可读 | 玩家能否解释真实接触位置?反馈不足时,应改表现还是改布局? |
| 难度可控 | 这一关主要增加的是关系深度、路线追踪、选择压力,还是工作量? |
需要在下一轮另行确定的内容包括:每关必转是否保留为全局要求,教学和舒缓关如何例外;闭环和连续旋转在什么条件下适用;碰撞可读性如何改进;长路线如何兼顾观察与动画节奏;原有解题结构怎样融入后续的大盘和起伏节奏。
免费旋转、免费失败试路,以及已经恢复的三版独立关卡与进度保持现状。后续可在此基准上优化并发布新版本,原始 24 关归档继续保留。
## 9. 原始 24 关结构清单
“开局可走”表示初始朝向下真实无碰撞离场的数量;“批次”来自原求解器参考解;“旧分数”用原评分重算,不能与当前界面分数直接比较。
| 关 | 名称 | 格数 | 棋子 | 开局可走 | 必要旋转 | 消除批次 | 旧分数 |
| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: |
| 1 | 转一转,路就通了 | 19 | 5 | 3 | 1 | 3 | 25 |
| 2 | 换个方向 | 19 | 6 | 3 | 1 | 4 | 31 |
| 3 | 弯道别碰头 | 19 | 12 | 6 | 2 | 5 | 38 |
| 4 | 给我让条路 | 19 | 13 | 5 | 1 | 8 | 44 |
| 5 | 粉色回旋 | 37 | 16 | 5 | 1 | 5 | 45 |
| 6 | 蓝色小径 | 19 | 12 | 3 | 1 | 8 | 47 |
| 7 | 向左看齐 | 19 | 11 | 4 | 2 | 7 | 49 |
| 8 | 转角遇见光 | 37 | 18 | 6 | 1 | 6 | 49 |
| 9 | 第一圈冒险 | 37 | 18 | 7 | 1 | 9 | 50 |
| 10 | 旋转甜甜圈 | 37 | 21 | 8 | 1 | 8 | 51 |
| 11 | 差一点擦肩 | 37 | 18 | 6 | 1 | 8 | 52 |
| 12 | 紫色回廊 | 37 | 19 | 6 | 1 | 9 | 53 |
| 13 | 再转一次 | 37 | 20 | 5 | 1 | 9 | 54 |
| 14 | 绕开拥挤 | 37 | 17 | 5 | 2 | 8 | 55 |
| 15 | 小心翼翼 | 37 | 24 | 5 | 1 | 11 | 57 |
| 16 | 别挤在一起 | 37 | 17 | 5 | 2 | 7 | 59 |
| 17 | 糖果交响曲 | 37 | 20 | 7 | 2 | 9 | 60 |
| 18 | 盘旋之间 | 37 | 21 | 7 | 2 | 12 | 61 |
| 19 | 左右逢源 | 37 | 17 | 4 | 2 | 8 | 62 |
| 20 | 寻找缝隙 | 37 | 21 | 7 | 3 | 10 | 66 |
| 21 | 回转大挑战 | 37 | 20 | 5 | 3 | 10 | 68 |
| 22 | 紧密相连 | 37 | 21 | 4 | 3 | 13 | 68 |
| 23 | 终极转盘 | 37 | 19 | 4 | 2 | 11 | 69 |
| 24 | 六角大满贯 | 37 | 18 | 5 | 3 | 10 | 75 |
## 10. 来源、复算方法与边界
- 原始布局:[v0.1.json](../levels/versions/v0.1.json),404 枚棋子,24 关;与 `ef2724b` 中的 `levels/campaign.json` 字节一致。
- 归档出处:[provenance.json](../levels/versions/provenance.json),记录完整提交、文件哈希与旧布局回放。
- 本次证据:[v0.1-design-evidence.json](v0.1-design-evidence.json),记录原引擎来源哈希、三版布局哈希、24 关开局状态、参考动作、旋转前后出口、消除批次与实际成功路线。
- 复算脚本:[analyze-v01-design.mjs](../scripts/analyze-v01-design.mjs)。运行 `node scripts/analyze-v01-design.mjs`;需要本地保留初始 Git 提交。脚本在临时目录加载历史引擎,仅输出证据 JSON,不改游戏规则或关卡。
历史源文件均以 `ef2724b` 为准,可通过 `git show ef2724b:文件路径` 查阅:
| 历史路径 | 主要依据 |
| --- | --- |
| `README.md`,21–27 行 | 路径、旋转、碰撞、尝试成本及全部关卡必须旋转 |
| `docs/video-analysis.md`,3–9 行 | 区分视频观察、补充规则与项目实现约定 |
| `docs/level-design.md`,34–72 行 | 旋转、连续碰撞、求解生成、旧评分及未做玩家标定的说明 |
| `scripts/generate-levels.mjs`,6–18 行 | 候选规模、初始旋转、必须旋转筛选、余量、排序与选关 |
| `src/core.js`,136–214 行 | 求解状态、消除批次、评分及逆向生成 |
| `src/app.js`,21–26 行 | 三章与每章八关 |
| `tests/core.test.js`,31–33、99–103 行 | 全 24 关验收,以及首关最后一枚闭环后旋转完成的预期行为 |
本文没有把参考视频中的遮挡轨道当作已完整复原的数据,也没有把生成规则推测成全部来自原视频。参考解答并非所有玩家顺序;统计描述结构,不代表真人体验已经验证。文中关于“让路”“阶段换路”“长路回报”的表达,是依据历史规则和回放所做的设计解释。