feat: expand campaign and refine puzzle visuals and controls

This commit is contained in:
cabinw
2026-09-09 11:02:45 +08:00
parent 9f8990b579
commit 70b021d4cc
66 changed files with 41108 additions and 10553 deletions
+58
View File
@@ -0,0 +1,58 @@
# 主线关卡验收与节奏表
自动生成:`npm run levels`。共 48 关,8 章,每章顺序为进入、换路、展开、小挑战、释放、长局回报。认知难度与棋盘规模分别记录。
全部关卡:可解且回放通关;每枚棋子在全部六朝向独立路线无闭环;参考解答无路线格外擦碰阻挡;相邻消除之间最多连续旋转一次。参考解答检查不等于穷尽玩家的任意旋转顺序,实际阻挡对象会在游戏中标记。
**预计时长只用于内部比较,没有真人测试数据。** 公式为 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 -1
View File
@@ -36,7 +36,7 @@ hex-trails/
4. `levelIndex` 选择内置关卡,或把单关 JSON 赋给 `levelAsset`。
5. 按钮绑定 `rotateLeft()`、`rotateRight()`、`undo()`、`restart()`、`hint()`。
6. 监听 `trail-state`,更新步数、剩余棋子、朝向、胜负和忙碌状态。监听 `trail-hint-rotation` 高亮对应旋转按钮;`trail-blocked` 可接声音/震动。
7. 按 `THEME.background` 设置纯色背景;当前主界面只保留居中的 Level、其下方的剩余步数,以及左侧选关、右侧设置。按钮与面板使用下述图片皮肤,动态文字与布局使用 Label、Button、Layout、Widget、EditBox、ScrollView 等节点搭建。原生端不需要 WebView。
7. 按 `THEME.background` 设置纯色背景;当前主界面只保留居中的 Level、其下方的待解棋子数量,以及左侧选关、右侧设置。按钮与面板使用下述图片皮肤,动态文字与布局使用 Label、Button、Layout、Widget、EditBox、ScrollView 等节点搭建。原生端不需要 WebView。
## 坐标与动画
+120
View File
@@ -0,0 +1,120 @@
# HEX TRAILS 玩法方向与主线制作要求
版本:2026-09-08。本文用于关卡制作、生成器筛选与玩法验收,不规定美术样式。
当前方向是让喜欢轻松观察、逐步整理并获得连续反馈的玩家,在越来越丰富的棋盘上保持推进感。玩家偏好以观察行为、试路习惯和体验反馈描述,不按性别推断。48 关已通过生成器结构检查、完整解答回放与替代操作顺序测试;逐关记录见 [主线验收表](campaign-review.md)。这属于规则与结构验收,玩家体验和真实完成时长仍待真人测试。
## 1. 核心循环
**观察 → 改变 → 得到可解释的反馈 → 再观察。**
玩家先辨认一个可能的出口,再点击棋子或旋转棋盘改变路线。成功时,棋子离场,剩余工作量减少;被挡时,移动棋子到达可理解的接触位置,与阻挡棋子产生明确反馈并返回。旋转后应能观察到路线或可行选择的变化。
试路是学习规则的一部分。一次没有成功的尝试应帮助玩家理解阻挡原因,不能同时带来隐性的通关成本。主线不靠最后一枚棋子的隐藏闭环、路线之外的擦碰或连续无进展旋转制造困难。
## 2. 免费尝试与计数语义
- 左转、右转免费,不扣步,也不因多转几次而失败。
- 失败试路免费,不扣步,不移动棋子的模型位置;可另行记录尝试次数用于内部分析。
- 每次成功移除一枚棋子计 1 次有效消除。
- 主线初始预算设为棋子数 `N`。此预算只表示还需要完成多少次有效消除,不是限制尝试的资源。
- 主线中,成功移除 `k` 枚后,剩余量应为 `N-k`;旋转、阻挡尝试与其他未成功的探路行为不改变它。
- 当前朝向没有可离场棋子,不应直接判负。旋转仍是可用的探索方式。
- 撤销应恢复真实的棋盘状态与对应计数,重开恢复原始关卡。
界面和关卡文案应传达剩余工作量,避免让玩家以为每次观察性尝试都会消耗通关机会。自定义关卡的数据兼容规则单独处理,不能反向成为主线的旋转限制。
## 3. 规模、认知难度与体验长度分开制作
| 维度 | 回答的问题 | 主要依据 |
| --- | --- | --- |
| 棋盘规模 | 可操作的空间有多大? | 底格数、棋子数、占用率与区域分布 |
| 认知难度 | 找到下一步需要想多少? | 路线转弯、最长路线、可行选择比例、依赖关系与必要旋转判断 |
| 工作量 | 需要完成多少次有效动作? | 待移除棋子数、解答动作数、需要经过的路线量 |
| 体验长度估计 | 哪些候选可能更长? | 内部结构估计,后续由实测校准 |
认知难度不加入棋盘面积或棋子数量的直接加分项,也不加入免费尝试的步数压力。同样的规则可以放在更大棋盘上延长体验,不需要同步增加路线复杂度、堵塞比例和依赖深度。
早期就可使用 37 格棋盘,让玩家较早体验完整的整理过程。后期舒缓关可使用 61 格棋盘,提供更多熟悉而顺畅的消除。19 格小棋盘也可以承担较难的局部判断;它的挑战来自关系清楚但需要思考,不来自体积。
增加底格数而没有增加有效内容,不算延长体验;增加棋子却把所有出口堵成唯一解,也不算舒缓长局。制作时应检查是否形成足够多的连续成功机会,以及玩家能否在若干局部区域之间自然选择。
## 4. 48 关:8 章,每章 6 拍
主线按章节节奏编排,不按认知难度分数从低到高排序。每章允许自然回落;后期主要增加熟悉规则下的工作量,认知挑战上限不必随章节不断升高。
| 章内位置 | 节奏角色 | 制作意图 |
| --- | --- | --- |
| 1 | 进入 | 明显可行的开局,帮助玩家恢复观察节奏;可以有较大的盘面。 |
| 2 | 换路 | 用一次清楚的旋转或路线变化引出新进展,不堆叠多个新要求。 |
| 3 | 展开 | 扩展已经理解的关系,增加可连续处理的棋子和局部区域。 |
| 4 | 小挑战 | 章内认知峰值,可采用较小棋盘集中表达先后关系或一次必要旋转。 |
| 5 | 释放 | 明显低于上一关的认知负担,让出口、连续成功和自由选择重新变多。 |
| 6 | 长局回报 | 使用熟悉关系提供更长的整理过程;可以更大、更长,但不自动更难。 |
第 1 关要有直接可见的进展,完整解答不依赖旋转。它不承担识别闭环的教学任务。后续换路关再通过短而明确的因果关系介绍旋转。
第 5 关的释放应落实为结构差异,例如更多初始出口、更浅的依赖、更少的必要判断,不能只换一个轻松的名字。第 6 关应延长熟悉操作的愉快过程,不用反复试方向、难以解释的阻挡或长时间等待补足时长。
每章不要求所有关卡都必须旋转。进入、展开、释放和长局回报允许最少旋转数为 0。判断一个关卡是否适合当前节奏,应同时查看认知指标与工作量,而不是让较大棋盘天然获得更高难度标签。
## 5. 发布硬门槛
以下条件在生成候选后执行,并保存可重复验证的结果;任一必要检查未完成时,候选不能记为已验收。
### 规则与可解性
1. 关卡通过数据校验,旋转时棋子与底格关系保持有效,六次旋转恢复原始轨道状态。
2. 旋转和失败试路不扣主线预算;成功移除扣 1;完整回放后全部棋子离场。
3. 求解结果必须确认可达终局。触及搜索上限只能记为“未确定”,不能用作可解性通过证据。
### 不出现隐藏闭环
对每一枚初始棋子,分别在全部 6 个棋盘朝向下忽略其他棋子追踪独立路线。每条路线都必须离场,独立闭环数必须为 0。该要求覆盖主线所有章节,避免移除障碍后才发现最后一枚棋子一直绕圈。
### 阻挡可以从路线解释
在已验证解答回放的每个决策状态,对所有剩余棋子的路线进行检查。阻挡对象必须位于该棋子的独立路线所经过的格子中,不能出现路线格子之外的侧面擦碰阻挡。
这项检查不能只查看最终选中的成功移除路线,因为成功路线本来就没有阻挡,无法揭示其他可点击棋子的意外碰撞。每个 `blocked` 结果还必须指向真实存在且不是自身的棋子,并提供有效接触位置,供动画展示同一个阻挡原因。
### 旋转后立即出现进展
换路关和小挑战关的已验证解答中,相邻有效消除之间最多出现 1 次连续旋转。安排为必要步骤的这次旋转必须打开至少一个可消除选择,不能要求玩家先做一次没有进展的旋转,再猜第二次方向。
免费旋转不等于每个任意方向都保证成功,但正式解答和教学顺序必须有清晰因果。发布时同时检查旋转动画与模型更新一致,下一次点击使用旋转后的实际轨道。
### 节奏与计量
每关记录章节、节奏角色、底格数、棋子数、认知指标与工作量。完成 48 关的组内检查:小挑战之后确有释放,长局回报的工作量增长没有被等量的认知负担增长抵消。这里要求的是候选结构和回放验证,玩家的实际感受仍需后续测试。
## 6. 内部时长假设
当前仅用下式比较候选的潜在体验长度:
```text
估计秒数 = 3 × N + 0.75 × 总转弯数 + 4 × 最少旋转数
```
`N` 是初始棋子数;总转弯数采用当前分析器对初始朝向、忽略占用时各棋子独立路线的转弯数求和;最少旋转数来自规则求解器。各系数都是内部制作假设,尚未经过真人用时标定。
该结果不是玩家平均通关时长、完成承诺或难度分数。它没有完整模拟玩家的扫描速度、主动停顿、错误尝试、动画等待、提示使用与设备差异。大棋盘的估计数值更高,只能说明当前结构模型认为工作量更大,不能据此宣称玩家一定会玩得更久或更开心。
候选尚未确认可解、出现独立闭环或搜索未确定时,不应将估时作为可发布关卡的数据。公式调整时保留版本,避免把不同计算口径下的数字当作体验提升证据。
## 7. 后续玩家测试
先验证轻松观察与持续推进的体验,再决定是否需要调整公式或节奏。当前没有可引用的玩家统计结果。
| 观察项 | 记录与解释方式 |
| --- | --- |
| 主动停顿 | 区分玩家正在看路线的停顿、动画占用时间与离开游戏的空闲;不能把全部停顿都解释成困难。 |
| 成功消除间隔 | 观察连续成功是否顺畅,以及卡顿是否集中在少数阶段;结合动画时间判断。 |
| 旋转到下一次成功的间隔 | 记录是否能理解旋转带来的新机会,是否出现反复空转和方向试探。 |
| 失败试路与原因 | 区分明确的路线占用、无法解释的接触和误触;尝试次数多不自动意味着体验差。 |
| 最后一枚棋子阶段 | 观察是否出现突然的理解断点、长停顿或依赖提示结束。 |
| 提示、撤销与重开 | 结合发生阶段和玩家描述解释原因,避免仅用总次数判定关卡质量。 |
| 挑战后的感受 | 比较第 4、5、6 关的主动停顿、连续成功和主观轻松程度,确认释放与回报确实发生。 |
| 活跃完成时长 | 从首次有效交互到通关分段记录,并排除明确离开游戏的时间;与工作量、提示使用一起分析。 |
测试反馈应以可观察行为与玩家自己的描述为依据。需要延长后期单关时,优先增加熟悉且可顺畅处理的内容;只有在理解与反馈都清楚时,才增加少量新的判断要求。
+56 -20
View File
@@ -19,21 +19,25 @@
"id": "my-level",
"name": "转个方向",
"rotationEnabled": true,
"moveLimit": 3,
"moveLimit": 1,
"cells": [{ "q": 0, "r": 0, "tracks": [3, 4, 5, 0, 1, 2] }],
"tiles": [{ "id": "t0", "q": 0, "r": 0, "dir": 1, "color": 0 }]
}
```
`tracks[i]` 为进入 i 端口后使用的出口,必须满足 `tracks[tracks[i]]===i` 且不能与自己相连。六端口共有 15 种完整配对。`color` 为 0–3。`rotationEnabled` 可选,默认开启;旧版 JSON 仍可导入,但会按新的碰撞规则重新验证。
`tracks[i]` 为进入 i 端口后使用的出口,必须满足 `tracks[tracks[i]]===i` 且不能与自己相连。六端口共有 15 种完整配对。`color` 为 0–11;旧文件的 0–3 仍有效。编辑器使用完整 12 色库;主线渲染按初始棋子顺序取主题色组,保持单关 3–4 色,颜色不参与规则。`rotationEnabled` 可选,默认开启;旧版 JSON 仍可导入,但会按新的碰撞规则重新验证。
导入限制:1–61 格、坐标半径不超过 4、步数 1–999。编辑器提供半径 2/3 的常用板型。底板不具备六重旋转对称性时,禁用整体旋转,避免棋子旋转后悬空。
导入限制:1–127 格、坐标半径不超过 6、`moveLimit` 为 1–999。该字段现在表示成功消除预算,只有移除棋子扣 1;旋转和失败试路不扣预算。主线将其设为初始棋子数 `N`,只表达剩余工作量。自定义关卡仍可导入不同预算,但预算不足 `N` 时无法完成全部消除。
编辑器提供半径 2/3/4(19/37/61 格)的板型,模型支持半径 4、61 格底板。底板不具备六重旋转对称性时,禁用整体旋转,避免棋子旋转后悬空。
## 旋转是真实的规则变化
顺时针一步将所有底板格子变为 `(q,r) → (-r,q+r)`,同时将轨道端口和对应出口都加 1(模 6)。上层棋子的 `(q,r,dir)` 均不改变。六次旋转恢复原状。
每次旋转扣 1 步。撤销保存并恢复底板、棋子、步数、朝向和旋转计数。重开读取原始关卡,不能从已旋转的中间状态重开。
每次旋转免费;只有成功离场才扣 1 次消除预算。阻挡和闭环试路均不扣预算,也不改变棋子的模型位置。旋转次数与失败尝试次数仍可单独统计。撤销保存并恢复底板、棋子、预算、朝向和这些计数。重开读取原始关卡,不能从已旋转的中间状态重开。
可旋转关卡在当前朝向没有直接出口时,不会仅因此判负。主线预算为 `N`,玩家可以反复试路和转盘,不会因为这些尝试耗尽预算。
## 连续碰撞
@@ -43,30 +47,62 @@
例如:移动棋子在 `(1,1)` 向上走,另一棋子在 `(0,0)`。路线经过的格子不含 `(0,0)`,但经过相邻两格之间时,移动棋子的侧面可能擦到它,因此仍被阻挡。这比仅检查路线格子占用更严格。
上述擦碰仍属于通用模型规则,工坊及任意导入数据需要正确处理。新主线另设清晰度发布门槛:沿参考解答的各决策状态检查所有剩余棋子,排除路线经过格之外的擦碰阻挡。筛选参考解答不能证明所有任意旋转、点击序列都满足同样的清晰度要求,也不代表每次任意旋转都必然产生出口。
判定发生在移动前,动画只展示结果:成功沿线离场;失败走到接触位置再退回。不允许多个棋子同时运动,避免时序歧义。生成器、求解器、提示与工坊都调用同一个 `trace()`。
## 旋转求解与生成
移走可行棋子只会减少障碍,不改变轨道,因此在任意朝向下先移除所有安全棋子不会损害后续可解性。求解器对“朝向+剩余棋子集合”做 BFS,每次转盘代价为 1,到达一个朝向后先消除所有可离场棋子。
移走可行棋子只会减少障碍,不改变轨道,因此在任意朝向下先移除所有安全棋子不会损害后续可解性。求解器对“朝向+剩余棋子集合”做 BFS,到达一个朝向后先消除所有可离场棋子。搜索仍将每次旋转计为一条代价为 1 的边,用于寻找最少旋转方案;这是搜索目标,不是玩家的预算扣费。
最短步数 = 初始棋子数 + 最少旋转数。BFS 返回混合 `tap` / `rotate` 动作序列。最大扩展状态数为 20,000;若触及上限,则返回 `exhausted` 表示尚未确定,不能宣称无解。
关卡生成先在碰撞规则下逆向放入可离场棋子,再旋转初始底盘,筛选必须旋转才能完成的布局,最后重新求解验证。主线按评分非递减排列,共 24 关,必要旋转 1–3 次。
## 数字化难度(0–100)
设 N=棋子数、T=忽略占用的平均转弯数、W=解答中的消除层数、F=初始无碰撞可离场数量、R=最少旋转数、K=N+R=最短步数、M=上限:
求解结果区分两种数量:
```text
规模 = min(1, N/37) × 15
弯道追踪 = min(1, T/5) × 20
解锁层数 = min(1, max(0,W-1)/9) × 20
路线阻塞 = (1-F/N) × 15
必要旋转 = min(1, R/4) × 20
步数压力 = clamp(1-(M-K)/max(1,0.4N), 0, 1) × 10
minimumMoves = N // 最少成功消除成本
minimumActions = N + R // 最少交互数:消除 + 旋转
```
其中 `R` 是最少旋转数。BFS 返回混合 `tap` / `rotate` 动作序列;`reachable` 表示可以清空棋盘,`solvable` 还要求预算不少于 `N`。最大扩展状态数为 20,000;若触及上限,则返回 `exhausted` 表示尚未确定,不能宣称无解或已验证可解。
基础生成器在碰撞规则下逆向放入可离场棋子,主线编排在候选基础上进行独立筛选与回放。主线制作规模为 48 关、8 章,每章 6 拍:进入、换路、展开、小挑战、释放、长局回报。顺序不按认知难度非递减排序,也不再要求每一关都必须旋转。
大棋盘用于增加熟悉规则下的工作量:早期就可使用 37 格,后期舒缓关采用 61 格,19 格也可承载较难的局部关系。小挑战后必须有认知负担回落,长局回报不能仅靠更复杂的路线或反复空转延长时间。
发布要求包括:每枚棋子在 6 个朝向下忽略占用的独立路线均无闭环;参考解答全程排除路线格外擦碰阻挡;换路和小挑战关在参考解答中最多连续旋转 1 次就打开下一次消除进展。它们是候选发布门槛,不能用来代替实际生成结果或玩家验收。完整制作方向见 [玩法方向](gameplay-direction.md),生成后逐关核对 [主线审阅报告](campaign-review.md)。
## 认知难度(0–100)
`analyze()` 的分数只估计路线阅读与依赖判断,不直接给棋盘面积、棋子数或试错预算加分。设:
- `N`:初始棋子数。
- `T`、`Tmax`:初始朝向忽略占用时,各棋子独立路线的平均、最大转弯数。
- `W`:参考解答中的消除层数;`D = max(0, W-1)/(N-1)`,当 `N≤1` 时为 0。
- `F`:初始无碰撞可离场棋子数。
- `S`:初始状态中因路线经过格之外的擦碰而被挡的棋子数。
- `R`:求解器得到的最少旋转数。
```text
弯道追踪 = min(1, T/4) × 22
最长路线 = min(1, Tmax/8) × 12
依赖比例 = min(1, D) × 18
初始阻塞 = (1-F/N) × 28
格外擦碰 = S/N × 12
必要旋转 = min(1, R/3) × 8
总分 = 四舍五入各项未取整值之和
```
空关卡为 0 分且不能判为有效可解关卡。不可解、搜索未确定和步数不足分别展示。分项单独取整,显示值之和可能与总分略有差异。
`N=0` 时比例项按 0 处理,空关卡为 0 分且不能判为有效可解关卡。不可解、搜索未确定和消除预算不足分别处理。分项显示时若单独取整,显示值之和可能与总分略有差异。
0–29 轻松、30–49 进阶、50–69 烧脑、70–100 挑战。目前 24 关范围为 25–75。它是用于关卡排序的结构估计,没有经过玩家通关率标定;后续可用首次成功率、碰撞率、提示率、旋转次数、撤销率与耗时校准。
0–29 轻松、30–49 进阶、50–69 烧脑、70–100 挑战。分数是制作与比较用的结构估计,没有经过玩家通关率标定,不应直接决定主线排序。相同分数的两关可能拥有不同棋盘规模与工作量。
## 工作量与内部时长估计
`analyze().workload` 单独提供 `removals`(棋子数)、`rotations`(最少旋转数)、`minimumActions`(最少交互数)、`routeCells`(初始朝向独立路线的格步骤总数,可能包含重复访问)及 `estimatedSeconds`。
```text
estimatedSeconds = round(3 × N + 0.75 × 总转弯数 + 4 × R)
```
总转弯数是初始朝向下、忽略占用的各棋子独立路线转弯数之和。该公式仅为内部制作假设,没有真人用时数据支撑,不能称为平均通关时长或向玩家承诺的完成时间。搜索未确定或关卡不可解时,不应将其作为可发布关卡的估时。
后续测试应观察主动停顿、成功消除间隔、旋转到下一次成功的间隔、失败试路原因、最后一枚棋子阶段,以及提示、撤销和重开的发生位置;明确区分观察停顿、动画占用和离开游戏的时间,再校准认知评分与工作量估计。
+1 -1
View File
@@ -6,6 +6,6 @@
棋子的整个顶面参与沿途碰撞检测;即使经过的格子为空,途中擦碰邻近棋子也不能通过。碰撞时显示沿线接触和回退动画,判定由共享数学模型完成。
片段没有完整展示所有底板、胜负规则、扣步规则和完整旋转过程。四种颜色只负责区分,轨道交叉处不换轨;每次点击或旋转扣 1 步,失败点击也扣步,撤销恢复状态。这些细节是明确的实现约定。内置关卡为重新设计的可解关卡,不声称复原了被棋子遮住的全部原始轨道。
片段没有完整展示所有底板、胜负规则、扣步规则和完整旋转过程。颜色只负责区分,轨道交叉处不换轨。根据后续玩法方向,旋转和失败试路均免费,只有成功离场消耗 1 份额度;主线额度等于棋子数,因此没有试错步数压力。撤销恢复状态。当前主线采用 48 关的起伏节奏,详见 [玩法方向](gameplay-direction.md)。这些是本项目的设计约定,内置关卡不声称复原了被棋子遮住的全部原始轨道。
美术以生成式 PNG 图集、背景和立体标题实现。棋子使用厚侧壁、倒角和高光,箭头单独绘制,移动转向不改变棋子材质的光照方向。UI 使用游戏 HUD、转盘按钮、道具栏和关卡弹窗。没有将原视频截图作为游戏贴图。