feat: add production campaigns, gameplay labs, and review documentation

This commit is contained in:
cabinw
2026-09-13 12:27:10 +08:00
parent d1dffa9338
commit 4644e975b0
214 changed files with 98994 additions and 134 deletions
+2
View File
@@ -2,3 +2,5 @@
node_modules/
.DS_Store
*.log
# Local research downloads and generation checkpoints
/tmp/
+4
View File
@@ -32,3 +32,7 @@ No Git history was available when this project was created. Use focused, imperat
## Agent-Specific Instructions
Before calling MCP tools, read `/Users/wukaibing/.grok-go/agents-guide.md` for version-specific GrokGo instructions.
### Level-production scope
The user has explicitly limited this work to level creation: board layouts, track connections, pieces, difficulty, and level ordering. Use the game's existing interface and interaction logic. Do not independently add controls, hide controls, change layouts or themes, or introduce teaching-specific interface behavior. Any future interface or interaction change requires an explicit user request. Preserve existing campaign numbering and saved progress when integrating level data.
+78 -10
View File
File diff suppressed because one or more lines are too long
+23 -6
View File
@@ -45,7 +45,7 @@
|---|---|---|
| `primary / onPrimary` | `#6652B8 / #FFFFFF` | 下一关、试玩、主要确认、当前选中关卡 |
| `secondary / textPrimary` | `#E4EAF0 / #273B50` | 重玩、普通选关、编辑器次级动作 |
| `utility / onUtility` | `#52697E / #FFFFFF` | 选关、设置、撤销、重来、提示的图标底板 |
| `utility / onUtility` | `#52697E / #FFFFFF` | 选关、设置与编辑器的图标底板 |
| `selection / onSelection` | `#DFD9F3 / #3F327A` | 可扩展的弱选中状态 |
| `warningSurface / warning` | `#F9E3D2 / #A44825` | 阻挡、导入失败、不可解提示 |
| `reward` | `#B9760C` | 星星轮廓与奖励强调,限制面积 |
@@ -54,7 +54,7 @@
| `scrim` | `#273B50`,透明度 48% | 模态遮罩,背景模糊 5px |
| `focus` | `#3F327A` | 键盘焦点外框 |
一张弹窗只安排一个高强调主操作。工具按钮统一用蓝灰底板,不再分别使用蓝、粉、黄。提示无需绿色“免费”角标;现有角标沿用中性表面。成功不额外引入薄荷绿,使用主操作色和星星表达。
一张弹窗只安排一个高强调主操作。顶部选关、设置使用紧凑蓝灰底板;底部撤销、重来、提示使用更大的独立彩色道具底座。当前游戏不显示次数或广告角标。成功不额外引入薄荷绿,使用主操作色和星星表达。
编辑器的工具、方向、旋转和文件操作同样使用 `utility / onUtility`,保证生成白色图标在底板上可辨认;选中工具与试玩使用 `primary / onPrimary`。
@@ -103,11 +103,15 @@
### 游戏主界面
游戏顶部恢复居中关卡计数,左侧选关、右侧设置;剩余步数位于其下方,不显示主题说明。棋盘视口占据顶部状态与底部紧凑操作栏之间的全部空间,不再限制为正方形。底部仅排列撤销、重来、提示;左右转恢复大箭头,悬浮于棋盘下部两侧,不占据额外布局高度。缩放按钮与常驻手势说明不占用棋盘空间;保留双指缩放、放大后拖动及桌面组合键滚轮。左侧选关,右侧设置。没有 Logo、关卡副标题、难度、待离场数量、角度读数或底部导航。
游戏顶部恢复居中关卡计数,左侧选关、右侧设置;剩余步数位于其下方,不显示主题说明。棋盘视口占据顶部通知与独立旋转区之间的可用空间,棋盘在该区域垂直居中,不再限制为正方形。左右转与底部道具分别占据真实布局行,不覆盖棋盘。底部仅排列撤销、重来、提示。缩放按钮与常驻手势说明不占用棋盘空间;保留双指缩放、放大后拖动及桌面组合键滚轮。左侧选关,右侧设置。没有 Logo、关卡副标题、难度、待离场数量、角度读数或底部导航。
旋转操作为放大的生成箭头,下方分别写“左转”“右转”,不加矩形底板。文字用主文字色;白色箭头允许轻微蓝灰轮廓阴影增强边缘识别,不能改写原图轮廓。它们须保留至少 44×44 的触摸区域。
撤销、重来、提示使用相同的工具底色和图标规格,下方标签不少于 12px。禁用时确实停止操作,网页透明度为 55%;不得只有颜色变化却仍可点击。
撤销、重来、提示使用独立彩色底座:原版为蓝、紫、金;高彩为青、荧粉、亮黄;玩具为蓝、红、黄圆角积木键;动物为绿、棕、麦黄徽章。四套方案的底部道具均采用纯色平面,不使用投影、内阴影、立体底边或渐变高光;图标和未来次数/广告角标同样不加阴影。普通底座 64px,大屏 68px,短屏 56px;图标 32px、标签 13px。整体点击区至少 80×96px,短屏 80×84px。禁用时确实停止操作,道具透明度为 50%;不得只有颜色变化却仍可点击。
右上角预留 27px 次数角标或 42px 广告角标,距底座上缘 -5px;广告使用播放符号 + AD,不能只有模糊的加号。两种角标互斥,不遮挡图标与标签。设计稿仅展示“撤销 3 次”和“广告获取提示”的外观,不接入库存、扣次数、广告播放或奖励。实际次数、定价与获取方式待产品确定。
统一审核页的“道具设计”区域、四套独立设计稿与离线手册均包含普通态和未来角标示例,允许在同一页面切换比较。
### 棋盘和轨道
@@ -159,13 +163,13 @@
## 7. 动效、音效与反馈
- 快速连点:棋子运动和转盘动画期间继续接收点击,待执行棋子以紫色描边反馈;按顺序重新判定路线,不重复记录同一棋子。碰撞、重来、换关、进入编辑器或打开弹窗时取消待执行点击。动画仍顺序播放,避免多个运动棋子产生碰撞歧义。
- 快速连点:每次点击立即按当前逻辑棋盘判定路线,成功棋子立即释放占位,多枚棋子各自播放运动动画,无须等待上一枚结束;失败试路也不阻挡其他棋子出发。同一枚运动中的棋子不重复触发。转盘运动期间暂存点击并以紫色描边反馈,到位后按点击顺序立即执行;重来、换关、进入编辑器或打开弹窗时取消暂存点击。移动中的动画不参与后续占位碰撞判定。撤销、提示和再次旋转等待所有棋子运动结束,通关结果也在全部离场动画结束后显示。
- 按压:150ms,缩放到 94%;不移动命中区域。
- 弹窗:420ms,从上方 60px 和 96% 缩放进入;遮罩约 250ms。
- 星星:分别延迟 300/490/680ms 出现,每枚动画 400ms。
- 离场:总时长随路径长度变化,按实际轨道长度以每单位 60ms 滑行,滑行段限制为 140–800ms,出口收束固定为 180ms。边缘棋子约 320ms 完成离场;从 3 格路线起平滑增加滑行时间,5 格及以上恢复初版总时长(550ms + 每格 85ms,最长 1700ms),新增时间全部用于滑行,出口收束仍为 180ms。不再给短路线添加固定等待。滑行与出口位移使用平滑 S 曲线(smoothstep),起止速度为零,中段流畅加速;缩小同样使用 S 曲线,避免末段突然消失。碎片采用快速展开、缓慢停下的 ease-out 曲线。棋子向外推进约 0.48 个格子半径,缩小后留下短尾迹与 6 枚同色六角碎片;效果结束后再显示结果。不得把消散阶段放在画布外,不引入额外彩虹色。减少动态效果时取消尾迹与碎片,仅保留短路线过渡与成功状态文字。
- 旋转:240ms,快速到位,棋子保持固定。
- 碰撞:总长 650ms,先接近,再接触停顿并让阻挡棋子轻震,最后原路弹回;不改变模型中的位置。
- 碰撞:总长 800ms,先接近,再接触停顿并让阻挡棋子轻震,最后原路弹回;不改变模型中的位置。
- 音效:首次手势后启动,点击、旋转、离场、碰撞和通关各有短音;设置里可关闭并保存偏好。
- `prefers-reduced-motion` 下取消非必要位移、缩放和震动,仍保留状态文字。
- 手机棋盘禁用 WebKit tap highlight、选中文字和长按菜单,避免整块矩形高亮。
@@ -187,3 +191,16 @@
7. 如需替换已接受的图片,明确告知用户素材来源和变化,再更新本表。
Cocos 读取同一 JSON/JS token 和 PNG。`CandyUiSkin` 使用纯色 Sprite、圆角 Mask 和居中的图标;不得在原生侧另外猜颜色。本规范与适配组件已提供,原生场景尚需导入后做视觉验收。
## 多设计方案审核
新增四套并列设计(现有方案 + 三套实验方案),每套均包含轻松、进阶、烧脑、挑战、每周挑战五种主题。设计切换同时作用于棋子造型、轨道材质与主题配色;共享同一弯曲关卡与动画逻辑。
| 设计 | 视觉特征 | 独立设计稿 |
| --- | --- | --- |
| 柔和原色 | 哑光色块、蓝灰轨道 | [柔和原色](design/directions/calm.html) |
| 高彩游乐场 | 高饱和撞色、粗轮廓、贴纸硬阴影 | [高彩游乐场](design/directions/vivid.html) |
| 积木轨道屋 | 塑胶高光、分层厚度、圆角积木 | [积木轨道屋](design/directions/toy.html) |
| 动物弯弯镇 | 猫、熊、兔、蛙造型与独立箭头 | [动物弯弯镇](design/directions/animals.html) |
在 [统一审核页](design-showcase.html) 切换设计及主题,可同时保留多套、逐套记录意见并导出 JSON。意见保存在当前浏览器。设计稿由 `scripts/build-art-directions.mjs` 生成,颜色及造型规则来自 `src/art-directions.js`、`src/token-art.js`。
+34 -8
View File
@@ -2,7 +2,13 @@
一款竖屏六角轨道解谜游戏:观察路线,点击箭头棋子让它离场;免费旋转底盘和尝试路线,在清楚的反馈中逐步清空棋盘。
项目使用原生 JavaScript ES modules 和 Canvas,无第三方运行依赖,无在线字体或 CDN。选关窗口提供 v0.1 最初 24 关、v0.2 直线较多的 48 关与 v0.3 当前弯轨 48 关;默认 v0.3,按 8 章 × 6 拍制作。另有关卡工坊、求解器、确定性关卡生成器,以及 Cocos Creator 适配示例。
项目使用原生 JavaScript ES modules 和 Canvas,无第三方运行依赖,无在线字体或 CDN。选关窗口提供 v0.1 最初 24 关、v0.2 直线较多的 48 关、v0.3 弯轨 48 关、v0.4「长路与惊喜」20 关,以及 v0.5「千段轨迹」1000 关。新玩家默认 v0.5,已有版本选择继续保留。另有关卡工坊、求解器、确定性关卡生成器,以及 Cocos Creator 适配示例。
v0.5 按 20 章 × 50 关组织花瓣、环绕、螺旋、回折、编织、双叶交叉六类真实路线,穿插巡游、清挡、反差、换路和分段释放。沿用主游戏的快速连点与并行离场。每关保存构造配方、正式解、体验解与 20 种顺序回放;制作与验收范围见 [千关制作报告](docs/v0.5-production-report.md)。
正式第 1 关前另有 3 关入门序章:单棋子沿弯路离场、两棋子清挡连点、旋转底盘找出口。三课都使用与正式第 1 关相同的完整 19 格六边形棋盘,分别只放 1、2、2 枚棋子。新玩家从序章开始,教学单独存档,原 1–1000 编号与完成记录保持原位;选关窗口可以重玩教学。[开始教学](http://localhost:4173/?campaign=v0.5&tutorial=1),[教学设计与验证](docs/tutorial-prologue.md)。明确的 `?level=1` 链接仍直达正式第 1 关。
v0.4 按 4 组 × 5 关安排长路巡游、朝内棋子一次旋转放行、短路清挡和往返换路。设计依据见 [新版关卡设计准则](docs/level-design-principles-v2.md),逐关制作意图与完整操作证据见 [v0.4 体验报告](docs/v0.4-experience-review.md)。长路径本身是观看内容,轻巧反差也可通过短路径兑现;不按难度分对关卡排序。
后续关卡优化的原始设计参照见 [v0.1 · 最初 24 关设计理念](docs/v0.1-design-philosophy.md):还原必要旋转、空间让路与分阶段解开轨道的结构,并区分历史规则、实际布局和本次设计归纳。
@@ -19,6 +25,9 @@ npm run dev
打开 [游戏](http://localhost:4173/)。请通过 HTTP 访问,直接双击 HTML 文件无法正常加载 ES modules。开发服务监听 `0.0.0.0`,同一局域网的手机可通过电脑 IP 和端口访问。
- [关卡工坊](http://localhost:4173/?editor=1):当前精简游戏界面隐藏工坊导航,通过此地址进入。
- [千关版](http://localhost:4173/?campaign=v0.5&level=1):按章选关或直接输入 1–1000;URL 的关号从 1 开始。
- [千关审核页](http://localhost:4173/labs/campaign-review/index.html):按章看布局,检查制作证据,逐步回放和导出本章总览。
- [花形轨道测试](http://localhost:4173/labs/flower/index.html):双层十二瓣与三重环带编织成花,包含 10 枚棋子的独立可玩实验,详见 [设计说明](docs/flower-study.md)。
- [交互设计规范](http://localhost:4173/Design.html):色板、图标、组件状态与动效示例。
- 修改端口:`PORT=4174 npm run dev`。
@@ -30,15 +39,15 @@ npm run dev
- 只有成功移除棋子消耗 1 次预算;旋转和失败试路均免费。主线预算等于初始棋子数,只表示剩余消除工作量,不惩罚试错。撤销恢复棋盘、棋子、朝向和计数;没有倒计时。
- 提示会高亮可安全离场的棋子,或建议旋转方向。棋子配色不影响规则。
主线每章按“进入 → 换路 → 展开 → 小挑战 → 释放 → 长局回报”安排,不按难度分数单调排序,也不要求每关必须旋转。早期就可使用 37 格棋盘,后期舒缓关使用 61 格延长熟悉操作的体验;19 格小棋盘也可承担局部挑战。棋盘规模与认知难度分别记录。
v0.3 每章按“进入 → 换路 → 展开 → 小挑战 → 释放 → 长局回报”安排,不按难度分数单调排序,也不要求每关必须旋转。早期就可使用 37 格棋盘,后期舒缓关使用 61 格延长熟悉操作的体验;19 格小棋盘也可承担局部挑战。棋盘规模与认知难度分别记录。
9 月 9 日版的 48 关以真正的弯轨消除为主:每关参考解答至少 65% 的成功离场棋子经过弯道,且不少于 3 枚。直线只作少量节奏调剂,不安排纯直出关,也不用空格上的装饰曲线充数。当前单关最多 25 枚棋子,后期长局增加的是沿弯轨观察与解开的实际内容。
第 1 关为 37 格、8 枚棋子,开局全部可离场,每枚参考路径恰好转弯一次,无需旋转;“全部可离场”不表示任意朝向都相同。前 7 关通过 `lesson` 字段依次学习箭头起步与弯轨转向、旋转换路而棋子箭头不动、交叉不换轨、阻挡先后、舒缓的一两弯、大盘连续解路径,以及完整路线观察。
v0.3 第 1 关为 37 格、8 枚棋子,开局全部可离场,每枚参考路径恰好转弯一次,无需旋转;“全部可离场”不表示任意朝向都相同。前 7 关通过 `lesson` 字段依次学习箭头起步与弯轨转向、旋转换路而棋子箭头不动、交叉不换轨、阻挡先后、舒缓的一两弯、大盘连续解路径,以及完整路线观察。
主线发布要求包括完整可解、每枚棋子在六个朝向下的独立路线无闭环,以及参考解答中的阻挡可解释、旋转后有明确进展;这些门槛不代表玩家任意旋转或点击序列都不会遇阻。制作方向见 [玩法方向](docs/gameplay-direction.md),逐关生成与验收记录见 [主线审阅报告](docs/campaign-review.md),验证结果以实际生成报告和测试输出为准。
v0.3 发布要求包括完整可解、每枚棋子在六个朝向下的独立路线无闭环,以及参考解答中的阻挡可解释、旋转后有明确进展;这些门槛不代表玩家任意旋转或点击序列都不会遇阻。该版制作方向见 [玩法方向](docs/gameplay-direction.md),逐关生成与验收记录见 [主线审阅报告](docs/campaign-review.md),验证结果以实际生成报告和测试输出为准。v0.4 按新版准则单独筛选与回放,不沿用以上全部布局限制。
所有关卡可自由选择。在左上角选关窗口切换 v0.1 / v0.2 / v0.3,分别保存通关进度与上次选关;对应旧存档会自动迁移,旧数据继续保留。历史布局原样恢复,三版共用当前免费旋转与失败试路规则,详见 [关卡版本与来源](docs/campaign-versions.md)。以上弯轨比例与节奏门槛针对 v0.3。音效使用 Web Audio 合成,首次交互后启用,可在设置中关闭并保存偏好。
所有关卡可自由选择。在左上角选关窗口切换 v0.1 至 v0.5,分别保存通关进度与上次选关;对应旧存档会自动迁移,旧数据继续保留。历史布局原样恢复,五版共用当前免费旋转与失败试路规则,详见 [关卡版本与来源](docs/campaign-versions.md)。以上弯轨比例与节奏门槛针对 v0.3。音效使用 Web Audio 合成,首次交互后启用,可在设置中关闭并保存偏好。
## 关卡工坊
@@ -57,8 +66,11 @@ npm run dev
| `npm run dev` | 启动本地开发服务,默认端口 4173 |
| `npm test` | 执行 Node 内置测试套件 |
| `npm run build` | 生成设计资源并输出静态站点到 `dist/` |
| `npm run levels` | 读取主线种子清单重新生成 48 关,同步关卡 JSON、共享模块和实际路径验收报告 |
| `npm run levels:versions` | 校验历史关卡归档并生成 v0.1 / v0.2 的浏览器模块 |
| `npm run levels` | 读取 v0.3 种子清单重新生成 48 关,同步关卡 JSON、共享模块和实际路径验收报告 |
| `npm run levels:v04` | 读取 v0.4 制作卡重新生成 20 关,验证两套完整回放并同步体验报告 |
| `npm run levels:v05` | 离线生成并筛选完整 1000 关,冻结配方、布局、分章数据及回放证据 |
| `npm run levels:v05:verify` | 校验冻结数据及生成源码指纹,重新求解 1000 关并回放每关 22 套解 |
| `npm run levels:versions` | 校验历史关卡归档并生成 v0.1 / v0.2 / v0.3 的归档模块 |
| `npm run design` | 生成颜色 token、CSS、JSON、PNG、对比度报告和设计指南 HTML |
| `node scripts/serve.mjs --dist` | 本地预览构建产物 |
@@ -66,7 +78,9 @@ npm run dev
修改语义颜色时编辑 `src/design-tokens.js`,然后运行 `npm run design` 并检查生成资源的差异。修改关卡生成逻辑后运行 `npm run levels` 和 `npm test`,确保关卡数据同步且全部可解。
主线布局来源为 `levels/campaign-seeds.json`,包含逐关种子和生成参数;不要直接编辑派生关卡。`levels/campaign-analysis.json` 的 `pathUsage` 记录参考解答中真正成功走过的弯轨/直线路径、转弯数量与逐棋子明细,不能用棋盘弯线总数替代。报告仍是结构与回放证据,不包含真人体验数据。
v0.3 布局来源为 `levels/campaign-seeds.json`,包含逐关种子和生成参数;v0.4 来源为 `levels/v0.4-seeds.json`,包含种子、生成参数、设计意图和完整体验动作。不要直接编辑派生关卡。`levels/campaign-analysis.json` 与 `levels/v0.4-analysis.json` 记录实际成功路径;后者还区分最少旋转参考解与突出关键反差的体验解。报告是结构与回放证据,不包含真人体验数据。
v0.5 的编排在 `src/production-plan.js`,选中配方在 `levels/v0.5-recipes.json`;静态构建只验证冻结千关,不在每次构建时重新抽取布局。完整生产使用确定性种子,每个槽位在同一种形态和体验内比较候选。调试小批次可运行 `node scripts/build-production-levels.mjs --count=50`,仅写入临时目录;仅完整 1000 关可通过 `--publish` 写入本地正式数据。此标志不会部署网站。
## 项目结构
@@ -84,6 +98,12 @@ npm run dev
| `levels/campaign-seeds.json` | 48 关种子与生成参数的制作来源 |
| `levels/campaign.json`、`src/levels.js` | 根据种子清单生成的主线 JSON 与浏览器模块 |
| `levels/campaign-analysis.json` | 逐关回放、真实成功路径 `pathUsage` 与结构指标 |
| `levels/v0.4-seeds.json`、`src/experience-generator.js` | v0.4 逐关制作卡与支持不同朝向逆向放置的生成器 |
| `levels/v0.4.json`、`src/levels-v04.js`、`levels/v0.4-analysis.json` | v0.4 布局、浏览器模块与双方案回放证据 |
| `src/route-grammar.js`、`src/stage-seed.js`、`src/production-generator.js` | 六类开放路线、两次换路锁组与有构造解的布子 |
| `src/campaign-evidence.js` | 正式求解、策略回放、对称去重、结构难度与体验兑现证据 |
| `levels/v0.5.json`、`levels/v0.5/`、`src/levels-v05.js` | 千关全集、20 章独立 JSON 与浏览器模块 |
| `levels/v0.5-analysis.json`、`levels/v0.5-recipes.json` | 千关逐关证据与可复现配方 |
| `assets/` | PNG 图集、历史素材与生成提示词 |
| `tests/`、`scripts/` | 自动测试、开发服务和生成脚本 |
| `cocos/` | Cocos Creator 棋盘及 UI 适配示例 |
@@ -118,6 +138,12 @@ Cocos 示例复用规则、碰撞、渲染命令和图集;HTML 控件、文件
[Hex Video Lab](labs/hex-video/index.html) 是基于 `examples/hex.mp4` 的独立 UI / 特效复刻,可切换地图、棋盘和领奖场景,支持自动试玩、单片翻转、彩纸、金币飞入、慢速播放及参考帧对照。棋子按本项目要求保留单片薄侧边,不使用视频中的多片堆叠。运行 `npm run dev` 后访问 `/labs/hex-video/index.html`;详见 [复刻笔记](labs/hex-video/README.md)。
## 环路车场 Lab
[打开环路车场实验](http://localhost:4173/labs/car-loop/index.html):对照六角与方格道路,点击方块小车发车,经固定引道汇入顺时针环路,驶向右上方终点。提供多弯路网、旋转、路线提示、三组样本和自动演示。独立实验不影响主线;详见 [Lab 说明](labs/car-loop/README.md)。
转盘发车玩法于 2026-09-10 暂缓研发,保留可运行版本;详见 [研发记录与阶段结论](docs/car-loop-research.md)。
## 玩法变种 Lab
[打开独立实验室](http://localhost:4173/labs/variants/index.html):分色归站、机关换轨、接力停靠,各 5 个可解关卡,支持旋转、撤销、提示和重来。仅使用实验室数据,不写入主线存档。规则和验证范围见 [Lab 说明](labs/variants/README.md)。
+14 -6
View File
@@ -1,19 +1,27 @@
<!doctype html>
<html lang="zh-CN">
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>HEX TRAILS · 色彩与离场设计</title><link rel="stylesheet" href="design/showcase.css"><link rel="stylesheet" href="design/notifications.css"></head>
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>HEX TRAILS · 色彩与离场设计</title><link rel="stylesheet" href="design/showcase.css"><link rel="stylesheet" href="design/notifications.css"><link rel="stylesheet" href="design/art-directions.css"><link rel="stylesheet" href="design/game-tools.css"></head>
<body>
<header class="masthead"><a href="index.html">HEX TRAILS<span>转转六角</span></a><span>ART DIRECTION / 02</span><a class="game-link" id="game-link" href="index.html">进入游戏 ↗</a></header>
<header class="masthead"><a href="index.html">HEX TRAILS<span>转转六角</span></a><span>DESIGN REVIEW / 04</span><a class="game-link" id="game-link" href="index.html">进入游戏 ↗</a></header>
<nav class="quick-review" aria-label="快速切换设计与主题"><label>设计 <select id="quick-design"></select></label><label>主题 <select id="quick-theme"></select></label><a href="#direction-picker">多选与审核 ↑</a><a href="#item-study">道具设计 ↓</a></nav>
<main>
<section class="intro"><div><div class="eyebrow">COLORFUL WORLDS. FOCUSED PLAY.</div><h1>每一关,<br>都有自己的颜色。</h1><p>12 种棋子色彩,5 套关卡氛围。<br>同一棋盘,对照 4、7、9、12 色。</p></div><div class="intro-note"><span>01 / COLOR SYSTEM</span><p>选择下方主题,比较同一棋盘的不同配色。</p><div class="theme-tabs" id="theme-tabs" aria-label="关卡主题"></div></div></section>
<section class="direction-review" aria-label="设计方案审核">
<div class="review-heading"><div><span class="eyebrow">ART DIRECTIONS / 4 × 5</span><h1>四种性格,同一段旅程。</h1><p>每套设计都有轻松、进阶、烧脑、挑战和每周挑战五种主题。切换查看,也可以同时保留多套。</p></div><a href="#preview">体验弯曲轨道 ↓</a></div>
<div id="direction-picker" class="direction-picker"></div>
<div class="review-summary-bar"><p id="review-summary" aria-live="polite"></p><button id="export-review">导出审核记录 ↓</button></div>
<div id="direction-detail" class="direction-detail"></div>
</section>
<section class="intro"><div><div class="eyebrow">COLORFUL WORLDS. FOCUSED PLAY.</div><h1>同一套设计,<br>五种关卡氛围。</h1><p>12 种棋子色彩,5 套关卡氛围。<br>同一棋盘,对照 4、7、9、12 色。</p></div><div class="intro-note"><span>01 / COLOR SYSTEM</span><p>选择下方主题,比较同一棋盘的不同配色。</p><div class="theme-tabs" id="theme-tabs" aria-label="关卡主题"></div></div></section>
<section class="density-section"><div class="section-heading"><div><div class="eyebrow">COLOR DENSITY STUDY</div><h2>七色,会不会更好玩?</h2></div><p>点击任一棋盘,在下方体验对应色数;布局保持一致。</p></div><div class="density-grid" id="density-grid"></div></section>
<div class="board-size-control"><label>棋盘规模 <select id="board-size"><option value="regular">弯曲小盘 · 12 枚棋子</option><option value="5" selected>边长 6 · 91 格 · 24 枚棋子</option><option value="6">边长 7 · 127 格 · 32 枚棋子</option></select></label><span>双指缩放 · 放大后拖动 · 电脑可用 Ctrl/Command + 滚轮</span></div>
<section class="studio" aria-label="主题和动效互动展示">
<div class="theme-story"><div class="eyebrow" id="scene-label"></div><h2 id="scene-name"></h2><p id="scene-description"></p><div class="color-spec"><span>环境色</span><b id="background-value"></b><i id="background-chip"></i></div><div class="palette-title">本关棋子 <span id="palette-count"></span></div><div class="local-palette" id="local-palette"></div><p class="small-note">颜色只表达个性,不改变路线或碰撞规则。<br>难度同时保留文字标识。</p><a id="play-theme" href="index.html">用这套主题玩一关 ↗</a></div>
<div class="phone" id="phone"><div class="phone-top"><button class="icon-button" id="reset" aria-label="选择关卡" data-icon="grid"></button><div><strong>LEVEL 01</strong><span id="phone-label"></span></div><button class="icon-button" id="next-theme" aria-label="设置" data-icon="gear"></button></div><div class="moves"><span>剩余步数</span><strong id="moves">11</strong></div><div class="notice-slot"><div class="game-notice visible" id="phone-status" role="status" aria-live="polite" aria-atomic="true">点击棋子,沿轨道出发</div></div><canvas id="preview" aria-label="可点击棋子的真实规则演示棋盘"></canvas><div class="rotations"><button id="left"><span data-icon="left"></span><b>左转</b></button><button id="right"><span data-icon="right"></span><b>右转</b></button></div><div class="phone-tools"><button id="undo"><span data-icon="undo"></span><b>撤销</b></button><button id="restart"><span data-icon="restart"></span><b>重来</b></button><button id="hint"><span data-icon="bulb"></span><b>提示</b></button></div></div>
<div class="phone" id="phone"><div class="phone-top"><button class="icon-button" id="reset" aria-label="选择关卡" data-icon="grid"></button><div><strong>LEVEL 01</strong><span id="phone-label"></span></div><button class="icon-button" id="next-theme" aria-label="设置" data-icon="gear"></button></div><div class="moves"><span>剩余步数</span><strong id="moves">11</strong></div><div class="notice-slot"><div class="game-notice visible" id="phone-status" role="status" aria-live="polite" aria-atomic="true">点击棋子,沿轨道出发</div></div><canvas id="preview" aria-label="可点击棋子的真实规则演示棋盘"></canvas><div class="rotations"><button id="left"><span data-icon="left"></span><b>左转</b></button><button id="right"><span data-icon="right"></span><b>右转</b></button></div><div class="phone-tools"><button id="undo" class="game-tool" data-tool="undo"><span class="item-face" data-icon="undo"></span><b>撤销</b></button><button id="restart" class="game-tool" data-tool="restart"><span class="item-face" data-icon="restart"></span><b>重来</b></button><button id="hint" class="game-tool" data-tool="hint"><span class="item-face" data-icon="bulb"></span><b>提示</b></button></div></div>
<div class="motion-story"><div class="eyebrow">02 / EXIT CHOREOGRAPHY</div><h2>离开,也有回响。</h2><p>沿轨道出发,冲出边缘。<br>短尾迹跟随,同色六角碎片轻轻散开。</p><ol><li><b>01</b><div><strong>沿轨道滑行</strong><span>保留完整路线,读得懂运动。</span></div></li><li><b>02</b><div><strong>出口收束</strong><span>在棋盘边缘缩小,留下短尾迹。</span></div></li><li><b>03</b><div><strong>六角余韵</strong><span>6 枚同色碎片,向外展开后消失。</span></div></li></ol><button class="demo-button" id="demo">播放离场效果 <span>↗</span></button><label class="slow"><input type="checkbox" id="slow"> 慢速观察 ×0.4</label><p class="motion-status" id="motion-status" aria-live="polite">可反复播放,也可直接操作棋盘。</p><p class="small-note">系统开启减少动态效果时,关闭尾迹和碎片。</p></div>
</section>
<section class="theme-collection"><div class="section-heading"><div><div class="eyebrow">03 / ONE JOURNEY, FIVE MOODS</div><h2>从浅湾,到午夜。</h2></div><p>主线按难度自动匹配 · 每周挑战拥有独立主题</p></div><div class="theme-grid" id="theme-grid"></div><p class="collection-note">每周挑战展示为美术主题预览;这里的棋盘使用现有主线关卡。</p></section>
<section class="pigment-section"><div class="section-heading"><div><div class="eyebrow">04 / THE PIGMENT LIBRARY</div><h2>更多颜色,更有分寸。</h2></div><p>全局 12 色 · 单关开放 4 / 7 / 9 / 12 色 · 离场效果沿用棋子本色</p></div><div class="pigment-grid" id="pigment-grid"></div><div class="rules"><p><b>环境低饱和</b>背景营造关卡情绪,让棋子保持主角。</p><p><b>单关有取舍</b>以七色为默认起点,更多颜色也保持统一形状与箭头。</p><p><b>交互有秩序</b>工具统一蓝灰,主操作保持紫色。</p></div></section>
<section class="item-study" id="item-study"><div class="section-heading"><div><span class="eyebrow">GAME ITEMS / 功能与道具</span><h2>让道具一眼可辨。</h2></div><p>随上方设计切换 · 角标仅为未来状态示意</p></div><div class="item-study-content" id="item-study-content"></div></section>
<section class="theme-collection"><div class="section-heading"><div><div class="eyebrow">03 / ONE JOURNEY, FIVE MOODS</div><h2>五种关卡主题。</h2></div><p>主线按难度自动匹配 · 每周挑战拥有独立主题</p></div><div class="theme-grid" id="theme-grid"></div><p class="collection-note">每周挑战为美术主题预览;所有设计共用弯曲轨道测试关。</p></section>
<section class="pigment-section"><div class="section-heading"><div><div class="eyebrow">04 / THE PIGMENT LIBRARY</div><h2>更多颜色,更有分寸。</h2></div><p>全局 12 色 · 单关开放 4 / 7 / 9 / 12 色 · 离场效果沿用棋子本色</p></div><div class="pigment-grid" id="pigment-grid"></div><div class="rules"><p><b>风格成套</b>棋子、轨道、控件与奖励使用同一套设计语言。</p><p><b>单关有取舍</b>以七色为默认起点,更多颜色也保持统一形状与箭头。</p><p><b>交互有秩序</b>造型可以变化,箭头与路径始终清晰。</p></div></section>
</main><footer>HEX TRAILS / DESIGN STUDY 02<span>实时 Canvas · 与游戏共用渲染与碰撞规则</span><a href="Design.html">查看设计规范 ↗</a></footer>
<dialog class="study-dialog" id="study-dialog"><div id="study-dialog-content"></div><button id="study-close">关闭</button></dialog>
<script type="module" src="src/showcase.js"></script></body></html>
+14
View File
@@ -0,0 +1,14 @@
.direction-review{padding:52px 0 24px}.review-heading{display:flex;align-items:end;justify-content:space-between;gap:30px}.review-heading h1{font-size:clamp(30px,4vw,48px);letter-spacing:-1.5px;margin:14px 0}.review-heading p{max-width:730px;color:#56687A}.review-heading>a{font-size:12px;white-space:nowrap;padding-bottom:22px}
.direction-picker{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px;margin:28px 0 18px}.direction-card{border:1px solid #273b5020;border-radius:18px;overflow:hidden;background:white}.direction-switch{display:block;background:none;padding:0;width:100%;text-align:left;color:#273B50}.direction-switch canvas{display:block;width:100%;height:auto}.direction-switch[aria-pressed=true]{box-shadow:inset 0 -3px #6652B8}.direction-card:has([aria-pressed=true]){outline:2px solid #6652B8;outline-offset:3px}.direction-card-title{display:flex;gap:8px;align-items:center;justify-content:space-between;padding:14px 12px;font-weight:650;font-size:13px}.direction-card-title small{font-weight:400;font-size:10px;color:#56687A}.keep-design{display:flex;align-items:center;gap:8px;border-top:1px solid #273b5010;padding:12px;font-size:12px;cursor:pointer}.keep-design input{width:17px;height:17px;accent-color:#6652B8}.review-summary-bar{display:flex;align-items:center;justify-content:space-between;gap:20px;font-size:12px}.review-summary-bar p{font-size:12px}.review-summary-bar button,.sheet-link{background:#273B50;color:white;border-radius:10px;padding:12px 16px;font-size:12px;display:inline-block}.direction-detail{margin-top:24px;border-top:1px solid #273b5020;border-bottom:1px solid #273b5020;padding:30px 0;display:grid;grid-template-columns:1.25fr 1fr;gap:60px}.direction-detail h2{font-size:28px;margin:10px 0}.direction-detail p,.direction-detail li{font-size:13px;line-height:1.9}.direction-detail ul{padding-left:18px;color:#56687A;margin-bottom:22px}.review-note{font-size:13px;display:flex;flex-direction:column;gap:12px;padding-top:4px}.review-note textarea{resize:vertical;width:100%;min-height:110px;border:1px solid #273b5030;border-radius:12px;padding:14px;background:white;font:inherit;color:#273B50}.review-note small{font-size:11px;color:#56687A}.intro{padding-top:30px}.intro h1{font-size:34px}.direction-review~.intro .intro-note{max-width:520px}
body[data-design=vivid] .phone{border:3px solid #30264C;box-shadow:8px 8px #30264C;border-radius:18px}body[data-design=vivid] .icon-button{background:#4A24E8;border:2px solid #30264C;border-radius:8px;box-shadow:3px 3px #30264C}body[data-design=vivid] .phone-top strong{font-weight:900;letter-spacing:-.6px}body[data-design=vivid] .game-notice{border:2px solid #30264C;border-radius:8px;box-shadow:3px 3px #30264C}
body[data-design=toy] .phone{border:8px solid #F9EDCF;border-radius:42px;box-shadow:0 12px 0 #B5A68D,0 20px 30px #273b501f,inset 0 3px 3px #FFFFFF90}body[data-design=toy] .icon-button{background:#4279B7;border-radius:15px;box-shadow:0 4px #244F80,inset 0 2px #82ACD2}body[data-design=toy] .game-notice{background:#FFF9EB;border:2px solid #D8CBB0;box-shadow:0 3px #C4B598}
body[data-design=animals] .phone{border:3px solid #718763;border-radius:40px 40px 28px 28px;box-shadow:0 6px 0 #71876330}body[data-design=animals] .icon-button{background:#54795C;border-radius:16px 16px 12px 12px;box-shadow:0 3px #36523C}body[data-design=animals] .game-notice{background:#FFFCED;border:1px solid #71876380;border-radius:18px}.phone canvas{min-width:0}
/* Dedicated design sheets use the same tokens and real board renderer. */
.sheet-page{background:var(--paper);color:#273B50}.sheet-main{max-width:1320px;padding:40px;margin:auto}.sheet-nav{display:flex;justify-content:space-between;font-size:12px;border-bottom:1px solid #273b5020;padding-bottom:20px}.sheet-hero{display:grid;grid-template-columns:1fr 1fr;gap:60px;padding:44px 0 36px}.sheet-hero h1{font-size:52px;line-height:1.1}.sheet-hero p{font-size:15px}.sheet-token-row{width:100%;height:auto;background:var(--paper);align-self:center}.sheet-themes{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:14px}.sheet-theme{border-radius:18px;background:var(--bg);color:var(--ink);padding:18px 8px;text-align:center}.sheet-theme h3{font-size:15px;margin:9px 0}.sheet-theme small{font-size:11px}.sheet-theme canvas{width:100%;height:auto;display:block}.sheet-swatches{display:flex;justify-content:center;gap:6px;margin:12px 0}.sheet-swatches i{width:18px;height:18px;border-radius:50%}.sheet-components{display:grid;grid-template-columns:1fr 1fr;gap:40px;margin-top:40px}.sheet-panel{border-top:1px solid #273b5020;padding-top:24px}.sheet-panel h2{font-size:22px}.sheet-panel ul{font-size:14px;line-height:2;padding-left:18px}.component-preview{background:var(--bg);padding:28px;border-radius:24px}.sample-controls{display:flex;justify-content:center;gap:12px}.sample-controls button{padding:12px 18px;color:white;background:var(--accent);border-radius:12px;font-size:13px}.sample-modal{background:#FFFCF5;border-radius:24px;padding:24px;margin-top:24px;text-align:center;color:#273B50}.sample-modal .stars{font-size:38px;color:#F7BB32;text-shadow:0 2px #C68525,0 0 16px #F8D776}.sheet-page[data-design=vivid] .sample-modal,.sheet-page[data-design=vivid] .sample-controls button{border:2px solid #30264C;border-radius:10px;box-shadow:4px 4px #30264C}.sheet-page[data-design=toy] .sample-modal,.sheet-page[data-design=toy] .sample-controls button{box-shadow:0 5px #B8A88D,inset 0 3px #FFFFFF55;border-radius:24px}.sheet-page[data-design=animals] .sample-modal{border:2px solid #718763;border-radius:30px}.sheet-page[data-design=animals] .sample-controls button{border-radius:18px;box-shadow:0 3px #36523C}.sheet-caption{font-size:12px;line-height:1.8;color:#56687A;margin:20px 0}
@media(max-width:900px){.direction-picker{grid-template-columns:repeat(2,minmax(0,1fr))}.direction-detail{gap:24px}.sheet-themes{grid-template-columns:repeat(2,minmax(0,1fr))}.sheet-hero{gap:20px}.sheet-hero h1{font-size:38px}}
@media(max-width:650px){.review-heading{display:block}.review-heading>a{display:inline-block;padding:0}.direction-review{padding-top:30px}.direction-card-title{display:block;font-size:12px}.direction-card-title small{display:block;margin-top:5px}.direction-detail,.sheet-hero,.sheet-components{grid-template-columns:1fr;gap:22px}.review-summary-bar{align-items:start}.review-summary-bar button{flex-shrink:0;padding:10px;font-size:11px}.sheet-main{padding:22px}.sheet-themes{gap:12px}.sheet-theme{padding:12px 5px}}
body[data-design=vivid]:not(.editing) .game-shell .game-icon{filter:drop-shadow(3px 3px 0 #30264C)}
body[data-design=toy]:not(.editing) .game-shell .game-icon{filter:drop-shadow(0 4px 0 #B5A68D)}
body[data-design=animals]:not(.editing) .game-shell .game-icon{filter:sepia(.25) hue-rotate(320deg)}
.quick-review{position:sticky;top:0;z-index:10;display:flex;align-items:center;justify-content:center;gap:22px;padding:10px 22px;background:#F7F6F2F5;border-bottom:1px solid #273b501c;backdrop-filter:blur(12px);font-size:12px}.quick-review label{display:flex;align-items:center;gap:9px}.quick-review select{font:inherit;color:#273B50;background:white;border:1px solid #273b5033;border-radius:8px;min-height:36px;padding:5px 10px}.quick-review a{font-size:11px}.direction-picker,.phone{scroll-margin-top:80px}
@media(max-width:500px){.quick-review{gap:10px;padding:8px 10px}.quick-review label{gap:5px}.quick-review select{max-width:130px;font-size:11px}.quick-review a{font-size:10px}.review-heading h1{font-size:28px}}
+3
View File
@@ -115,3 +115,6 @@ body:not(.editing) .rotate-button b{font-size:13px}
body:not(.editing) .rotate-button>.ui-icon{width:46px;height:46px}
}
body:not(.editing) .game-card{align-self:stretch}
/* Warm gold reward stars with a restrained halo. */
.result-emblem .ui-icon[data-icon="star"]{filter:brightness(0) saturate(100%) invert(79%) sepia(85%) saturate(1450%) hue-rotate(350deg) brightness(105%) contrast(102%) drop-shadow(0 2px 1px #c88b2380) drop-shadow(0 0 7px #ffd45c99) drop-shadow(0 0 16px #ffe8a366)}
File diff suppressed because one or more lines are too long
+27
View File
@@ -0,0 +1,27 @@
# 动物弯弯镇
猫咪、小熊、兔子与青蛙沿轨道出游。用表情与耳朵增加性格,方向箭头独立保留。
## 设计规则
- 圆脸、短耳与小表情,外形保持在六角范围内
- 箭头留在脸部下方,不靠动物朝向猜方向
- 草地、木棕与奶油毛色,搭配森林小径
## 五种主题
| 难度 | 名称 | 环境色 |
| --- | --- | --- |
| 轻松 | 青草野餐 | #A9CD69 |
| 进阶 | 橡果秋游 | #E7B947 |
| 烧脑 | 溪边捉迷藏 | #72BEB2 |
| 挑战 | 红土探险 | #C67B47 |
| 每周挑战 | 萤火森林 | #183F36 |
## 游戏道具与布局
- 撤销、重来、提示使用独立彩色底座,64–68px,图标 32px,标签 13px。顶部导航保持紧凑。道具使用纯色平面,不使用阴影、立体底边或渐变高光。
- 右上角预留次数或“▶ AD”角标。设计稿展示“撤销 3 次”和“广告获取提示”,仅为样式,不启用真实库存或广告逻辑。
- 棋盘在通知区与独立旋转区之间垂直居中。旋转区和道具区占据真实布局行,不覆盖棋盘。
此方案使用独立的棋子造型、轨道材质和控件样式,共用现有弯曲轨道玩法。审核页支持同时保留多套方案。
File diff suppressed because one or more lines are too long
+27
View File
@@ -0,0 +1,27 @@
# 柔和原色
低饱和环境与平面六角棋子,让注意力留在轨道和方向。
## 设计规则
- 哑光色块,克制装饰
- 蓝灰细轨道,保持视觉留白
- 金色奖励,柔和浮现
## 五种主题
| 难度 | 名称 | 环境色 |
| --- | --- | --- |
| 轻松 | 薄荷浅湾 | #C5E4DF |
| 进阶 | 杏色午后 | #F1D7B8 |
| 烧脑 | 鸢尾花园 | #D8D0EB |
| 挑战 | 玫瑰暮色 | #E7C3CE |
| 每周挑战 | 午夜极光 | #293956 |
## 游戏道具与布局
- 撤销、重来、提示使用独立彩色底座,64–68px,图标 32px,标签 13px。顶部导航保持紧凑。道具使用纯色平面,不使用阴影、立体底边或渐变高光。
- 右上角预留次数或“▶ AD”角标。设计稿展示“撤销 3 次”和“广告获取提示”,仅为样式,不启用真实库存或广告逻辑。
- 棋盘在通知区与独立旋转区之间垂直居中。旋转区和道具区占据真实布局行,不覆盖棋盘。
此方案使用独立的棋子造型、轨道材质和控件样式,共用现有弯曲轨道玩法。审核页支持同时保留多套方案。
File diff suppressed because one or more lines are too long
+27
View File
@@ -0,0 +1,27 @@
# 积木轨道屋
圆润积木、原色塑胶与压下去有回弹的按钮。棋子像可以拿在手里的小零件。
## 设计规则
- 同色深浅叠层,形成柔软厚度
- 红黄蓝绿积木配木色底板
- 圆角控件、凸起边缘与轻微高光
## 五种主题
| 难度 | 名称 | 环境色 |
| --- | --- | --- |
| 轻松 | 积木黄盒 | #F4C548 |
| 进阶 | 蓝色装配台 | #56AFE0 |
| 烧脑 | 橘红工坊 | #EA743E |
| 挑战 | 绿毯小城 | #439A73 |
| 每周挑战 | 太空玩具柜 | #244584 |
## 游戏道具与布局
- 撤销、重来、提示使用独立彩色底座,64–68px,图标 32px,标签 13px。顶部导航保持紧凑。道具使用纯色平面,不使用阴影、立体底边或渐变高光。
- 右上角预留次数或“▶ AD”角标。设计稿展示“撤销 3 次”和“广告获取提示”,仅为样式,不启用真实库存或广告逻辑。
- 棋盘在通知区与独立旋转区之间垂直居中。旋转区和道具区占据真实布局行,不覆盖棋盘。
此方案使用独立的棋子造型、轨道材质和控件样式,共用现有弯曲轨道玩法。审核页支持同时保留多套方案。
File diff suppressed because one or more lines are too long
+27
View File
@@ -0,0 +1,27 @@
# 高彩游乐场
鲜明撞色、粗线条与贴纸式棋子。像一张能玩的彩色海报,明快、有力量。
## 设计规则
- 高纯度主色,深色轮廓统一画面
- 轨道像印刷线,棋子像立起的贴纸
- 方圆按钮与错位硬阴影
## 五种主题
| 难度 | 名称 | 环境色 |
| --- | --- | --- |
| 轻松 | 青柠派对 | #B8F34A |
| 进阶 | 爆橙热浪 | #FF771B |
| 烧脑 | 钴蓝电场 | #3E42EE |
| 挑战 | 荧粉冲刺 | #FF3588 |
| 每周挑战 | 黑光嘉年华 | #1B104D |
## 游戏道具与布局
- 撤销、重来、提示使用独立彩色底座,64–68px,图标 32px,标签 13px。顶部导航保持紧凑。道具使用纯色平面,不使用阴影、立体底边或渐变高光。
- 右上角预留次数或“▶ AD”角标。设计稿展示“撤销 3 次”和“广告获取提示”,仅为样式,不启用真实库存或广告逻辑。
- 棋盘在通知区与独立旋转区之间垂直居中。旋转区和道具区占据真实布局行,不覆盖棋盘。
此方案使用独立的棋子造型、轨道材质和控件样式,共用现有弯曲轨道玩法。审核页支持同时保留多套方案。
+60
View File
@@ -0,0 +1,60 @@
/* Flat gameplay items: solid fills, no shadows, bevels or highlights. */
.game-tool{--item-color:#7198D0;--item-edge:#FFFFFFB8;--item-radius:50%;--item-border:2px solid var(--item-edge);--item-size:64px}
.game-tool[data-tool=restart]{--item-color:#A28ACC;}
.game-tool[data-tool=hint]{--item-color:#EABB55;}
:is(.phone .phone-tools,body:not(.editing) .board-tools,.item-samples,.guide-tools) .game-tool{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;min-width:80px;min-height:96px;margin:0;padding:4px 0;background:none;color:inherit;border:0;box-shadow:none;border-radius:18px;line-height:1.2}
:is(.phone .phone-tools,body:not(.editing) .board-tools,.item-samples,.guide-tools) .game-tool>.item-face{position:relative;isolation:isolate;display:grid;place-items:center;width:var(--item-size);height:var(--item-size);padding:16px;flex:none;border:0;border-radius:var(--item-radius);background:none;filter:none;overflow:visible}
.game-tool .item-face::before{content:'';position:absolute;inset:0;z-index:-1;border-radius:inherit;border:var(--item-border);background:var(--item-color);box-shadow:none}
.game-tool .item-face>.ui-plate{display:none!important}
body:not(.editing) .game-tool .item-face>.ui-icon,.game-tool .item-face>.icon{width:32px;height:32px;margin:0;filter:var(--item-icon-filter,none)}
.game-tool[data-tool=hint]{--item-icon-filter:brightness(0) saturate(100%) invert(25%) sepia(20%) saturate(1391%) hue-rotate(357deg) brightness(93%) contrast(90%)}
:is(.phone .phone-tools,body:not(.editing) .board-tools,.item-samples,.guide-tools) .game-tool>b{font-size:13px;font-weight:650;letter-spacing:.04em;line-height:1.3}
:is(.phone .phone-tools,body:not(.editing) .board-tools) .game-tool:disabled{opacity:.5;cursor:default}
.game-tool .item-face>.item-glyph{width:32px;height:32px}.game-tool .item-face>.art-icon{filter:var(--item-icon-filter,none)}
body[data-design=vivid] .game-tool{--item-color:#00BEEA;--item-border:3px solid #30264C;--item-radius:50%}
body[data-design=vivid] .game-tool[data-tool=restart]{--item-color:#F62A83;}
body[data-design=vivid] .game-tool[data-tool=hint]{--item-color:#FFCE19;}
body[data-design=toy] .game-tool{--item-color:#187DCE;--item-border:3px solid #FFF5D9;--item-radius:24px}
body[data-design=toy] .game-tool[data-tool=restart]{--item-color:#E8523D;}
body[data-design=toy] .game-tool[data-tool=hint]{--item-color:#F5C637;}
body[data-design=animals] .game-tool{--item-color:#79945B;--item-border:3px solid #FFF9DE;--item-radius:44% 44% 36% 36%}
body[data-design=animals] .game-tool[data-tool=restart]{--item-color:#C1804C;}
body[data-design=animals] .game-tool[data-tool=hint]{--item-color:#D4B647;}
body[data-design=animals] .game-tool .item-face::after{content:'';position:absolute;top:7px;left:17px;right:17px;height:4px;border-radius:50%;border-top:2px dotted #FFFFFF95;pointer-events:none}
/* Reserve real rows for rotations and items so the canvas is truly centered
between the notification area and controls, including on short screens. */
body:not(.editing) .game-card{grid-template-rows:minmax(0,1fr) 76px 108px}
body:not(.editing) .rotation-controls{position:static;grid-row:2;grid-column:1/-1;display:flex;align-items:center;justify-content:space-around;padding:0 20px;gap:32px;pointer-events:auto}
body:not(.editing) .rotation-controls .rotate-button{min-height:68px;padding:0;gap:4px}
body:not(.editing) .rotate-button>.ui-icon{width:48px;height:48px}
body:not(.editing) .board-tools>.game-tool{grid-row:3;justify-self:center;width:100%}
.phone{grid-template-rows:44px 40px 64px minmax(0,1fr) 76px 108px}
.phone .rotations{position:static;grid-row:5;grid-column:1/-1;display:flex;align-items:center;justify-content:space-around;margin:0;padding:0 12px;gap:32px;pointer-events:auto}
.phone .rotations button{min-height:68px;padding:0;gap:4px}
.phone .rotations button>span{width:48px;height:48px}
.phone .phone-tools>.game-tool{grid-row:6;justify-self:center;width:100%}
@media(min-width:600px){.game-tool{--item-size:68px}body:not(.editing) .game-card{grid-template-rows:minmax(0,1fr) 80px 116px}.phone{grid-template-rows:44px 40px 64px minmax(0,1fr) 80px 116px}}
@media(max-height:600px){
.phone .game-tool,body:not(.editing) .game-tool{--item-size:56px}
body:not(.editing) .game-card{grid-template-rows:minmax(0,1fr) 62px 88px}
.phone{grid-template-rows:44px 40px 64px minmax(0,1fr) 62px 88px}
body:not(.editing) .rotation-controls .rotate-button,.phone .rotations button{min-height:58px}
body:not(.editing) .rotate-button>.ui-icon,.phone .rotations button>span{width:40px;height:40px}
:is(.phone .phone-tools,body:not(.editing) .board-tools) .game-tool{min-height:84px;gap:10px}
:is(.phone .phone-tools,body:not(.editing) .board-tools) .game-tool>.item-face{padding:12px}
}
/* Future inventory examples are documentation only; gameplay has no badges. */
.item-samples,.guide-tools{display:flex;justify-content:space-evenly;align-items:center;gap:16px;padding:16px 0 10px;text-align:center;color:var(--scene-ink,var(--ink,#273B50))}
.item-badge{position:absolute;right:-7px;top:-5px;z-index:2;display:grid;place-items:center;min-width:27px;height:27px;padding:0 7px;border:2px solid #FFFCF5;border-radius:14px;background:#334B60;color:white;font:750 12px/1 system-ui,sans-serif;box-shadow:none}
.item-badge.ad{right:-12px;min-width:42px;background:#5C478C;gap:3px;display:flex;align-items:center;justify-content:center;font-size:10px}
.item-badge.ad::before{content:'▶';font-size:8px}
.item-future{margin-top:28px;border-top:1px solid #273B5020;padding-top:24px}
.item-future h3{font-size:18px;margin:8px 0}.item-future p{font-size:12px;color:#56687A}
.item-future .item-samples{border-radius:20px;background:#E9EDE5;padding:22px 8px 16px;color:#273B50}
.item-spec{font-size:12px;line-height:1.9;color:#56687A}
.item-study{padding:44px 0;border-bottom:1px solid #273B5020;scroll-margin-top:80px}
.item-study-content{max-width:640px;margin:auto}.item-study-content>.item-samples{background:var(--scene-bg,#E9EDE5);border-radius:24px;padding:24px 12px 18px}
@media(max-width:380px){.item-samples,.guide-tools{gap:4px}.component-preview{padding:16px}.game-tool{min-width:72px}}
+5 -3
View File
@@ -16,16 +16,18 @@ button{transition-duration:var(--pressMs)}button:active:enabled{transform:scale(
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*::before,*::after{animation:none!important;transition:none!important}.pressed,button:active:enabled{transform:none!important}.rotate-example:active .icon{transform:none}dialog::backdrop{animation:none!important}}
@media print{.topbar,.hero-actions,.search-box,.status,.print-hidden,dialog{display:none!important}.page{max-width:none;padding:0}.hero{grid-template-columns:1fr 300px;padding:20px 0;gap:25px}.hero h1{font-size:36px}.section{padding:25px 0}.swatch-grid{grid-template-columns:repeat(4,1fr)}.card,.swatch,.icon-item,.pair-card,.type-sample{break-inside:avoid}.section-head{break-after:avoid}.table-scroll{overflow:visible}tr{break-inside:avoid}.spec h3{break-after:avoid}body{-webkit-print-color-adjust:exact;print-color-adjust:exact}.footer{padding-bottom:0}}
@media print{.swatch[hidden]{display:block!important}.empty{display:none!important}}
.mini-stars .icon.icon-star{filter:brightness(0) saturate(100%) invert(79%) sepia(85%) saturate(1450%) hue-rotate(350deg) brightness(105%) contrast(102%) drop-shadow(0 2px 1px #c88b2380) drop-shadow(0 0 7px #ffd45c99) drop-shadow(0 0 16px #ffe8a366)}
{{GAME_TOOLS_CSS}}
</style>
</head>
<body>
{{TILE_IMAGE}}
<header class="topbar"><div class="page"><a class="brand" href="#overview"><span></span>HEX TRAILS</a><nav class="nav" aria-label="设计手册目录"><a href="#colors">颜色</a><a href="#components">组件</a><a href="#icons">图标</a><a href="#type">排版</a><a href="#motion">动效</a><a href="#specification">完整规范</a></nav></div></header>
<main class="page">
<section class="hero" id="overview"><div><p class="eyebrow">视觉设计手册 · 1.0 / 2026.09.08</p><h1>让每一种颜色<br><span>各司其职。</span></h1><p>HEX TRAILS 的视觉语言:冷蓝灰承托环境,暖白勾勒棋盘,紫色强调操作。把最明快的颜色,留给棋子。</p><div class="scheme-strip" aria-label="核心配色"><span style="background:var(--background)"></span><span style="background:var(--board)"></span><span style="background:var(--utility)"></span><span style="background:var(--primary)"></span><span style="background:var(--tileYellow)"></span></div><div class="hero-actions"><a class="button primary" href="#colors">查看颜色体系</a><button class="button" id="print-guide">打印 / 存为 PDF</button></div><p class="hero-note">适用:游戏界面、手机触摸操作、Cocos 移植。<br>本文件可离线打开,包含完整规范与原始图片。</p></div><div><div class="phone-stage" aria-label="当前主界面静态组合示例"><div class="phone-top"><span class="icon-ground"><span class="icon icon-grid" aria-hidden="true"></span></span><span class="phone-level">LEVEL 02</span><span class="icon-ground"><span class="icon icon-gear" aria-hidden="true"></span></span></div><div class="phone-moves">剩余步数<b>{{MOVES}}</b></div>{{BOARD}}<div class="phone-rotate"><div><span class="icon icon-left" aria-hidden="true"></span><small>左转</small></div><div><span class="icon icon-right" aria-hidden="true"></span><small>右转</small></div></div><div class="phone-tools"><div class="demo-disabled"><span class="icon-ground"><span class="icon icon-undo" aria-hidden="true"></span></span><small>撤销</small></div><div><span class="icon-ground"><span class="icon icon-restart" aria-hidden="true"></span></span><small>重来</small></div><div><span class="icon-ground"><span class="icon icon-bulb" aria-hidden="true"></span></span><small>提示</small></div></div></div><p class="preview-caption">静态组合示意 · 使用实际关卡绘制与当前生成素材</p></div></section>
<section class="hero" id="overview"><div><p class="eyebrow">视觉设计手册 · 1.0 / 2026.09.08</p><h1>让每一种颜色<br><span>各司其职。</span></h1><p>HEX TRAILS 的视觉语言:冷蓝灰承托环境,暖白勾勒棋盘,紫色强调操作。把最明快的颜色,留给棋子。</p><div class="scheme-strip" aria-label="核心配色"><span style="background:var(--background)"></span><span style="background:var(--board)"></span><span style="background:var(--utility)"></span><span style="background:var(--primary)"></span><span style="background:var(--tileYellow)"></span></div><div class="hero-actions"><a class="button primary" href="#colors">查看颜色体系</a><button class="button" id="print-guide">打印 / 存为 PDF</button></div><p class="hero-note">适用:游戏界面、手机触摸操作、Cocos 移植。<br>本文件可离线打开,包含完整规范与原始图片。</p></div><div><div class="phone-stage" aria-label="当前主界面静态组合示例"><div class="phone-top"><span class="icon-ground"><span class="icon icon-grid" aria-hidden="true"></span></span><span class="phone-level">LEVEL 02</span><span class="icon-ground"><span class="icon icon-gear" aria-hidden="true"></span></span></div><div class="phone-moves">剩余步数<b>{{MOVES}}</b></div>{{BOARD}}<div class="phone-rotate"><div><span class="icon icon-left" aria-hidden="true"></span><small>左转</small></div><div><span class="icon icon-right" aria-hidden="true"></span><small>右转</small></div></div><div class="guide-tools">{{GAME_ITEMS_ROW}}</div></div><p class="preview-caption">静态组合示意 · 使用实际关卡绘制与当前生成素材</p></div></section>
<div class="principles"><article class="principle"><h3>01 · 先分角色,再选颜色</h3><p>环境、内容、操作与状态各有用途。同一层级的工具使用同一组颜色。</p></article><article class="principle"><h3>02 · 一个界面,一个重点</h3><p>紫色留给主要确认与选中状态;蓝灰工具安静地服务棋盘。</p></article><article class="principle"><h3>03 · 让信息看得清楚</h3><p>配对检查文字和图形的对比度;用文字、图标与反馈共同表达状态。</p></article></div>
<section class="section" id="colors" style="margin-top:60px"><div class="section-head"><div><span class="section-num">01 / COLOR</span><h2>有职责的色板</h2><p>点击色块复制 HEX。先看用途,再选颜色;不要把棋子色直接套到普通按钮上。</p></div><span class="pill">固定浅色主题</span></div><div class="search-box"><input id="color-search" type="search" placeholder="搜索颜色用途、Token 或 HEX" aria-label="搜索颜色"><span id="color-count"></span></div><div class="swatch-grid" id="swatches">{{SWATCHES}}</div><p class="empty" id="empty-colors" hidden>没有找到匹配颜色,请换一个关键词。</p><p class="note">棋子 HEX 是已接受图片的代表采样值,不保证每个像素完全一致。遮罩色含透明度,展示时会与手册底色混合。</p><div class="pair-grid"><div class="pair-card primary-pair"><b>下一关</b><p>主操作:紫底 + 白字<br>一张弹窗只放一个高强调主操作。</p><code>primary / onPrimary</code></div><div class="pair-card utility-pair"><b>提示</b><p>工具:蓝灰底 + 白色图标<br>选关、设置、撤销、重来、提示统一。</p><code>utility / onUtility</code></div><div class="pair-card warning-pair"><b>路线被挡住了</b><p>反馈:浅暖底 + 深警告色<br>搭配明确原因,不依赖颜色表达阻挡。</p><code>warningSurface / warning</code></div></div><h3>配对对比度</h3><p class="note" style="margin:0 0 20px">下表检查不透明 Token 配对:文字 4.5:1,必要图形 3:1。蓝棋子上的白箭头通过图形标准,不适合据此放白色小字。透明图标、阴影和真实字体仍需画面验收。</p><div class="table-scroll"><table class="pair-table"><thead><tr><th>实际配对</th><th>前景 / 背景</th><th>对比度</th><th>最低要求</th><th>Token 检查</th></tr></thead><tbody>{{PAIR_ROWS}}</tbody></table></div></section>
<section class="section" id="components"><div class="section-head"><div><span class="section-num">02 / COMPONENTS</span><h2>把规范放到控件上</h2><p>真实图标、明确层级和可识别状态。以下按钮可点击查看反馈,禁用示例确实不可点击。</p></div></div><div class="component-grid"><article class="card"><h3>操作层级</h3><div class="demo-row"><button class="button primary" data-feedback="主操作:primary / onPrimary">下一关 <span class="icon icon-play" aria-hidden="true"></span></button><button class="button" data-feedback="次操作:secondary / textPrimary">再走一遍</button></div><div class="demo-row"><button class="button utility" data-feedback="工具:utility / onUtility"><span class="icon icon-bulb" aria-hidden="true"></span>提示</button><button class="button utility demo-disabled" disabled><span class="icon icon-undo" aria-hidden="true"></span>撤销</button></div><p>网页禁用态是在正常控件上应用 55% 透明度。<code>disabled / onDisabled</code> 是原生参考色,二者不要混用。</p></article><article class="card"><h3>按压与键盘焦点</h3><div class="demo-row"><div class="demo-column"><button class="button utility" data-feedback="默认状态">提示</button><small>默认</small></div><div class="demo-column"><button class="button utility pressed" data-feedback="按压示意:缩放至 94%">提示</button><small>按压示意</small></div><div class="demo-column"><button class="button utility focus-demo" data-feedback="使用 Tab 键查看真实焦点">提示</button><small>焦点示意</small></div></div><p>按压反馈为 150ms。使用 Tab 键可查看真实焦点;轮廓与形状共同标识交互状态。</p></article><article class="card"><h3>旋转:留出呼吸空间</h3><div class="demo-row rotation-demo"><button class="rotate-example" data-feedback="左转控件:无矩形底板"><span class="icon icon-left" aria-hidden="true"></span>左转</button><button class="rotate-example" data-feedback="右转控件:无矩形底板"><span class="icon icon-right" aria-hidden="true"></span>右转</button></div><p>保留生成图标造型,放大显示并附文字。轮廓使用轻微蓝灰阴影;它不属于上面的纯色对比度检查。</p></article><article class="card"><h3>选中:颜色加状态文字</h3><div class="level-samples" aria-label="关卡选中状态演示"><button class="level-sample" aria-pressed="false">01<small>选择关卡</small></button><button class="level-sample" aria-pressed="true">02<small>当前关卡</small></button><button class="level-sample" aria-pressed="false">03<small>选择关卡</small></button></div><p>点击切换选中示例。普通关卡用中性底色和深色数字,当前关卡用紫底白字,并有明确状态。</p></article></div><article class="card tile-panel"><div>{{TILES}}</div><div><h3>四种棋子,一套规则</h3><p>使用当前棋子图片与共享圆角六边形遮罩,方向箭头沿用游戏绘制。颜色不代表功能、品质或阵营。</p><p><b>黄色必须使用深色箭头。</b><br>白箭头保留在蓝、粉、紫棋子上。各色棋子均通过位置、方向和运动判断。</p></div></article></section>
<section class="section" id="colors" style="margin-top:60px"><div class="section-head"><div><span class="section-num">01 / COLOR</span><h2>有职责的色板</h2><p>点击色块复制 HEX。先看用途,再选颜色;不要把棋子色直接套到普通按钮上。</p></div><span class="pill">固定浅色主题</span></div><div class="search-box"><input id="color-search" type="search" placeholder="搜索颜色用途、Token 或 HEX" aria-label="搜索颜色"><span id="color-count"></span></div><div class="swatch-grid" id="swatches">{{SWATCHES}}</div><p class="empty" id="empty-colors" hidden>没有找到匹配颜色,请换一个关键词。</p><p class="note">棋子 HEX 是已接受图片的代表采样值,不保证每个像素完全一致。遮罩色含透明度,展示时会与手册底色混合。</p><div class="pair-grid"><div class="pair-card primary-pair"><b>下一关</b><p>主操作:紫底 + 白字<br>一张弹窗只放一个高强调主操作。</p><code>primary / onPrimary</code></div><div class="pair-card utility-pair"><b>设置</b><p>导航:蓝灰底 + 白色图标<br>底部游戏道具使用更大的独立彩色底座。</p><code>utility / onUtility</code></div><div class="pair-card warning-pair"><b>路线被挡住了</b><p>反馈:浅暖底 + 深警告色<br>搭配明确原因,不依赖颜色表达阻挡。</p><code>warningSurface / warning</code></div></div><h3>配对对比度</h3><p class="note" style="margin:0 0 20px">下表检查不透明 Token 配对:文字 4.5:1,必要图形 3:1。蓝棋子上的白箭头通过图形标准,不适合据此放白色小字。透明图标、阴影和真实字体仍需画面验收。</p><div class="table-scroll"><table class="pair-table"><thead><tr><th>实际配对</th><th>前景 / 背景</th><th>对比度</th><th>最低要求</th><th>Token 检查</th></tr></thead><tbody>{{PAIR_ROWS}}</tbody></table></div></section>
<section class="section" id="components"><div class="section-head"><div><span class="section-num">02 / COMPONENTS</span><h2>把规范放到控件上</h2><p>真实图标、明确层级和可识别状态。以下按钮可点击查看反馈,禁用示例确实不可点击。</p></div></div><div class="component-grid"><article class="card"><h3>操作层级</h3><div class="demo-row"><button class="button primary" data-feedback="主操作:primary / onPrimary">下一关 <span class="icon icon-play" aria-hidden="true"></span></button><button class="button" data-feedback="次操作:secondary / textPrimary">再走一遍</button></div><div class="demo-row"><button class="button utility" data-feedback="工具:utility / onUtility"><span class="icon icon-gear" aria-hidden="true"></span>设置</button><button class="button utility demo-disabled" disabled><span class="icon icon-grid" aria-hidden="true"></span>选关</button></div><p>网页禁用态是在正常控件上应用 55% 透明度。<code>disabled / onDisabled</code> 是原生参考色,二者不要混用。</p></article><article class="card"><h3>按压与键盘焦点</h3><div class="demo-row"><div class="demo-column"><button class="button utility" data-feedback="默认状态">设置</button><small>默认</small></div><div class="demo-column"><button class="button utility pressed" data-feedback="按压示意:缩放至 94%">设置</button><small>按压示意</small></div><div class="demo-column"><button class="button utility focus-demo" data-feedback="使用 Tab 键查看真实焦点">设置</button><small>焦点示意</small></div></div><p>按压反馈为 150ms。使用 Tab 键可查看真实焦点;轮廓与形状共同标识交互状态。</p></article><article class="card"><h3>旋转:留出呼吸空间</h3><div class="demo-row rotation-demo"><button class="rotate-example" data-feedback="左转控件:无矩形底板"><span class="icon icon-left" aria-hidden="true"></span>左转</button><button class="rotate-example" data-feedback="右转控件:无矩形底板"><span class="icon icon-right" aria-hidden="true"></span>右转</button></div><p>保留生成图标造型,放大显示并附文字。轮廓使用轻微蓝灰阴影;它不属于上面的纯色对比度检查。</p></article><article class="card"><h3>选中:颜色加状态文字</h3><div class="level-samples" aria-label="关卡选中状态演示"><button class="level-sample" aria-pressed="false">01<small>选择关卡</small></button><button class="level-sample" aria-pressed="true">02<small>当前关卡</small></button><button class="level-sample" aria-pressed="false">03<small>选择关卡</small></button></div><p>点击切换选中示例。普通关卡用中性底色和深色数字,当前关卡用紫底白字,并有明确状态。</p></article></div><article class="card" style="margin-top:24px"><h3>游戏道具:独立于顶部导航</h3>{{GAME_ITEMS}}<p>棋盘以通知区和旋转区之间的可用区域为中心,上下留白相等。旋转、道具分行排列,不覆盖棋盘。</p></article><article class="card tile-panel"><div>{{TILES}}</div><div><h3>四种棋子,一套规则</h3><p>使用当前棋子图片与共享圆角六边形遮罩,方向箭头沿用游戏绘制。颜色不代表功能、品质或阵营。</p><p><b>黄色必须使用深色箭头。</b><br>白箭头保留在蓝、粉、紫棋子上。各色棋子均通过位置、方向和运动判断。</p></div></article></section>
<section class="section" id="icons"><div class="section-head"><div><span class="section-num">03 / ASSETS</span><h2>同一套图标,同一套语气</h2><p>当前使用的 16 个生成图标,按实际图形边界裁成正方形并等比居中。这里保留原始 PNG 的像素与造型。</p></div><span class="pill">原图 1254 × 1254</span></div><div class="icon-grid">{{ICONS}}</div><p class="note">原图:<code>ui-icons-generated.png</code>;裁切:<code>src/ui-skin.js → ICONS</code>。不要用代码重绘版、字符或另一套图标替换。透明边缘仍需实机验收。</p></section>
<section class="section" id="type"><div class="section-head"><div><span class="section-num">04 / TYPOGRAPHY & SPACING</span><h2>简单、有秩序的细节</h2><p>文字靠尺寸和字重建立层级,辅助文字仍保持可读对比。以下字号是游戏控件规范,手册正文为阅读做了适当放大。</p></div></div><div class="type-layout"><div><div class="type-sample"><b style="font-size:28px">LEVEL 02</b><code>28px / 粗体</code></div><div class="type-sample"><b style="font-size:32px">9</b><code>步数 32px / 粗体</code></div><div class="type-sample"><b style="font-size:24px">漂亮,全部过关!</b><code>标题 24px</code></div><div class="type-sample"><span style="font-size:14px">轻点箭头,沿着轨道出发。</span><code>正文 13–14px<br>行高 1.75</code></div><div class="type-sample"><span style="font-size:12px">撤销 · 重来 · 提示</span><code>标签 12–13px</code></div></div><div><h3>4px 基础间距</h3><div class="space-row" aria-label="4、8、12、16、24、32 像素间距"><span style="--space:4px" data-size="4"></span><span style="--space:8px" data-size="8"></span><span style="--space:12px" data-size="12"></span><span style="--space:16px" data-size="16"></span><span style="--space:24px" data-size="24"></span><span style="--space:32px" data-size="32"></span></div><h3 style="margin-top:40px">统一圆角</h3><div class="shape-row"><div class="shape" style="border-radius:8px">8px<br>小角标</div><div class="shape" style="border-radius:14px">14px<br>控件</div><div class="shape" style="border-radius:24px">24px<br>弹窗</div></div><p class="note">常规触摸区至少 44 × 44px。中文使用 PingFang SC / Microsoft YaHei;原生端如需一致字宽,须统一授权字体资源。</p></div></div></section>
<section class="section" id="motion"><div class="section-head"><div><span class="section-num">05 / MOTION</span><h2>轻快地出现,清楚地反馈</h2><p>打开演示,查看遮罩、弹窗入场和三颗星星的顺序。遵循系统“减少动态效果”设置。</p></div></div><div class="motion-layout"><div class="motion-preview"><div class="mini-modal"><div class="mini-stars" aria-hidden="true"><span class="icon icon-star"></span><span class="icon icon-star"></span><span class="icon icon-star"></span></div><h3>漂亮,全部过关!</h3><button class="button primary" id="show-motion">播放弹窗动效</button></div></div><div class="timings"><div class="timing"><span>按钮按压</span><b>150 <small>ms</small></b></div><div class="timing"><span>弹窗从上方进入</span><b>420 <small>ms</small></b></div><div class="timing"><span>星星依次开始</span><b><small>300 / 490 / 680 ms</small></b></div><div class="timing"><span>碰撞反馈总长</span><b>1250 <small>ms</small></b></div><p class="note">碰撞顺序:接近 → 接触停顿与阻挡棋子轻震 → 原路弹回。该顺序在游戏中执行,此处只演示弹窗;游戏音效在首次手势后启动,可在设置关闭。</p></div></div></section>
+1 -1
View File
@@ -196,7 +196,7 @@
"modalMs": 420,
"starStartMs": 300,
"starGapMs": 190,
"collisionMs": 400,
"collisionMs": 800,
"rotationMs": 240,
"exitMsPerUnit": 120,
"exitRampMs": 80,
+266
View File
@@ -0,0 +1,266 @@
# HEX TRAILS · 1000 关制作体系与难度曲线
讨论稿 · 2026-09-12
本方案以现有规则和[新版设计准则](level-design-principles-v2.md)为基础:箭头决定起步、轨道决定后续路线;底盘旋转时棋子与箭头不动;成功消除减少占用,试路和旋转免费,保留撤销与快速连点。正文保留制作前的方案与假设,不替代实际验收记录。
实施更新(2026-09-12):已据此制作独立 v0.5 千关首版,20 章 × 50 关。完整规则求解、每关 20 种策略、核心放行与主长路门槛已通过;原操作运行时和历史版本保留。实际配额、逐关证据、静态审阅及浏览器样本见[千关制作报告](v0.5-production-report.md)。真人连续章节试玩、熟练度曲线与长期疲劳仍未校准;客户端当前按章展示,但一次读取完整关卡模块,尚未实现按章下载。
**目标是让玩家持续体验“看得懂的发现、轻巧的释放、值得观看的长路和有变化的图案”。平均推理负担在中期趋稳,后半程通过组合、空间形态和释放过程持续提供新内容。**
下文的关数配额、难度档位、频率和检查数量均为首轮生产假设,需由基准样关、连续章节试玩和实际玩家数据校准;不是已经验证的满意度、留存或真人难度结论。
研究补充(2026-09-12):已完成[论文与竞品调研报告](level-design-research-report.md),并建立[关卡设计知识库](level-design-knowledge/README.md)。研究支持意图/空间共同生成、分类候选库与独立编排的方向;本文精确配额继续作为试验假设。“后期平台”应理解为目标玩家体感的校准目标,不能固定结构难度而忽略熟练度提高;花瓣关也允许空间草图与体验关系共同输入。具体论据、限制和修正见报告第 7 节。
## 1. 从已有实验保留什么,先改什么
已有成果:
- v0.4 的 20 关已有固定制作来源、最少旋转参考解、作者体验解、真实路径统计,以及清挡、反差和往返旋转的具体断言。参考解含 199 次消除、89 条至少 6 弯的路径;“6 弯”只是该批样关的统计口径。
- 花形实验已证明可以先设计实际路线,再连接环带、布置棋子。其 91 格、十二瓣与三道环带有 177 段强调连接参与参考解;最长离场为 59 个格步骤、37 弯。
- 现有模型、扫掠碰撞、求解器、反向布子、连点队列和回放能力均应复用。
首先修正评价与生成顺序:
1. `src/core.js` 的 `analyze.score` 仍把长路两项合计最多计入 34 分。当前首关 4 枚棋子全可出、无需旋转,仍得到 34 分/“进阶”。不能拿这个总分排序 1000 关。
2. `src/experience-generator.js` 仍先随机配轨,再偏向长路径选择棋子。它适合提供布子候选,不能独自保证有形状的路线、清楚的放行关系或不同的关内节奏。
3. 不同种子、不同布局甚至同样可解,都不代表不同体验。现在需要增加体验差异评审和整段节奏编排。
## 2. 每关分别记录四个维度
| 维度 | 真正要看什么 | 在制作中如何使用 |
| --- | --- | --- |
| 推理负担 | 找到下一步需要辨认什么因果;是否需要预判换路;关键关系是否跨区 | 决定难度档位和章节位置 |
| 视觉辨认负担 | 轨道能否跟随、交叉是否清楚、阻挡是否能解释、关键棋子是否被埋没 | 决定可读性是否合格,不能当作加难奖励 |
| 操作与播放量 | 成功点击、重复清理、空转、真实动画长度、相似路径反复播放、队列等待 | 控制单关与相邻关的疲劳 |
| 观看与释放回报 | 长巡游的空间展开、轻巧反差、一次放开一组、图案逐步显现 | 决定本关为什么值得玩,以及什么时候兑现 |
四项分别记录,不重新揉成一个“质量总分”。长路长度是观赏内容和可能的跟线负担,不能自动变成推理难度。清楚的 A→B→C 不一定难;若多个合法选择效果等价,也不能把选择多当作深推理。
求解器的状态数、最少旋转数、释放波次只作结构诊断。难度档位先用基准关对照判断,再用同类玩家的实际表现校准。
## 3. 难度档位与 1000 关总体分布
| 档位 | 预期体验 | 初始预算 |
| --- | --- | ---: |
| D1 | 看见就能启动;可以有很丰富的长绕行 | 150 |
| D2 | 找一个清楚的挡子,或理解一次直接换路 | 350 |
| D3 | 组合两段熟悉关系,例如清挡后换路、不同区域依次放行 | 350 |
| D4 | 少量跨区关系或旋转选择,需要主动观察,但关键变化可解释 | 130 |
| D5 | 少量后期综合挑战;判断更深入,仍保持线索、试路与可恢复性 | 20 |
| 合计 | 轻松约 50%,适中约 35%,挑战约 15% | 1000 |
这是内容预算,不要求把每个候选强行塞入某档。若实际试玩与设计评级不一致,重排、修改或淘汰候选。
**全程保留轻松关。第 800 关的玩家仍应经常获得“我已经很熟练,轻轻一动就通了”的体验。第 1000 关可以是漂亮的庆祝关,不要求它成为最难的一关。**
### 五个制作阶段
采用 20 章 × 50 关管理,每章内部使用长度错开的 6–10 关小段。章节有主要路线语汇,但需交叉使用多种形态,不连续做 50 关同一朵花。
| 范围 | 主要内容进展 | 难度方向 |
| --- | --- | --- |
| 1–50 | 建立点击、转弯、交叉不换轨、清挡和转盘的直觉;前 10 关就看到长巡游、轻巧反差与有层次的图案 | D1–D2 为主,一次突出一个理解点 |
| 51–200 | 熟练区分箭头与出口,理解一枚让一组、清挡再转、简单分段释放 | 逐步增加 D3,少量 D4 |
| 201–500 | 跨区连接、内外层穿行、转过去再回来、多个熟悉结构组合 | 推理基线缓慢增加,保留大量舒缓内容 |
| 501–800 | 用不同路线形态和不同放行时机重组熟悉规则;加强作品关 | 平均负担趋稳,少量 D5 |
| 801–1000 | 熟练感、旧主题的新连接、跨主题组合与阶段庆祝 | 主要增加内容变化,保持难度平台 |
预算展开如下,用于检查前后期是否真的有变化,而非作为发布前的机械排号规则:
| 范围 | D1 | D2 | D3 | D4 | D5 | 合计 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
| 1–50 | 25 | 20 | 5 | 0 | 0 | 50 |
| 51–200 | 30 | 60 | 50 | 10 | 0 | 150 |
| 201–500 | 35 | 110 | 115 | 40 | 0 | 300 |
| 501–800 | 35 | 100 | 110 | 45 | 10 | 300 |
| 801–1000 | 25 | 60 | 70 | 35 | 10 | 200 |
| 合计 | 150 | 350 | 350 | 130 | 20 | 1000 |
### 小段曲线示例
一个成熟期十关片段可以是:
**D2 → D2 → D3 → D3 → D2 → D3 → D4 → D1 → D3 → D2**
| 相对关位 | 主体验 | 推理档 |
| --- | --- | --- |
| 1 | 熟悉入口,直接放出一条跨盘长路 | D2 |
| 2 | 朝内起步却能沿轨直接出去,兑现路径反差 | D2 |
| 3 | 理解两个区域的占用关系,分别让路后释放内层长路 | D3 |
| 4 | 清理一侧后换路,让另一侧开始放行 | D3 |
| 5 | 路线有层次的花纹关,关键动作很少 | D2 |
| 6 | 回访熟悉形态,但关键挡子换到另一区域 | D3 |
| 7 | 两个区域的因果关系组合成局部挑战 | D4 |
| 8 | 出口大方开放,轻松观看长巡游 | D1 |
| 9 | 转到另一侧清挡、再转回来,放出朝内目标 | D3 |
| 10 | 图案逐步展开,以顺畅巡游收束 | D2 |
第 7 关的推理高点之后,第 8 关立即减轻判断;第 10 关的观赏高潮无需同时成为难度高潮。不同小段要改变峰值位置、长度、释放方式和形态,不能让玩家猜到“每第七关一定难”。
示例中的 D3 意图是让玩家理解组合关系;若实际画面使动作一眼明确、无需组合判断,试玩后应下调档位,不能仅因转了两次或长路较多坚持评为 D3。
## 4. 内容预算:体验主角与路线形态分开安排
每关只设一个主体验,其他爽点作为辅助。首轮 1000 关预算:
| 主体验 | 关数 | 主要任务 |
| --- | ---: | --- |
| 直接巡游 | 240 | 让长路本身成为可立即获得的奖励 |
| 清挡放行 | 260 | 移走关键棋子,清楚地放出后续长路或一组棋子 |
| 轻巧反差 | 220 | 用很少的动作解决第一眼觉得棘手的目标 |
| 旋转换路与分段释放 | 180 | 改变出路关系,交替清理与观看 |
| 综合收束 | 100 | 组合已学内容,组织完整开局、中段和漂亮收尾 |
| 合计 | 1000 | |
形态、长路和旋转是可重叠标签,不与上述主体验类别相加。初始目标为:
- 约 800 关包含至少一段经过实际回放审阅、值得跟随的长巡游。按路线家族制定制作带,不统一用“≥6 弯”或“≥18 弯”判断全部内容。
- 约 200 关具有可辨认的花瓣、环纹、星芒、编织或其他有秩序的路线图案;其中约 60 关作为重点精修作品,其余融入日常关卡。
- 约 600 关让旋转承担实际放行作用。旋转角色应变化,不给每关硬凑转数。
- 轻巧反差除作为 220 关的主角,也可以出现在其他类型的中段或收尾。
这些标签不能仅由作者声明。长路需要实际行驶证据,反差需要改变前后的路线证据,图案需要完整画面与实际路线参与证据。
### 长路怎样不腻
轮换绕中心、横跨棋盘、内外层穿梭、左右区域交换、花瓣往返等空间过程。关注整关路线分布与重复覆盖,不能只追求单条最大弯数。
一关可以用少量主角长路配若干有用的短出口。短路负责开局、让路和即时反馈;无需每枚都走最长路线。轻松巡游关则可以让多条各有观感的路线直接畅通。
保留完整行驶与原游戏速度逻辑。若连续点选后出现疲劳,先审查是否把相同长路重复过多、是否缺少新的放行变化,再讨论交互;不要把动画时间一概当作等待,也不要用慢放增加内容长度。
### 反差怎样不变成公式
至少轮换以下来源:朝内却直接出去;中央棋子比边缘棋子容易释放;外表复杂的图案只需一个关键动作;清掉一枚后整组畅通;旋转一次接上另一侧出口。
简单动作后立即兑现目标。若还要清三层阻挡,就不应把该目标作为“轻巧反差”宣传。
玩家学会“一转就出”后,再遇相同关系可能主要获得熟练感。这个内容仍有价值,但应按复习或舒缓编排,不能把重复套路持续算作新惊喜。
### 图案怎样承担不同玩法
同样的重瓣花语汇可以形成不同作品,但必须重新设计路线连接和放行关系:
| 花形变体意图 | 关键动作 | 玩家实际看到什么 |
| --- | --- | --- |
| 舒缓巡游 | 少量棋子直接启动 | 从内层沿不同花瓣向外展开 |
| 清挡放行 | 一个短出口先让开 | 花心中的目标穿过内外层长路 |
| 轻巧反差 | 一次旋转后点朝内棋子 | 起步方向未变,却从另一片花瓣绕出 |
| 分段组合 | 清一侧、换路、再放另一侧 | 花纹逐段显现,最后顺畅收束 |
早期图案可以维持丰富、有秩序的路线,通过减少需要判断的阻挡关系降低难度,不必退回稀疏的几根花瓣线。后期图案也不默认增加棋子数量或让人盲目跟线。
## 5. 把生成器升级为按体验制作
目标流程:
**制作卡 → 路线与放行骨架 → 约束构造与反向布子 → 补齐轨道 → 自动验证与多策略回放 → 差异筛选 → 章节编排 → 试玩校准。**
### 5.1 制作卡必须先于种子
每张卡至少说明:
- 主体验、目标难度、路线家族、章节角色。
- 关键棋子是谁,第一眼预期是什么。
- 哪个点击或旋转改变谁的出路。
- 奖励在开局、中段还是收尾发生。
- 哪些长路、哪些连接必须保留。
- 和相邻关、同一母版前例有什么实质区别。
示例:“中期 D2;重瓣图案;外侧短出口释放一枚朝内目标;目标沿内外花瓣离场;关键奖励在前半段兑现;其余棋子提供顺畅收尾。”
### 5.2 先设计运动与因果,再求具体布局
把路线构造与棋子布置拆成可协作的两部分:路线决定形态和运动内容;放行骨架决定清挡、旋转和阶段关系。先保留关键端口和出口,再用约束搜索、反向布子和局部修改找到可实现布局;无法实现就改卡或换结构,不在后面编造标签。
常用放行结构包括独立出口、一枚让一条、一枚让一组、多个区域分别放行、换向连接、去一侧清理再返回。不同结构可以组合,但不把清楚的因果链简单计成难度。
图案应优先做在真实轨道内部。现有全盘旋转要求底格集合旋转后仍然合法,不能任意裁成轮廓而破坏规则。颜色和装饰不参与路线规则。
反向布子时保存完整的构造解,再用求解器和实际回放交叉核验。补齐剩余端口时保持完整配对,并重新检查是否改变主路径、形成意外闭环或引入难解释的碰撞。
### 5.3 用路线家族和体验母版支撑数量
先验证约 8–12 类路线构造方式,例如回廊、中心绕行、双区穿梭、内外环带、回折、编织、放射、单瓣/重瓣、波纹和左右镜像图形。每类再形成不同放行关系和节奏的体验母版。
中期目标是积累约 60–80 套经过审阅的体验母版,探索多个有效变体。不要规定每套必须产出同样数量;母版没有新变化就停,数量缺口用新增结构补齐。
一个变体至少需要改变两个影响体验的维度,其中至少一个涉及真实路线组织或放行关系。只改颜色、名称、镜像、全局旋转,或添加几枚无作用的直出棋子,不算充分的新内容。
### 5.4 候选池按类别竞争
按“主体验 × 推理档 × 路线家族 × 释放阶段”保留不同候选,各自在相近类别中比较清晰度和回报。不要按一个全局分数取前 1000 名,否则容易留下大量相同风格的长路关。
对每个目标位置可以从数十个候选开始搜索,记录通过率、淘汰原因和计算成本。稀缺类别扩充路线模板;候选不足时不降低正确性、可读性和体验门槛。是否需要上百个候选,以实际产率决定。
## 6. 去重与防疲劳
两层一起做:
1. **布局去重。** 忽略名称、ID、颜色,将整局场景连同棋子、箭头一起旋转/镜像归一。仅转底盘会改变玩法,不能因此把两个不同状态当作同一个布局。
2. **体验近似检查。** 比较关键放行关系、成功路径形态、旋转节奏、开局入口、关键奖励出现时机,以及完整行驶的重复程度。
编排初始规则:同一关键套路不连续用三关;同一具体母版的近似变体初始间隔约 30 关;刻意的教学重复在制作卡中说明目的。这些规则需随试玩调整,不能替代连续游玩评审。
每 50 关都要回答:这一章增加了什么可感知的新内容?哪些关虽然布局不同,却玩起来相同?若回答不清楚,该批次尚未完成。
## 7. 四道入库验收
### A. 规则正确性:全部 1000 关覆盖
格式、端口、旋转坐标合法;完整构造解与参考解回放通关;实际扫掠碰撞、交叉不换轨、撤销、免费试路和连点一致。搜索到上限只能记录为未确定,不能当作困难但已验证。
对替代合法操作检查仍可继续完成。当前规则下成功消除只减少占用、旋转可恢复,不能人为制造“正确消除后反而无解”的惩罚。
### B. 体验证据:全部 1000 关覆盖
记录实际成功路径的几何长度、格步骤、转弯与空间展开;记录清挡和旋转改变了谁的出路;记录主奖励出现阶段。图案关检查强调连接的参与情况与闭环,不能由装饰线撑起形状。
检查第一段回报是否过晚、收尾是否重复、反差目标是否兑现。记录完整播放量和相似路径重复度,不能只看最大长路。
### C. 自然玩法覆盖与差异:全部 1000 关覆盖
为外圈优先、短路优先、长路优先、较早旋转、顺着局部连续点选等代表策略做回放,并加入随机扰动。初始按每关至少 20 轮设计检查量;新母版、图案、挑战和异常关加密检查。
除了通关,还要统计这些策略是否仍能看到主长路和关键放行。若关键奖励只存在于作者指定顺序中,修改布局、调整奖励位置或重新归类。可先把约 80% 代表回放能遇到主奖励作为复审参考线,待样关确认;这不是对真实玩家曝光率的保证。
对关键转盘前后、可能发生格外接触的区域进行额外检查。抽样覆盖必须标明范围,不能宣称穷尽全部玩家行为。
### D. 人工审阅与真人校准
每关都应有画面/回放审阅记录;所有新母版、重点图案和挑战关要完整手玩,常规变体做分层实玩抽检,章节要连续试玩。
真人测试重点关注是否愿意跟完路线、是否理解放行因果、是否认出图案、反差是否成立、连续几关是否感到重复。不能把“全部自动通过”表述为“全部已证明好玩”。
首轮可以用小规模新手与熟练玩家发现明显问题;样本充足后再估难度和行为分布。记录主动思考、路线动画、错误原因、空转、提示与重开、退出位置,并按玩家熟练度和设备区分。初期不统一给全体关卡设定未经标定的通关秒数或成功率门槛。
## 8. 量产工具与稳定运行
制作侧需要一张可筛选的关卡总表:缩略图、体验卡、难度档、实际路线摘要、参考解、替代策略报告、近似关、审阅状态、版本信息。支持直接观看关键放行前后与整段回放,减少在 JSON 和游戏界面之间来回查找。
所有关卡使用同一套运行时、输入、连点、碰撞、动画与撤销。不同图案作为数据与绘制配置,不另写不同的操作逻辑。
发布包应冻结关卡快照,并保留关卡稳定 ID、关卡修订号、规则/生成器/模板版本、种子与制作参数。仅保存种子不能保证生成器更新后仍生成同一关。序号与稳定 ID 分开,更新已发布关卡时检查存档兼容。
生成和筛选离线完成,客户端按章节加载已验证数据;不让玩家进入每一关时等待大规模生成或求解。棋盘大小由手机可点性、可读性和体验需要决定,当前引擎最大 127 格是边界,不是后期制作目标。
## 9. 实施顺序与完成标准
| 阶段 | 具体产出 | 继续扩量的前提 |
| --- | --- | --- |
| 50 个基准样关 | 覆盖不同体验、形态和难度,含后期候选;不等同于主线前 50 关 | 分离难度与回报的评价成立,新母版能兑现制作卡 |
| 完整前 100 关 | 两个连续章节、稳定制作卡和审阅工具 | 教学、反差、长路和难关后释放在连续试玩中成立 |
| 扩到 300 关 | 扩充母版、自动验证与差异检查 | 常规生成产率可接受,不能靠几个模板反复填数 |
| 扩到 600 关 | 验证成熟期的平台曲线与跨章变化 | 熟练玩家在多次游玩后仍能感到变化,播放量没有持续疲劳 |
| 扩到 1000 关 | 按每 50 关完成验收包,组织后期回访与最终庆祝 | 全部规则与体验证据齐全,逐关审阅、分层试玩和整段节奏检查完成 |
先完成评价拆分、路线/放行骨架、差异筛选和统一运行时这几项生产能力,再扩大布局数量。整套工程量和候选倍率应在首批样关测量后估算,不以“生成 1000 个文件很快”推断 1000 个关卡的制作成本。
初始讨论阶段的产出是制作方案;目前已经完成可玩千关首版。本文中的真人校准、连续长线体验和满意度目标仍需实测,不能仅凭首版数量与自动通过宣称全部成立。
## 10. 方法参考与项目依据
以设计者预先定义的目标组织具体空间结构,可参考 [Mixed-Initiative Design of Game Levels: Integrating Mission and Space into Level Generation](https://research.hva.nl/en/publications/mixed-initiative-design-of-game-levels-integrating-mission-and-sp/)。保留多个不同类型的优质候选、在相近类别中比较,而不是只优化单一总分,可参考 [Procedural Content Generation through Quality Diversity](https://antoniosliapis.com/articles/pcgqd.php)。本项目先采用可解释的约束构造和分类候选池,无需为了使用这些思路先引入强化学习系统。
上述研究提供方法参考,不证明本文配额、难度曲线或 HEX TRAILS 的玩家体验已经成立。项目自身依据为 [新版准则](level-design-principles-v2.md)、[v0.4 回放报告](v0.4-experience-review.md)、[花形实验](flower-study.md)、[生成器](../src/experience-generator.js)、[规则与评分](../src/core.js)及对应测试。
+20 -8
View File
@@ -1,6 +1,6 @@
# 关卡版本
在游戏左上角打开选关窗口,通过“关卡版本”切换。首次打开默认使用 v0.3;选择其他版本后会记住选择。各版本有独立的上次选关位置与通关记录。切换时重新开始目标版本上次选择的关卡,不保存进行到一半的棋盘。
在游戏左上角打开选关窗口,通过“关卡版本”切换。首次打开默认使用 v0.5;已保存的版本选择继续保留,不强制迁移。各版本有独立的上次选关位置与通关记录。切换时重新开始目标版本上次选择的关卡,不保存进行到一半的棋盘。
原始版本的设计理念、案例和逐关结构清单见 [v0.1 · 最初 24 关设计理念](v0.1-design-philosophy.md)。本文记录版本管理;两者共同为后续优化提供参照。
@@ -8,32 +8,44 @@
| --- | --- | ---: | --- | --- |
| 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` 生成的当前主线 |
| v0.3 · 弯轨观察版 | 弯轨教学与观察版本 | 48 | 8 章 × 6 关 | `levels/campaign-seeds.json`;发布快照归档于 `levels/versions/v0.3.json` |
| v0.4 · 长路与惊喜 | 长路巡游、轻巧反差、清挡与往返换路体验版 | 20 | 4 组 × 5 关 | `levels/v0.4-seeds.json`,生成 `levels/v0.4.json` |
| v0.5 · 千段轨迹 | 六类形态 × 五种体验交替编排 | 1000 | 20 章 × 50 关 | `levels/v0.5-recipes.json`,冻结 `levels/v0.5.json` |
版本号指关卡布局。三版统一使用当前界面、碰撞检测、免费旋转、免费失败试路与撤销规则;没有恢复旧版代码或扣除旋转额度的规则。旧版文件的 `moveLimit` 原样保留,游戏主界面仍显示待解棋子数。JSON 内的 `version: 1` 是数据格式版本,与 v0.1 等布局版本号无关。
版本号指关卡布局。五版统一使用当前界面、碰撞检测、免费旋转、免费失败试路与撤销规则,包括快速连点与多枚同时离场。旧版文件的 `moveLimit` 原样保留,游戏主界面仍显示待解棋子数。JSON 内的 `version: 1` 是数据格式版本,与 v0.1 等布局版本号无关。
v0.1 的旧闭环与扫掠阻挡也原样保留,可以通过旋转和消除找到解答。24 关与 v0.2 的 48 关均已在当前引擎中求解并完整回放。v0.3 的“每关至少 65% 参考消除路径经过弯道”等发布门槛仅适用于该版,不套用于历史布局。
v0.4 按[新版关卡设计准则](level-design-principles-v2.md)单独制作,全部 20 关同时验证最少旋转参考解和完整体验解。反差关的体验解会直接旋转并启动朝内目标,可能与求解器先清除所有可出棋子的次序不同。逐关关键棋子、路径与验收范围见 [v0.4 体验报告](v0.4-experience-review.md)。
v0.4 选关按钮展示“长路巡游、轻巧反差、清挡放行”等体验类型;旧版继续展示原难度标签。结构分仍保留在分析中,但不将长路线直接等同于高推理难度。
v0.5 选关按章显示,每页 50 关,可直接输入关号;`?campaign=v0.5&level=1000` 可直达第 1000 关。难度采用独立的结构预估,不把长路转弯数加入难度分。每关验证独立最少旋转解、作者解和 20 种策略;六种核心策略与十四种随机探索共同验收,按组记录,均不是玩家概率。[制作报告](v0.5-production-report.md)和[审核页](http://localhost:4173/labs/campaign-review/index.html)记录具体范围。
## 归档与生成
- `levels/versions/v0.1.json`、`v0.2.json` 是对应 Git 文件的原始字节,不重新序列化。
- `levels/versions/v0.1.json`、`v0.2.json`、`v0.3.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` 校验并同步历史模块,三版均进入静态站点。
- `src/campaign-versions.js` 注册版本、章节、关卡模块与旧存档键;`src/levels.js` 保持 v0.3 接口,供原生成器、设计指南与 Cocos 示例使用;`src/levels-v04.js` 暴露 v0.4,浏览器默认选择由版本注册表决定。
- `npm run levels` 重新生成 v0.3,再同步历史模块。`npm run levels:v04` 从新制作卡生成 20 关、双方案回放数据和体验报告。
- `npm run levels:v05` 从确定性制作计划生成 1000 关;`npm run levels:v05:verify` 检查源码指纹、逐关重新求解与完整回放。
- `npm run build` 校验历史归档、生成并验证 v0.4、验证冻结 v0.5,五版均进入静态站点。各版布局来源相互独立。
后续发布新的布局版本时,先将当前主线与出处归档、登记哈希,再在注册表中添加新版本并更新默认版本。为新版本分配新的存档键,不复用旧版完成记录。历史归档保持不变;为历史布局改版应另发版本,不能直接覆盖。
## 进度隔离与迁移
版本选择保存在 `hex-trails-campaign-version`,各版进度保存在 `hex-trails-campaign-v0.1`、`hex-trails-campaign-v0.2`、`hex-trails-campaign-v0.3`。旧键仅在对应新键不存在时读取,写入新键,不删除或覆盖旧数据。
版本选择保存在 `hex-trails-campaign-version`,各版进度保存在 `hex-trails-campaign-v0.1`、`hex-trails-campaign-v0.2`、`hex-trails-campaign-v0.3`、`hex-trails-campaign-v0.4`。旧键仅在对应新键不存在时读取,写入新键,不删除或覆盖旧数据。v0.4 使用新存档槽,不读取旧版完成记录。
| 目标版本 | 对应旧存档键 |
| --- | --- |
| v0.1 | `hex-trails-v2` |
| v0.2 | `hex-trails-observe-v3-r1`(若存在),否则 `hex-trails-observe-v3` |
| v0.3 | `hex-trails-observe-v3-r2` |
| v0.4 | 无,独立新存档 |
| v0.5 | 无,使用 `hex-trails-campaign-v0.5` 独立新存档 |
v0.2 与 v0.3 内部关卡 ID 相同但布局不同,完成记录只按版本隔离,不能按 ID 合并。非法版本回到默认版本,越界关卡索引回到该版第一关,完成列表过滤越界值和重复值。浏览器不允许保存时,当前页面仍可切换并保留各版进度,刷新后无法保留。
自动测试验证历史文件与模块一致、72 关完整回放、版本数量与章节、默认选择、跨版本隔离、旧存档迁移与异常存储。Cocos 示例默认加载最新主线,本次未实现原生版本选择控件或完成原生实机验证。
自动测试验证历史文件与模块一致、前三版 120 关完整回放、v0.4 双方案回放和替代顺序探索、版本数量与章节、默认选择、跨版本隔离、旧存档迁移与异常存储。Cocos 示例仍通过原接口加载 v0.3;本次未移植 v0.4 到原生工程、实现原生版本选择控件或完成原生实机验证。
+114
View File
@@ -0,0 +1,114 @@
# 环路车场:转盘发车玩法研发记录与阶段结论
记录日期:2026-09-10\
当前状态:**暂缓研发,保留 Demo、实现和测试,供后续复盘。**
## 阶段结论
本轮已经验证了车辆沿复杂轨道行驶、旋转道路、自动批量放行和提前错峰调度的技术可行性。路线提示、状态说明和连续行驶表现也经过多次调整。
但当前玩法仍没有提供足够明显的策略乐趣。最终试玩反馈是:**“比较无聊,没有策略点。”** 玩家主要在左右转动和发车之间循环;系统处理了车辆选择、出车顺序和交通冲突,玩家缺少需要权衡后果的决定。已有的目标转动次数,尚未让这种取舍在体验中成立。
本轮决定先暂停这个方向。订单、旋转预算、局部道岔等改进只完成了讨论,尚未实施,也未通过试玩验证。
## 1. 实验起点与玩法假设
实验以独立的 Car Loop Lab 开展,不修改主游戏的规则和主线关卡。
基础结构是方格或六角内部路网,加一圈同形、固定的顺时针外环。小车沿配对轨道转弯,从棋盘边缘汇入外环,最终到达右上角车库。只转动内部道路,停放车辆的位置和朝向保持不动;方格每次转 90°,六角每次转 60°。
最初采用“自由点车”:玩家选择车辆发车,遇到前车或交叉冲突时停车,空间清空后继续。之后提出“转盘发车”:把逐辆点击交给系统,让玩家集中处理道路无法继续放行的节点。
新模式的假设是:降低逐辆操作的负担,通过左右转向和转动次数形成规划挑战。需要验证的核心问题是:**自动化之后,留下的玩家决定是否仍然有趣。**
## 2. 研发演进与反馈
以下按迭代顺序记录,不代表每个阶段都经过独立的用户研究。
| 阶段 | 实现和调整 | 触发反馈与认识 |
| --- | --- | --- |
| 基础车场 | 支持方格、六角路网,短车身和明显的车顶箭头,沿曲线转向并驶向车库 | 外环需要贴合内部棋盘轮廓:方盘配方环,六角盘配六角环 |
| 即时多车发车 | 自由点车由起点排队改为点击立即出发,多车同时行驶,途中检测真实占位和交叉冲突 | 逐辆等待影响操作响应;发车指令应立即可见 |
| 长路线与规模 | 增加真实多弯路线和 10/16/22 辆样本;另做 96 辆桌面关卡,六角 169 格、方格 15×15 | 验证长路径、大棋盘和大批车辆的表现;页面随后改为适配窗口、去掉滚动条和过多留白 |
| 视觉整理 | 参考 Hex Video Lab v2;调整车辆大小和白箭头,移除车身下方多余色条,减弱道路对比和格缝,移除六角外缘伸出的引道线 | 试玩反馈棋盘显得乱、看久容易疲劳;复杂路线需要更克制的背景表现 |
| 交通问题修复 | 修复未发车车辆“预占未来整条路线”造成的误阻挡;处理两车互卡、自由模式自动演示停滞等问题 | 看起来能走却停住,会破坏规则可信度;自由模式仍保留途中让行 |
| 转盘发车初版 | 底部改为左转/发车/右转;系统依当前方向逐辆放行,不自动转盘;无车可走时由玩家转向后再次发车 | 希望减少逐车操作,让玩家处理每轮的转向节点;同时修正左右旋转按钮的箭头表现 |
| 路径解释与关卡目标 | 发车时显示车身同色的实际路径;两种棋盘各制作三个 16 辆关卡,加入目标转动次数与左右方向差异 | 自动运行时玩家看不到原先靠悬停才出现的路线;关卡需要体现转向和次数的作用 |
| 整轮放行与状态说明 | 一次启动本轮可放行车辆;显示可发车、放行中、需转盘、到站中等状态;路线改用原悬停提示的线型,移除外环尾迹 | 串行发车让人无法判断“还有车能走”还是“只是在等动画”;运行阶段需要明确 |
| 提前错峰调度 | 从途中停车让行,改为根据完整行程安排出发时刻;独立路线并行,有冲突的车在原位倒计时后出发 | 车辆贴在一起等待令人不舒服;调度要同时覆盖交叉口、外环汇入和终点,避免把拥堵移到出口 |
| 路线颜色收敛 | 所有转盘发车路线统一恢复为原来的绿色提示线,保留淡色光晕;出盘后收起 | 试玩更偏好原版绿色提示,不再按车身颜色绘制多色路线 |
| 乐趣评估与暂缓 | 操作和通行已较顺畅,但玩家认为玩法无聊、没有策略点 | 本轮决定先放下,记录过程与结论;后续建议停留在讨论阶段 |
## 3. 暂缓时保留的版本
### 玩家操作
- 进入“转盘发车”模式后,左、右按钮仅转动内部道路,中间按钮安排当前朝向下可放行的整批车辆。
- 发车不自动旋转。转盘后也不会自动发车,需要玩家再次点击中间按钮。
- 有冲突的车辆在起点等待自己的通行时段,显示短倒计时;已出发的车辆沿预定轨迹连续前进。
- 放行阶段显示待发、盘内、外环数量,尚未实际起步的车辆仍计入“待出发”。盘内放行及待发安排完成后,才允许继续转盘。
- 统一使用绿色 `#329378` 提示路线:淡色光晕、实线与端点。车辆离开棋盘后收起提示,外环不显示尾迹。
- 默认 2× 速度,可调 1–3×。目标转动次数用于评价,目前不是硬性失败条件;颜色不承担订单或通行规则。
- 自由点车模式作为对照保留,仍采用即时出发和实时停车让行。96 辆超大样本属于自由模式,转盘发车模式使用专门的 16 辆样本。
### 可复现的转盘发车样本
下表来自当前 `rotationPlan()` 的求解结果。左右序列是最少转动次数的一组参考解,不表示只有这一条解。每次转动后都要发车;批次车辆数的第一项是初始朝向直接发车的数量。
| 棋盘 | 关卡 | 种子 | 目标转数 | 参考转向 | 各轮放行数量 |
| --- | --- | --- | --- | --- | --- |
| 六角 | 转向开路 | 3 | 2 | 左、左 | 2、8、6 |
| 六角 | 折返放行 | 14 | 2 | 右、左 | 3、7、6 |
| 六角 | 连续调度 | 8 | 4 | 左、左、左、左 | 3、1、5、2、5 |
| 方格 | 转向开路 | 6 | 2 | 右、右 | 6、4、6 |
| 方格 | 折返放行 | 12 | 2 | 左、右 | 7、4、5 |
| 方格 | 连续调度 | 19 | 3 | 左、左、左 | 4、4、5、3 |
六个关卡在初次放行之后,先向左或向右的最少总转动次数不同;第二关的最优解需要折返。这证明了关卡存在方向差异,但目前的体验反馈表明:**计算上的差异还没有转化为足够清楚、有吸引力的玩家决策。**
## 4. 已验证的内容与证据范围
- 调度改动后的最近一次完整回归为 `npm test`:100 项通过;`npm run build` 通过。之后的绿色路线调整完成语法检查、静态构建和浏览器视觉检查。本记录本身是文档变更,没有重新运行整套测试。
- 真实应用帧循环测试覆盖六个转盘发车关卡通关、先走另一转向后的继续通关、禁止自动转盘、转后等待发车、重置和切换模式取消待发安排。
- 调度测试覆盖互不冲突的路线同时出发、交叉路线错峰但行程仍可重叠、帧间扫掠碰撞、上一轮车辆预订通行时段,以及弯道、汇入口、外环、车库的车距。
- 测试中途切换 1×/3×/1.5×,并使用变化的帧间隔;所有车辆共享同一模拟时钟,避免速度变化打乱调度。
- 浏览器实测六角“转向开路”第一轮两车并行;左转后八车一轮中,三车先发、五车待发,随后接续完成。还检查了窄窗口布局和不同车身颜色使用同一绿色路线。
- 本轮验证针对浏览器实验实现,没有完成原生引擎移植验证。
上述证据支持运行正确性和表现改进,不能据此证明游戏有趣。本轮乐趣判断来自研发过程中的定性试玩反馈,尚无独立样本的通关率、重复游玩意愿等数据。
## 5. 为什么目前缺少策略感
以下是对反馈的设计解释,仍需后续实验验证。
1. **系统接管了大部分操作决定。** 玩家不再选择具体车辆、顺序和避让方式,剩下的动作主要是左右转动及整批发车。
2. **试错代价较弱。** 当前目标是全部清空,多转几次依然可以继续。目标转数虽存在,但尚未形成玩家愿意追求的挑战。
3. **决策后果难以读懂。** 整盘道路复杂,玩家不容易在转动前预测这一转将释放谁、会为下一轮留下什么方向。绿色路线解释的是正在发生的运动,对转动前的规划帮助有限。
4. **放走车辆通常只带来单向收益。** 车辆离开会腾出空间,当前规则很少要求玩家为后续目的保留某辆车或某个通行机会。
5. **观看占比仍高。** 多弯轨迹和大量车辆能够增加动画内容,却没有相应增加有意义的决定。
值得保留的经验是:清晰状态、统一提示线、真实路线和提前错峰,让玩家更容易理解并舒服地观看运行。但下一轮若恢复研究,优先需要验证决策本身,而不是继续扩大车辆数量和路线长度。
## 6. 已讨论、尚未实施的方向
| 方向 | 希望产生的决定 | 当前判断 |
| --- | --- | --- |
| 出车订单 | 例如先送红车再送蓝车,展示当前与下一单;玩家同时考虑当前任务和下一批所需道路方向 | 优先候选。颜色将成为规则;需要重新设计可解的关卡,尚无玩法验证 |
| 更清楚的旋转目标 | 例如三次内得金牌,转动消耗可见标记,允许撤销;让当前收益与后续转动成本有关联 | 与订单结合更值得测试,单独强化已有转数显示可能仍不足 |
| 一个局部道岔 | 选择接通哪一条路,并限制切换次数,形成更直观的局部取舍 | 备选方向,需要验证额外控件是否值得其复杂度 |
讨论中的首选小实验是“订单+旋转目标”:8~10 辆车、两种颜色,同时展示当前和下一单,沿用错峰发车,并增加撤销操作。关卡刻意设置一种情况:眼前最容易完成的选择,会让下一批多花一次转动。
这些属于恢复研发时的候选假设,**不是已采纳的下一阶段开发计划**。重新评估时可观察:玩家能否说明自己的选择理由,是否会主动考虑下一批,是否能理解转错的代价,以及通关后是否愿意重试更少转数的解。
## 7. 恢复研究时的入口
- [转盘发车 · 六角 Demo](http://localhost:4173/labs/car-loop/index.html?mode=batch&kind=hex)
- [转盘发车 · 方格 Demo](http://localhost:4173/labs/car-loop/index.html?mode=batch&kind=square)
- [Lab 使用说明](../labs/car-loop/README.md),[早期视觉适配记录](../labs/car-loop/design.md)
- [玩法与关卡规划](../labs/car-loop/batch.js):当前朝向放行、双向旋转搜索、样本种子。
- [完整行程调度](../labs/car-loop/schedule.js),[出盘与车库轨迹](../labs/car-loop/routes.js)。
- [模型与求解](../labs/car-loop/model.js),[自由模式实时交通](../labs/car-loop/motion.js),[界面与渲染](../labs/car-loop/app.js)。
- [模型、交通与调度测试](../tests/car-loop.test.js),[批次关卡测试](../tests/car-loop-batch.test.js),[真实应用帧循环测试](../tests/car-loop-app.test.js)。
启动:在项目根目录运行 `npm run dev`。转盘发车模式的专项验证:`node --test tests/car-loop.test.js tests/car-loop-batch.test.js tests/car-loop-app.test.js`。
+29
View File
@@ -0,0 +1,29 @@
# 花形轨道 · 重瓣实验
入口:[花有出路 · 重瓣](http://localhost:4173/labs/flower/index.html)。这是独立的图案关测试,不加入 v0.4,不读写主线进度。
## 图案结构
用半径 5 的 91 格标准六边形承载路线。每个扇区有一大一小两片嵌套花瓣,旋转重复六次,形成双层十二瓣;相邻外瓣交错穿过。花心外围还有三道环带,在六个径向交点重新配对端口,把环带接进花瓣的行驶路线。整体呈放射对称的重瓣花,兼有内外层次和环形编织。
图案全部由实际端口配对形成,没有背景花朵图片。每格仍完整保留三条连接;177 条连接构成深色花纹,占全部 273 条连接约 65%。其他连接用细线显示。参考解会经过全部深色连接(出发格使用其外向半段),三道环带均已接通,不留下只供装饰的闭环。“暂隐棋子,看完整花纹”便于观察完整图案;“全部轨道等粗显示”用于检查端口连接。
花瓣和环带具有六重旋转对称,花心连接具有三重旋转对称。旋转 60° 后图案仍保持秩序,但花心连接变化,改变棋子所通向的出口。
## 可玩结构
- 共 10 枚棋子:外围 6 枚,内层 4 枚。
- 开局 2 枚朝外棋子先离场,空出出口。
- 内层 4 枚依次走过 13–33 个格步骤,包含 8–21 次转弯,逐步展示编织结构。
- 外围 4 枚朝内棋子走完整的跨花瓣长路:每条 59 个格步骤、37 次转弯。
- 参考解最后剩两枚时需要旋转一次,换接已空出的出口。
- 试路失败和旋转均免费,支持撤销、重来和提示,沿用现有动画与碰撞规则。
- 复用主游戏的点击队列:行驶或转盘动画期间可快速连点,待出发棋子显示描边,并按点击顺序在最新棋盘状态下执行。重复点击不重复入队;遇阻、撤销或重来会清空后续队列。
参考解:`petal-0 → petal-2 → bloom-2 → bloom-3 → bloom-0 → bloom-1 → petal-1 → petal-5 → 右转 → petal-3 → petal-4`。
## 验证
关卡通过格式校验与求解;参考回放没有格外阻挡。所有棋子在六个朝向下的独立路线都可离场且全程沿深色花纹行驶。测试也覆盖花纹的真实路线使用、最后一对的旋转解锁与撤销,以及六种起始朝向、正反消除顺序的通关。
布局与花纹定义见 [flower-study.js](../src/flower-study.js),实验界面见 [labs/flower](../labs/flower/index.html)。图案辨识度需要继续结合实际体验评估;未做原生引擎实机验证。
@@ -0,0 +1,97 @@
# 论文精读:把设计意图与空间一起生成
知识编号:P01 · 更新:2026-09-12 · 标签:`mixed-initiative` `mission-space` `生成文法` `局部重生成` `路线骨架`
**可复用结论:先描述玩家将经历的关系,再把关系与空间约束共同落实成可玩的布局;把中间结果留给设计者检查和修改。** 对 HEX TRAILS,“清掉入口 → 放出内向棋子 → 绕花瓣长路离场”应该是生成输入,而不只是生成完成后的评价标签。
## 文献与阅读范围
Daniël Karavolos, Anders Bouwer, Rafael Bidarra. *Mixed-Initiative Design of Game Levels: Integrating Mission and Space into Level Generation*. Foundations of Digital Games, 2015。
- [原文 PDF](https://livegamedesign.github.io/assets/FDG2015_Karavolos.pdf)
- [大学文献记录](https://research.hva.nl/en/publications/mixed-initiative-design-of-game-levels-integrating-mission-and-sp/)
- 本次核读:PDF 全部 8 页;正文第 1–6 节、图 1–3、表 1、致谢与参考文献。第 3、5 页图示另经渲染查看。以下页码指 PDF 文件页序。
- 论文类型:两项系统案例与方法讨论。**不是玩家效果实验,也没有提供千关难度曲线或商业留存验证。**
## 论文实际讲了什么
### 1. Mission 与 space 是两个相关的设计对象
Mission 指玩家任务及其关系,例如先取得钥匙才能打开门;space 指这些任务发生的位置、房间和路径。论文讨论如何通过模型转换连接二者,而不是先造一张通用地图再塞任务。这里的 mission 不要求存在剧情文本。研究着眼于开发期间的人机协作:设计者可以直接改图或草图,也可以重跑某个生成步骤。(§1–2,p.1–3)
Ludoscope 将生成流程拆成模块,每个模块有自己的符号和转换规则。执行可由概率决定,也可遵循指定顺序的 recipe,或交由设计者编辑。符号的成员属性携带配对关系、当前可用能力等上下文;规则后的脚本可触发后续规则。论文的价值在于可控制的设计流程,并非提出一个包办各种游戏的自动生成器。(§2.3、§6,p.3、6)
### 2. Dwarf Quest:先任务图,再空间布局
设计者绘制抽象行动图,系统依次展开谜题、拾取和战斗,再让设计者微调详细图,最后由布局求解器映射为房间。这个顺序有依赖依据:谜题节点本身可能包含拾取和战斗。钥匙与锁用 ID 关联;战斗及取得敌人掉落钥匙需要落在同一房间。布局器还会加入连接路径和填充房间,以满足二维网格、房间出口数等游戏约束。(§3–3.1,p.3–4)
**图 1 的信息**:左侧是可分步执行的设计流程,右侧依次展示抽象图、展开图及最终地图。地图中有来自任务图的房间,也有布局器补的填充房间。这提醒我们:几何上新增的内容,不一定新增了玩法关系;需另行检查它承担的体验。
### 3. TickTick++:空间草图与任务顺序共同约束生成
设计者同时给出起终点、能力道具及连接路径的草图,以及取得能力的顺序。系统据此扩展轮廓,并标注各路径位置已经具有哪些能力。路径扩展可能产生歧义,流程专门留出人工修正轮廓的步骤。锁的放置按能力获取顺序的逆序进行,因为最后获得的能力对应可放置区域最少。之后才用模板展开细节,并转换到游戏使用的实际尺度。(§4–4.1,p.4–5)
**图 2–3 的信息**:图 2 有两路输入,在空间轮廓生成和锁放置阶段汇合;人工介入不只发生在开头,轮廓修正和末端微调也是流程的一部分。图 3 证明流程产物可以进入实际游戏画面,不能由此推断玩家更喜欢这些关卡。
### 4. 两个案例支持不同生成方向
表 1 对比的是“任务先于空间”和“任务与空间并行约束”。因此,不能把论文概括成唯一的“先依赖图、后画形状”流水线。对强形状需求,可以先给空间草图,同时约束任务关系。相同任务图生成多个空间,以及同一空间承载不同任务,都是作者讨论的复用方向。(§5–6、表 1,p.5–7)
## 证据与适用边界
| 原文支持的说法 | 不应扩大的说法 |
| --- | --- |
| 两个案例实现了分模块、人机交替的生成流程 | 已证明比手工设计更省多少工时、提升多少满意度 |
| 重跑下游模块可以保持上游输入 | 已实现任意局部锁定、精确保留本轮生成结果 |
| 修改参数可以改变案例中的战斗配置、谜题分支等 | 参数等价于真实玩家难度,或可直接映射本项目五档难度 |
| 中间图/轮廓有助于设计者控制任务与空间 | 所有自动展开都会保持可解、不会产生歧义 |
| 作者讨论同一任务生成多个空间 | 这些空间在玩家眼中必然是不同体验 |
作者明确指出:模板仍需要大量人工工作;规则改变可能使模板失效;复杂模块的错误可能源于文法、流程或游戏代码,排查困难。重跑模块虽不改上游,仍可能丢失该模块上一轮输出中设计者喜欢的部分;选择性保留被提出为待解决方向。论文也明确说案例没有与玩家互动,实时适应玩家、难度序列可视化属于后续工作。(§5–6,p.6–7)
## 对 HEX TRAILS 的迁移方案
以下均为本项目设计建议,**不是论文已验证结果**。
### 制作卡 P01-A:将“主爽点”变成输入约束
一次生成至少给出三项:目标体验、必须发生的关系、允许变化的空间。
```text
体验:内向棋子经过轻巧操作后沿花瓣长路离场
关系:入口 A 移走后,旋转一格使 B 接通出口
空间:B 的实际路线经过指定花瓣,交叉保持轨道配对
固定:B 的初始位置/箭头,关键花瓣段,关键动作上限
可变:其他棋子位置、非关键轨道、次要离场顺序
证据:真实规则回放中,B 在允许动作内成功走过指定路线
```
具体动作数是一张制作卡的意图,不应升级成所有关卡的统一规则。若关键路径在生成中被破坏,应返回具体冲突,避免用装饰花瓣补足标签。
### 制作卡 P01-B:为花瓣提供双向生成入口
普通清挡关可从关系骨架开始;花瓣、螺旋、环绕等关卡可先固定实际可行驶的路线片段,再寻找兼容的棋子、阻挡与旋转阶段。两种入口汇合在“带条件的路线与释放关系”中间表示上。
本游戏底盘旋转会改变路线,所以一张静态“谁挡谁”的图不够。至少记录关系成立时的底盘朝向、剩余棋子以及实际行进路线。不同状态可以有不同关系;不要将某一参考解的关系当作全局真理。
### 制作卡 P01-C:明确哪些东西可以重做
后续编辑器应允许设计者固定关键棋子、路段、阶段和已验收的释放效果,再局部生成其他内容。每次修改输出“保留项、变化项、失效的验证”。这比反复换随机种子更符合协作目标。
注意:**精细锁定是我们计划补足的能力,不是论文中已经完整实现的功能。** “重跑下游”与“保住下游上次喜欢的局部”是不同问题。
### 制作卡 P01-D:按体验角色构造模块
优先形成“入口让路”“一转放行”“跨区巡游”“阶段清理”“漂亮收尾”等可组合模块。每个模块有输入状态、输出机会、空间约束及可回放见证。模块不是只画几条线的图案模板。
逆序放锁可以启发“先保障空间最受限的关键路线,再填外围内容”,但其适用条件需要验证。平台游戏的能力获取和本游戏旋转换路并不相同,不能直接复制其锁匙算法。
## 后续使用时的检查清单
1. 当前设计输入是在表达玩家经历,还是只有大小、密度、弯数?
2. 形状与关键释放关系冲突时,有没有明确的中间表示供修改?
3. 重生成是否保留了设计者明确固定的内容?
4. 关键效果是否在真实规则和实际点击流程中回放成立?
5. 同一任务骨架的新空间是否改变了路线、观察或释放过程?仅颜色变化不算新的体验证据。
关联:[PCG-QD 精读](02-pcgqd.md)解决候选库多样性;[难度与序列补充研究](03-progression-and-difficulty.md)讨论如何从关卡库安排推进过程;[总报告](../level-design-research-report.md)将三者结合。
+179
View File
@@ -0,0 +1,179 @@
# 论文精读:Procedural Content Generation through Quality Diversity
知识条目:KB-P02 · 核读日期:2026-09-12 · 适用对象:HEX TRAILS 关卡生成、候选库、筛选与评审工具。
**最有用的结论:生成器应保留“不同体验类型中各自优秀的关卡”,而不是用一个总分把全部候选排队。** 论文为这种候选库提供方法框架;把它应用到长路巡游、轻巧反差和花瓣路线,是本项目的设计推论。
## 1. 文献身份与阅读范围
Daniele Gravina, Ahmed Khalifa, Antonios Liapis, Julian Togelius, Georgios N. Yannakakis. *Procedural Content Generation through Quality Diversity*. 2019 IEEE Conference on Games (CoG). DOI:`10.1109/CIG.2019.8848053`。arXiv 初次提交日期为 2019-07-09。[元数据](https://arxiv.org/abs/1907.04053)
本次逐页阅读了[作者提供的 8 页 PDF](https://antoniosliapis.com/papers/procedural_content_generation_via_quality_diversity.pdf),并与[作者全文 HTML](https://antoniosliapis.com/articles/pcgqd.php)交叉核对;渲染检查了包含图 1–5、表 I 的 PDF 第 4–6 页。以下页码指该 PDF 的物理页序,从首页算第 1 页,不能直接套用到重新排版的版本。
它是一篇**方法综述与研究方向论文**:归纳已有 QD 算法及游戏应用,论述优势、解释性与开放问题。它没有报告一项新的 1000 关量产实验,没有研究箭头消除游戏的难度曲线,也没有给出长期留存或玩家满意度的因果证据。文中的个案数值是作者转述所引研究,不能归为这篇综述自己的统一对照实验。
本条目采用三个标签:**[论文]** 表示原文论述或转述;**[解读]** 表示对方法适用边界的分析;**[项目建议]** 表示需要在 HEX TRAILS 中实现、验证的方案。
## 2. 可复用摘要
**[论文]** QD(Quality Diversity)同时处理“内容是否达到质量要求”和“内容在行为上有哪些不同”。它可以通过行为特征划分空间、在相似候选间保留更优者,也可以通过行为距离鼓励新颖性。可解性等硬约束与局部质量竞争是两种质量控制方式。MAP-Elites 是其中一种算法,PCG-QD 是更宽的程序化内容生成方法类别。[§II,PDF 第 1–3 页](https://antoniosliapis.com/papers/procedural_content_generation_via_quality_diversity.pdf#page=2)
**[论文]** 作者认为,一次搜索保留许多不同的合格内容,有利于批量产出、人机协作、观察生成器能够覆盖哪些类型,以及帮助设计师理解结果。效果依赖行为特征、质量指标、约束和评价器的定义;高维空间、分箱粒度、特征依赖及仿真成本都是问题。[§III、§V,PDF 第 3–4、7 页](https://antoniosliapis.com/papers/procedural_content_generation_via_quality_diversity.pdf#page=3)
**[项目建议]** 对 1000 关最有价值的用法,是建立可以按体验挑选的候选档案。先确保规则与解法成立,再分别保存“直接长路”“清挡放行”“一次旋转反差”“有形状的长路”等优秀样关。关卡次序、难度波动和真人体验校准应由额外流程完成,不能把档案格子的排列直接当成玩家关卡顺序。
## 3. 全文阅读定位
| 位置 | 原文内容 | 本条目取用的知识 |
| --- | --- | --- |
| 第 1 页,摘要、§I、§II 开头 | 质量与多样性的动机;QD 与只寻找最优解的区别 | 数量和参数差异不能直接代表可感知变化 |
| 第 2 页,§II-A/B/C | 行为距离、行为分区、局部竞争、约束;ME、ME-NOV、MESB、CNS | 分开定义“好不好”与“是哪一类” |
| 第 3 页,§II-C 后半、§III-A/B/C | CSS、CME、NS-LC、SS-LC;批量效率、评价函数、表达范围 | 算法选型;避免把 fitness-free 解读成不需要质量判断 |
| 第 4 页,§III-C/D/E、§IV-A/B;图 1、2 | 可视化覆盖、人机协作、解释性;图像与弹幕案例 | 档案空洞诊断;不同表现不必争同一个最高分 |
| 第 5 页,表 I、图 3、4、§IV-B 至 F | 各应用的质量/多样性定义;Mario、卡组、地图建议 | 特征应与实际玩法对应;仿真指标有条件性 |
| 第 6 页,图 5、§IV-F 至 J、脚注 1 | 武器、飞船、方块建筑、地牢、案例讨论 | 算法 surprise 与玩家惊喜的区别;可解释性尚非充分验证结论 |
| 第 7 页,§V、§VI、参考文献开头 | 高维、粒度、代理模型、不同风格的测试代理;结论 | 多策略验证、控制评价成本、限制指标维数 |
| 第 8 页,参考文献 | 所引方法与应用的原始文献 | 后续追读入口;本次未冒充已全文阅读这些被引论文 |
## 4. 五个必须分清的概念
### 4.1 质量与行为特征
**[论文]** 质量回答某个候选是否符合要求、或在同类候选里是否更好;行为特征描述它属于哪种表现。两枚得分相同的候选仍可能值得同时保存,因为它们的行为不同。原文特征并不限于真实玩家行为:也包括空间结构、图像类别、卡牌费用分布等可计算描述。[§II,PDF 第 1–3 页](https://antoniosliapis.com/papers/procedural_content_generation_via_quality_diversity.pdf#page=2)
**[项目建议]** “实际最长成功路径”“放行方式”“路线形态”“旋转阶段”适合描述体验类别;“能完整清盘”“交叉与碰撞符合正式规则”“承诺的主爽点确实在回放出现”适合成为验收条件。难度可以先作为记录和编排标签,不必直接进入统一质量分。
例如,舒缓长路与多阶段清挡分别比较本类质量。若统一奖励“旋转越多、依赖越深、路径越长”,搜索可能让本来应该轻巧的关卡也变得繁重。
### 4.2 内容编码差异与体验差异
**[论文]** QD 的多样性机制强调行为空间,不等于仅检查基因编码是否不同。案例也显示,特征选取会直接决定系统眼中的“不同”:Sentient Sketchbook 用不同格子数量;Mario 场景用代理回放实际触发的机制。[§II-A、§IV-C/E,PDF 第 2、5 页](https://antoniosliapis.com/papers/procedural_content_generation_via_quality_diversity.pdf#page=5)
**[项目建议]** 换颜色、改种子、移动一段未使用装饰线,都可能改变文件,却不改变玩家体验。候选去重应同时检查结构同构、放行关系与实际回放表现。把棋盘、棋子和箭头整体一起作对称变换,可能只是同一体验的变体;只旋转底盘会改变本游戏的出路,不能按同一种等价变换误删。
### 4.3 可行与有趣
**[论文]** 可行性通常由硬约束决定,例如地图是否可通行、脚本是否合法、代理能否完成。部分方法再在可行候选之间比较质量。[§II-B、§IV-J,PDF 第 2、6 页](https://antoniosliapis.com/papers/procedural_content_generation_via_quality_diversity.pdf#page=6)
**[解读]** 一个代理找到解,只证明在其规则模型与动作定义下存在已找到的完成过程。它没有证明玩家能理解线索,也没有证明行进值得看完。搜索超时不能直接当作无解;把超时当无解会连带扭曲档案覆盖率。
### 4.4 算法新颖性、算法 surprise 与玩家惊喜
**[论文]** Novelty 依据与已存在行为的距离;surprise 可以依据当前结果偏离过去种群趋势预测的程度。武器案例用过去两代死亡位置热图作预测,奖励偏离预测的位置分布。[§II-C、§IV-F,PDF 第 3、6 页](https://antoniosliapis.com/papers/procedural_content_generation_via_quality_diversity.pdf#page=6)
**[解读]** 这里的 surprise 没有测量玩家第一眼的判断。因此,不能声称采用 CSS 就会自动生成“看似棘手,一转就通”的关卡。
**[项目建议]** 轻巧反差至少需要两条独立证据:结构上确有很短的放行操作;玩家观看开局后确实预期它更难。前者可以由模型验证,后者需要试玩提问或行为观察。两者不要合成一个未经标定的“惊喜分”。
### 4.5 表达范围与关卡难度曲线
**[论文]** 表达范围描述生成器能产出哪些样式,特征图可以暴露集中区域、空洞及指标偏置。[§III-C,PDF 第 3–4 页](https://antoniosliapis.com/papers/procedural_content_generation_via_quality_diversity.pdf#page=4)
**[项目建议]** 档案回答“我们有多少种可用体验”,主线编排回答“玩家接下来应遇到哪种体验”。前者覆盖均匀,不代表后者应平均投放,也不代表玩家的学习负担应逐关线性上升。
## 5. 算法应怎样理解与选择
下表是对 §II-C 的简化归纳,详细定义见 [PDF 第 2–3 页](https://antoniosliapis.com/papers/procedural_content_generation_via_quality_diversity.pdf#page=2)。右栏全部属于项目建议,并非论文针对本游戏的结论。
| 方法 | 论文中的核心机制 | HEX TRAILS 的考虑 |
| --- | --- | --- |
| MAP-Elites(ME) | 特征分箱,每箱保留质量最好的个体;从档案选择父代继续变化 | 适合做第一版可浏览候选档案;先定义少量有设计意义的坐标 |
| ME-NOV | 用新颖性影响父代选择,让搜索偏向较少探索的行为 | 当候选持续挤在相近区域时,再评估是否需要 |
| MESB | 按已生成个体的特征分布重新调整箱边界 | 有助处理分布不均;边界变化会影响跨批次统计,应保存版本 |
| CNS | 分成可行与不可行种群;可行者追求新颖,不可行者接近可行或同样追求新颖 | 有价值的半成品不能直接入主线,可以放在独立修复池 |
| CSS | 可行/不可行分流,可行种群追求偏离预测的行为 | 暂不以此实现人的轻巧反差;两种 surprise 的定义不同 |
| CME | 每个特征箱内分别保存可行与不可行种群,兼顾局部质量与修复 | 若花瓣路线稍改即破坏配对或可解性,可考虑保留接近合格的变体 |
| NS-LC | 同时奖励行为新颖性和胜过附近候选的质量 | 需要可信的行为距离;不同路线类别不宜随意赋数计算欧氏距离 |
| SS-LC | 用偏离预测与局部竞争结合,可再混合 novelty | 没有证据表明它应成为本项目首选,先用可解释基线 |
**[论文]** 标准 ME 的基本过程是:初始化候选 → 评价质量与特征 → 找到所属箱 → 空箱直接保存,已有候选则只保留更优者 → 从档案抽取父代并变异或交叉 → 继续评价与替换。[§II-C1,PDF 第 2 页](https://antoniosliapis.com/papers/procedural_content_generation_via_quality_diversity.pdf#page=2)
**[项目建议]** 初版可以先把现有候选按特征分类、筛选、可视化。这能验证特征是否有用,但若没有从档案选父代并持续搜索,应称为“借鉴 QD 的分类候选库”,不要声称已经实现完整 MAP-Elites。
## 6. 图表、个案和数值到底证明了什么
| 证据位置 | 实际内容 | 可以借鉴 | 不能推出 |
| --- | --- | --- | --- |
| 图 1,第 4 页;§IV-C,第 5 页 | 图中展示六个二元特征的 Mario 机制热图;案例正文称完整实验使用八个机制、256 个箱,平均约 100 个箱生成了关卡 | 检查特征依赖与不可达组合;热图用于诊断生成器 | 不能将图中 64 种组合当作正文完整的 256 格档案;不能把约 100 格解释为 100 名玩家或 100 个优质整关 |
| 图 2,第 4 页;§IV-B,第 4–5 页 | Talakat 弹幕脚本,采用代理熵、代理风险和子弹分布作特征,以 A* 检查可玩性 | 同一游戏内可以保留运动表现不同的内容 | 三张图不证明玩家满意度或主线节奏;“密集”不自动等于“更难” |
| 图 3,第 5 页;§IV-C | Mario 片段按代理回放触发机制分类,局部质量偏向简单且可完成 | 可以按实际放行/行进事件描述关卡,而非只数静态元素 | 没有证明一个参考代理代表所有玩家;片段生成不同于完整战役编排 |
| 图 4,第 5 页;§IV-E | Sentient Sketchbook 左侧设计画布、右侧候选建议;从用户草图开始生成 | 让设计师能在明确的初稿基础上挑选变化 | 单张界面图不构成设计效率提升的统一用户实验 |
| 图 5,第 6 页;§IV-F | 两种自动生成武器;surprise 使用模拟死亡位置偏离预测 | 评价行为而非仅外观,保持可用约束 | 不能把该 surprise 直接译成玩家的“啊哈体验” |
| 表 I,第 5 页 | 横向列出不同应用的算法、发散机制、质量机制、特征定义 | 同一框架下,各品类需要不同的质量和特征 | 没有跨应用可比的“统一质量分”或算法总排名 |
以上均来自[论文 PDF 第 4–6 页](https://antoniosliapis.com/papers/procedural_content_generation_via_quality_diversity.pdf#page=4)。三个容易误用的数字也需单独记录:
- 图像/物体案例的 **1000** 是分类网络的类别数,和本项目的 1000 关目标无关(§IV-A,第 4 页)。
- Hearthstone 案例用 **200 局游戏**中的生命差来评价卡组,并用费用曲线的均值与方差描述多样性。这是该案例的评估设计,不是本项目每关必须模拟 200 次的标准(§IV-D,第 5 页)。
- 脚注比较 Sentient Sketchbook 中“6 个线程各产 1 个建议”和 CNS“1 个线程产 6 个建议”。它说明候选批量复用的机会,不是本论文给出的通用 6 倍运行时间加速结论(第 6 页,脚注 1)。
## 7. 适用边界与需要主动防范的误读
**[论文]** 高维行为空间难覆盖;箱太细会稀疏,箱太粗会隐藏差别;作者讨论了潜在空间、Voronoi 分区和仿真代理模型等方向。多风格测试代理被提出用于检查内容是否按预期被体验。[§V,第 7 页](https://antoniosliapis.com/papers/procedural_content_generation_via_quality_diversity.pdf#page=7)
**[解读]** 下列限制尤其影响我们的决策:
1. **指标依然决定盲点。** 名为 *Fitness-Free Search* 的小节并未取消质量定义;许多算法仍使用约束和局部质量比较。减少对一个全局目标的依赖,不等于算法会自行判断好玩。
2. **空箱不全是坏事。** 它可能来自规则不允许的组合、特征互相依赖、分箱不合理,也可能只是搜索不足。应分别标明“确认不可行”“尚未找到”“已有合格候选”。
3. **批量效率是方法动机,不能套成固定性能承诺。** 本文没有以同一任务、同一计算预算把全部方法重跑并给出统一胜负;每个关卡的仿真仍可能昂贵。
4. **可解释性是部分能力与研究方向。** 作者在 §IV-J 明确指出,所综述案例中还没有项目把解释性作为明确目标来研究;特征图本身不是“设计师理解已被证明提升”。
5. **2019 年的横向论述不是今天所有算法的能力上限。** 文中对机器学习生成、构造法或声明式方法多样性控制的概括应放回当年的语境;本条目不据此宣称其他生成方法都无法做到多样化。
6. **发表范围没有覆盖移动消除游戏的长期曲线。** 免费试错、连续点击、动作动画、碎片时间、广告节奏、1000 关留存均不是本文验证对象,不能用学术引用替代这些体验研究。
## 8. 转换为 HEX TRAILS 的制作规则
以下均为 **[项目建议]**,与[新版关卡设计准则](../level-design-principles-v2.md)衔接。论文提供方法启发,不提供这些配置的验证结果。
### 8.1 三层评价,避免长路等同于难度
| 层次 | 初版记录 | 如何使用 |
| --- | --- | --- |
| 正确性 | 数据合法、正式规则下的清盘解、碰撞与轨道一致性、求解是否触顶 | 不合格候选不进入玩家关卡;未确定单独存放 |
| 体验类型 | 实际成功路线长度/弯数/空间形态,主放行方式,主奖励出现阶段 | 进入相应候选档案;用来保持变化 |
| 本类质量 | 主爽点兑现、因果可读、运动可跟随、重复操作负担、真人反馈 | 在同类候选中比较,保留回放和评审理由 |
“长路、低前置负担”是一种值得保存的类型;不能因为操作简单就在统一困难度排名中被淘汰。花瓣轮廓只证明形状存在,仍要检查玩家实际放出的棋子有没有走过构成花瓣的路径。
### 8.2 先做少量可解释档案,再扩维
可以先按主放行方式分库,例如直接通行、清挡通行、旋转换路、分阶段组合;每个库先用两个坐标浏览,例如“实际主路径长度带 × 前置动作负担”。路线形态、反差意图、盘面密度等先做筛选标签。具体分界应来自已审核样关分布,当前不固定未经校准的阈值。
若把所有标签做笛卡尔积,会产生大量没有设计意义或规则上不可达的格子。也不要为了填满图表而制造不符合核心体验的关卡。
### 8.3 同一几何可以成为不同关卡,但要有不同的体验证据
花瓣骨架可承载直接巡游、外围清挡后放出主瓣、一转接通内向长路等不同意图。保留变化时应写明:关键棋子、放行条件、成功路径、奖励顺序分别改变了什么。只换配色或旋转截图,不足以证明新增一关的价值。
反过来,两种外形不同的棋盘也可能具有几乎相同的“全部能点就点、转一次、全部清空”节奏。结构档案和回放摘要应能发现这种重复。
### 8.4 评价回放要覆盖多种合理操作
至少区分顺手点击畅通棋子、主动追求长路、优先清挡、尝试旋转等策略。对每种策略分别记录:是否清盘、主长路是否出现、关键反差是否被直接绕过、奖励在何时兑现。策略和样本数量需随验证成本确定,不能从本文借一个固定次数当作充分性保证。
若正式运行时支持快速点击、输入队列或并行动画,仿真与体验评审要体现相同的规则。输入屏蔽或动画调度造成的耗时,不能直接算成关卡的推理难度。
### 8.5 候选库与主线编排分别验收
候选库验收“不同类型中有没有足够好的选择”;主线验收“连续游玩时有没有学习、变化与舒缓”。先维持可用类型库,再从中编排短序列试玩。先前 1000 关方案中的难度数量、长路比例和章节长度仍是待验证假设,不能因为引入 QD 而升级为研究结论。
## 9. 后续可以直接引用的设计卡
| 知识卡 ID | 可直接使用的规则 | 验证问题 |
| --- | --- | --- |
| QD-01 | 正确性、体验类别、本类质量分别记录 | 高难标签是否正在替代“好玩”的判断? |
| QD-02 | 按实际回放区分关卡,不能只比较种子与截图 | 两关带来的放行与巡游过程到底哪里不同? |
| QD-03 | 在每个体验类型内部保留优秀候选 | 舒缓长路是否被困难度总分挤掉了? |
| QD-04 | 反差要有结构证据和玩家预期证据 | 我们测到的是算法偏差,还是人的惊喜? |
| QD-05 | 档案空洞先诊断,不急于补齐 | 是搜索不足、指标冲突,还是本来不值得生成? |
| QD-06 | 主奖励用多种合理点击顺序验证 | 只有参考解能看到花瓣巡游吗? |
| QD-07 | 记录候选来源、变体关系、淘汰原因与指标版本 | 修改评分后,能否解释哪些候选为何消失? |
| QD-08 | 内容多样性与连续关卡节奏分别设计 | 单关都合格,连玩十关是否仍然重复? |
建议首先做一个小规模对照:使用相同候选生成预算,比较“现有单分筛选”和“按体验分类、类内挑选”。由盲评检查核心爽点兑现、可感知差别及可读性,并记录合格数量与人工筛选时间。此实验属于项目验证方案,尚未执行;它比先把完整进化算法搬进工程更能检验 QD 思路是否解决了眼前问题。
## 10. 来源与待追读范围
- **全文来源**:[作者 PDF](https://antoniosliapis.com/papers/procedural_content_generation_via_quality_diversity.pdf)、[作者 HTML](https://antoniosliapis.com/articles/pcgqd.php)。两者是同一篇论文的不同载体,不算两项独立研究。
- **文献身份核对**:[arXiv 元数据](https://arxiv.org/abs/1907.04053)、[作者文献条目](https://antoniosliapis.com/publications.php?bib=gravina2019pcgqd#gravina2019pcgqd)。
- **后续追读候选,未在本次冒充全文读过**:参考文献 [12] MAP-Elites 原始方法、[19] *Intentional Computational Level Design*、[39] *Empowering Quality Diversity in Dungeon Design with Interactive Constrained MAP-Elites*、[49] *Procedural Personas as Critics for Dungeon Generation*。引用其具体实验结论前,应另立条目核读原文。
- **检索审计**:[本条目来源记录](../../exa-results/level-design-2026-09-12/paper-qd-sources.json)。本流使用 Exa 搜索 1 次、请求 5 个候选结果;实际全文核读的是 1 篇论文,而不是 5 篇论文。
@@ -0,0 +1,80 @@
# 补充研究:关卡顺序、玩家熟练度与难度估计
知识编号:P03–P04 · 更新:2026-09-12 · 标签:`关卡编排` `技能组合` `难度模型` `冷启动` `玩家分群`
两篇指定论文主要解决“怎样生成”和“怎样保持候选多样性”。本次通过 Exa 另找到两项直接讨论关卡编排、真人难度数据的研究,用来补足千关方案中的排序与验证环节。
## P03:从解法特征组织关卡序列
Eric Butler, Erik Andersen, Adam M. Smith, Sumit Gulwani, Zoran Popović. *Automatic Game Progression Design through Analysis of Solution Features*. CHI 2015. DOI: 10.1145/2702123.2702330。
[作者提供的论文](https://www.ericbutler.net/assets/papers/chi2015_progression.pdf)。本次阅读正文的方法、生成、编排、实验、讨论与结论;下载 10 页 PDF 核对章节页位。此项为补充研究,不与两篇指定论文的逐图精读范围混称。
### 方法要点
作者不只记录关卡有哪些机制,还记录机制如何组合。对有程序化解题过程的问题,可用行动序列的 n-gram;对 Refraction 这种有多种摆法的空间谜题,用解法图中的小子图 graphlet 表示“转向器接分流器”等关系。还需要额外的数学关系图,以区分空间连接相同、分数要求不同的题。(PDF p.4–5)
编排时从多样的关卡库中选下一关,综合玩家接触/完成过的特征、设计者赋予各特征的权重以及当前目标负担。先修关系只形成偏序,不能靠一次拓扑排序就解决节奏:还需控制新概念、熟悉概念组合和练习的出现速度。作者可以重新给关卡打特征标签、重排,而不用重新生成所有布局。(p.5–7)
**重要前提**:该实验的生成器约束所有可能解具有相同的解法图,所以可用一条参考解提取共有特征。本游戏有旋转和不同释放顺序,尚无这个保证。我们只能明确区分“必经特征”“多策略常见特征”和“作者解独有特征”。(p.5)
### 实验到底证明了多少
线上实验共 2,377 名玩家,自动组 1,221 人,人工原版组 1,156 人。中位游玩时间分别为 184 秒、199 秒,所用检验未发现显著差异;完成谜题数中位数为 8 与 10,存在小幅显著差异,但两组题目不同,作者不认为它是理想的投入度比较指标。(p.7–8)
这支持“该框架经过调整后产生了可比较的短期游玩表现”,**不能写成自动设计已经等效于人工设计,或已证明长期留存、千关完成率更好**。作者明确指出缺少随机顺序对照,甚至不能据此确定编排本身对投入度贡献了多少。(p.8)
图 4 及讨论揭示了一个与千关特别相关的失败:概念耗尽后,自动系统连续选择非常相近的题,人工序列则更常出现较大的概念跳跃。作者提出减慢新概念消耗、惩罚连续相近题等改进方向,未把它们报告成已验证的最优策略。(p.8–9)
还需计算制作成本:作者指出,针对具体游戏实现这套系统往往比手工编排更费工;如果目标只是做出一款关卡顺序合理的游戏,是否受益仍不确定。自动化的价值应连同反复调优、重排与后续扩展来评估,不能仅凭“自动”就宣称省工。(p.9)
### 对本项目的可用建议
- 用“清挡 → 放行”“清挡 → 转盘 → 巡游”“转过去清理 → 转回来放行”等短组合描述认知内容;单纯记录本关出现过“旋转”不足以区分体验。
- 将关卡库与关号解耦,允许同一批关卡重排并比较效果。
- 编排器同时限制相邻相似度和新概念跳幅;只追求平滑,会滑向重复。
- 保留长路直接放行的舒缓关。本项目的目的包括观看与释放享受,不能照搬 Refraction 每关尽量引入未掌握挑战的约束。
## P04:用真人与模拟数据校准难度
Jeppe Theiss Kristensen, Paolo Burelli. *Difficulty Modelling in Mobile Puzzle Games: An Empirical Study on Different Methods to Combine Player Analytics and Simulated Data*. arXiv:2401.17436,2024。
[作者公开全文](https://arxiv.org/html/2401.17436)。本次重点核读 §3–9(案例、方法、数据、两组实验、讨论和结论);没有复现实验,也未逐篇追读其引用文献。
### 实际研究范围
案例为 Tactile Games 的 Lily’s Garden,研究前 500 关。数据采集区间为 2021-06-01 至 2021-12-01,只包含期间开始游戏且玩过至少 200 关的玩家;因此不能用这份样本直接解释首日流失者。(§3、§5.1)
研究把难度操作化为完成关卡所需的尝试次数,比较随机森林、神经网络、因子分解机,输入包括历史结果、玩家特征、关卡静态特征及代理实际游玩的动态特征。还区分已有关卡数据和新关卡没有真人记录的冷启动场景。(§4–7)
在此样本中,约前 100 关包含较多教学与容易关,之后平均尝试次数在约 3.2 附近波动,个别难关仍有明显高峰。**这是这个游戏、这批样本的观察值,不是所有解谜游戏应采用的目标。**(§3、图 2)
### 对生产有用的结果与限制
1. 新关卡的群体平均预测中,神经网络和随机森林使用代理、玩家与关卡特征组合表现较好;因子分解机加入全部特征则可能因过拟合变差。§6 的个体预测与 §7 的群体平均预测必须分别解读,不能用一句“某算法最好”覆盖所有场景。(§6–8)
2. 代理通常比真人强,可能分不开真人眼中的容易与中等关卡。直接把代理当作真人补数据的尝试也没有得到理想结果。(§8.2、§9)
3. 对新关卡,预测往往把简单关估高、难关估低,向均值收缩。单个精确预测值容易制造不必要的确定感。(§7)
4. 作者仍认为设计者需要亲自玩,才能判断是否有趣、解法是否清楚;建议未来研究按时间窗口验证模型,以更接近真实上线后的预测。(§8.2)
### 对本项目的可用建议
本游戏试路和旋转免费,失误不等于重开。直接套用“平均重试 3.2 次”既不匹配规则,也不匹配体验目标。应先记录下列独立指标,再与玩家对难度、疲劳和愉悦的评价对应。
| 指标 | 解决的问题 | 不能直接推出什么 |
| --- | --- | --- |
| 首次有效动作前的主动观察时间 | 开局是否找得到入口 | 长时间一定是困难;玩家可能在欣赏图案 |
| 无效试路、无收益旋转及连续发生的位置 | 哪处理解或反馈有问题 | 每次尝试都是挫败;试探也可能有趣 |
| 关键动作后的新可放行棋子 | 操作的因果回报是否清楚 | 解锁数量越多,质量越高 |
| 主动观看时长与输入受阻时长分开 | 长路奖励是否被实现成等待 | 所有动画时间应缩短 |
| 自然点击策略下关键路线的曝光 | 核心内容是否经常发生 | 抽样出现率等于全体真人概率 |
| 当前关完成后是否愿意继续 | 该段是否产生继续玩的动机 | 单关留存差异全由该关造成 |
先用人工基准关和简单的可解释分档,再用同熟练度玩家的实际数据校准。不需要一开始训练复杂神经网络。若以后做预测,按关卡版本、模板家族和时间留出测试集,避免同模板近似题泄漏到训练与测试两侧。
## 两项补充研究对千关方案的共同修正
“关号越后,结构分越大”不够;“结构分后半程保持不变”也不保证体感稳定。需要同时知道玩家学会了什么、最近见过什么、这关实际兑现什么奖励。
建议把下一关选择写成可解释的设计流程:先满足已教规则与目标体验,再筛掉连续重复、视觉过载和过量操作,最后从符合当前熟练度的候选中选取。先实现可审阅的离线编排;在线个性化作为有数据后再评估的选项。
这与[PCG-QD](02-pcgqd.md)的关系是:多样关卡库提供选择范围;编排器决定玩家走哪条内容序列;试玩校准判断这条序列是否真的合适。
@@ -0,0 +1,155 @@
# 国际相近游戏:关卡机制、内容组织与证据边界
研究日期:2026-09-12。适用项目:HEX TRAILS。本文是后续制作知识库的一部分,不是对竞品生成器的逆向结论。
**目前最有用的发现是:同属“点击箭头清空”的游戏,可以把挑战放在完全不同的位置——寻找出路、识别遮挡、颜色分区、时间压力或关后评价。为了做出 1000 关,首先要稳定我们自己的体验,再扩展内容组合;不能把竞品的关数、棋子数或付费卡点直接当作难度曲线。** 这是一条基于以下资料提出的项目建议,不是竞品开发者共同发表的结论。
本流使用 Exa 进行 13 次搜索,请求 65 个结果位,返回 49 个精确 URL;不同地区的同一商店页包含在这 49 个 URL 中。实际抓取并核读 14 个不同页面的相关正文,直接查看 1 段视频的 16 个时间点,以及 2 张官方宣传截图。没有安装或完整通关这些游戏,也没有读取其关卡数据或源码。来源与检索记录分别见 [international-sources.json](../../exa-results/level-design-2026-09-12/international-sources.json) 和 [international-search-log.json](../../exa-results/level-design-2026-09-12/international-search-log.json)。
## 1. 证据怎么使用
| 标签 | 可以支持的结论 | 不能自动支持的结论 |
| --- | --- | --- |
| 官方文案 | 商店主体、宣传的基本规则、列出的功能 | 实际每关规则、关卡总量核验、人工与程序化占比、真实难度变化 |
| 本次视觉观察 | 指定截图或视频时间点里确实可见的状态 | 没有显示的操作、并行输入逻辑、完整规则、整条主线规律 |
| 作者体验 | 行业作者报告自己玩到的机制与感受 | 本次亲测、当前全部版本一致、开发团队的意图或内部算法 |
| 用户个例 | 某位用户报告的感受或问题,可形成验证假设 | 所有玩家的意见、统计频率、留存或收入因果 |
| 项目推论 | 结合证据和本项目目标提出的设计与实验 | 已经验证有效的竞品经验、已证实的 1000 关方案 |
Exa 抽取的商店页可能来自不同时间的缓存。本文不使用“2 天前更新”之类相对日期推断当前版本,也不把搜索结果中的出版时间当成游戏上线日期。
## 2. 先解决 Arrow Jam 的同名问题
只给出“Arrow Jam”不足以唯一定位产品。下面几个产品不能互相借用机制、关数或玩家反馈。
| 产品身份 | 已核对的主体及唯一标识 | 本次有依据的区别 |
| --- | --- | --- |
| Arrow Jam! - Tap Puzzle | Grand Games A.Ş.;iOS `6762192889` | 官方明确有限时间、先释放一枚给其他箭头让路,列出 linked arrows、corners、pipes;本次录像也显示倒计时。[商店](https://apps.apple.com/us/app/arrow-jam-tap-puzzle/id6762192889) |
| Arrow Jam | PoseidonJoy/POSEIDON TECHNOLOGY LIMITED;Android `com.sp.arrow.jam` | 文案强调指定路径、碰撞、狭窄布局,宣称数百个手作关卡。未实机核验。[商店](https://play.google.com/store/apps/details?id=com.sp.arrow.jam&hl=en) |
| Arrow Jam! - Puzzle Game | CyberGame Limited;iOS `6764256696` | 宣称 12 种形状、数百关、无计时,提到圆、心、星形。与 Grand 的有计时版本不同。[商店](https://apps.apple.com/us/app/arrow-jam-puzzle-game/id6764256696) |
| Arrows Jam: Tap Escape Puzzle | Ga Mee Global Limited;Android `com.gameeapp.android.app.arrows` | 宣称 1000+ 关、无倒计时。数字是商店声明,尚未核数。[商店](https://play.google.com/store/apps/details?id=com.gameeapp.android.app.arrows&hl=en) |
| Arrow Jam Go! Tap Escape | TidalAurum, LLC;iOS `6757224414` | 官网说 7000+,商店正文仍说数百个布局;统计范围与时间不明,不能选择较大数字当成已验证事实。[官网](https://arrowjamgo.com/)、[商店](https://apps.apple.com/us/app/arrow-jam-go-tap-escape/id6757224414) |
本报告把 **Grand Games 版本**作为有录像可交叉核对的 Arrow Jam 样本,并把其余版本保留为身份索引;这不表示已经确认用户此前说的就是 Grand 版本。后续若提供原始商店链接,可直接收束到对应版本。
另一个容易混淆的名称是 Unpuzzle。这里研究的是 **KekGames 在 Kongregate 发布的原版**,不是搜索中出现的 Hypercell、包名 `com.taptapgames.unpuzzle` 的同名手游。[原版发布页](https://www.kongregate.com/en/games/kekgames/unpuzzle)
## 3. 六个样本,分别提供什么设计信息
| 样本 | 有来源的基本结构 | 与 HEX TRAILS 最相关的内容 | 本次证据强度 |
| --- | --- | --- | --- |
| Arrow Jam! - Tap Puzzle/Grand | 限时点击释放、阻挡关系,官方列出多种障碍 | 出路发现与连续释放;关内分段与明确挑战标签 | 官方文案+视频抽帧 |
| Arrows – Puzzle Escape/Lessmore | 无计时、避免碰撞、提示;大量关卡是官方声明 | 密集折线组成轮廓;可把视觉内容与操作压力分开 | 官方文案+一张宣传截图 |
| Arrow Out/Lion Studios Plus | 方向解谜、形状关、缩放和多种道具是官方描述 | 行业体验文章报告颜色分组、星级、章节门槛 | 官方文案+二手体验,部分规则描述不一致 |
| Tap Away/Popcore | 单方向离场的 3D 方块,旋转整体从其他角度观察 | 形状本身就是关卡内容,移除过程逐步改变整块结构 | 官方文案+一张宣传截图 |
| Traffic Escape!/FOMO | 根据车顶箭头判断路径,按次序移动车辆避开其他车辆 | 让路因果的生活化表达;新增压力机制可能改变舒缓定位 | 官方文案+具体用户个例 |
| Unpuzzle/KekGames | 拖走相互拼接的方块,逐块清空 | 允许多种解序的拆解;新规则应保持标识清楚 | 创作者发布页+发行平台说明+用户个例 |
逐项证据见下文。这个表没有给各游戏打“好玩程度”或“1000 关质量”分数,因为本次证据不足以作这种排名。
### 3.1 Arrow Jam! - Tap Puzzle:计时与复杂结构是两种不同压力
Grand 的官方玩法说明把目标写得很清楚:找出路径畅通的箭头,释放它来打开其他箭头的路径,在时间结束前清空。官方同时列出相连箭头、转角、管道等障碍;这些名字不等于本次已验证其完整规则。[App Store,INT-02](https://apps.apple.com/us/app/arrow-jam-tap-puzzle/id6762192889)
本次在浏览器打开 IOSTouchplayHD 于 2026-06-02 发布的 iOS 录像,开屏可见 Grand 标识,视频描述中的商店链接也指向相同 App ID。以下是抽帧观察记录;不是从字幕生成的实机结论,也不是完整通关记录。[原录像,INT-03](https://www.youtube.com/watch?v=6tObwJPw-JA)
| 时间点 | 画面中实际可见 | 可以提炼的设计问题 |
| --- | --- | --- |
| 00:20、00:23、00:26 | “Levels 1–4”标签;从极少箭头到若干彩色折线;顶部约 3 分钟计时器;部分箭头已经离开棋盘范围 | 起步是否先提供很短的成功循环,再增加要观察的线条? |
| 00:30、00:33、00:36 | 同一标签下的彩色弯折布局逐步清空,随后出现完成反馈 | 画面复杂度与需要多少关键判断应分别记录。 |
| 00:39 | 约 3:00 起始计时;一条外围长折线包住内侧蓝色箭头群 | 外围与内侧可形成清楚的空间层级,但仅凭此帧不能确定释放依赖。 |
| 01:00 | 明确“Level 6”;灰色箭头与左侧彩色直箭头;倒计时 2:55 | 教学后的视觉变化可能来自标识或局部规则,需要完整记录交互才能判断。 |
| 03:00 | 主线节点 12、13、14,以及更上方的 Hard 标记 | 挑战有显式包装;此画面不支持固定每几关一个难关。 |
| 04:00 | 上下两簇箭头,中间幕布显示数字 7 | 关内可以分阶段揭示内容;幕布触发条件本次未完整追踪。 |
| 07:00 | 长红色外围折线、内侧绿色箭头群;计时 2:58 | 同一“围绕—内侧”的布局母题可以改变内部结构。两帧相似不等于数据重复。 |
| 10:00 | Super Hard 标签、2:46 计时、上下分布的黄色和绿色箭头 | 计时与布局共同出现;标签不是客观难度测量。 |
这些画面足以证明该样本的计时器、局部空间层级和挑战标签确实存在。**它们不能证明点击缓存、真实并行运动、动态碰撞、安全点击率或第 1000 关结构。** 即使录像看起来清得很快,也无法从少量静帧确定第二次点击何时被引擎接受。
商店里一位用户说后期图案重复;这是值得做结构去重检查的信号,但没有关号和统计样本,不可写成“Grand 后期大量重复”的事实。[同页用户评价,INT-02](https://apps.apple.com/us/app/arrow-jam-tap-puzzle/id6762192889)
**迁移建议:** 我们可借鉴清楚的外围/内侧阶段和成功反馈,但 HEX TRAILS 的长路行进本身是回报。若照搬倒计时,玩家可能被迫忽略原本想看的巡游。保留无时间压力主线,单独测试需要快操作的玩法是否成立,更符合[本项目设计准则](../level-design-principles-v2.md)。
### 3.2 Arrows – Puzzle Escape:形状与密度可以成为独立内容轴
Lessmore 的官方商店说明为无计时、避免碰撞、可用提示,并宣称数千个手作关卡;制作方官网也列出这一产品。这里的“数千”“手作”“逐渐复杂”均为制作方自述,没有公开工具、制作工时或完整关卡统计。[Google Play,INT-04](https://play.google.com/store/apps/details?id=com.ecffri.arrows&hl=en)、[Lessmore 官网,INT-05](https://lessmore.games/)
本次直接查看该 Google Play 页面第一张宣传截图:深色折线箭头密集拼出有侧面轮廓与底座的整体图案,上方有三颗心。它说明形状可以由实际棋子构成,轮廓识别与逐步清空可以同时出现。**这只是宣传选样,没有关号,不代表形状关在主线中的比例。** [截图来源页,INT-04](https://play.google.com/store/apps/details?id=com.ecffri.arrows&hl=en)
**迁移建议:**
- 给“整体轮廓”和“真实成功行进路线”各自设检查项。我们的花瓣必须由配对轨道、实际行进和整盘构图共同支持,不能只靠空轨装饰。
- 把长线条的静态外形、消除动画持续时间、棋子头部实际经过的曲线路程分开。竞品箭头线条很长,不足以证明它提供了 HEX TRAILS 想要的“起步后沿底盘多次转向”。
- 先生成“低推理负担+强形状”“中等推理+弱形状”等不同组合,避免把所有花形关放入最高难度档。
- 黑白线条减少颜色噪声,但也可能增加密集跟线负担;这种效果需要在我们的六角交织轨道上测试,不能仅从截图判定优劣。
### 3.3 Arrow Out:降低读图负担与提高通关门槛可以同时发生
Arrow Out 商店销售商为 Lion Studios Plus LLC,版权行写 Mindstorm Studios 2025。中文文案列出缩放、提示、魔法棒、橡皮擦,并宣称形状关与数千关;其“旋转箭头、移动方块”的表述不能直接视为本次已确认的实机规则。[App Store,INT-06](https://apps.apple.com/us/app/arrow-out/id6754243057?l=zh-Hans-CN)
白鲸出海 2026-05-22 的体验文章报告了另一组具体观察:线条按箭头方向退出、三次错误失败;用颜色分区降低跟线负担;同时控制箭头数与颜色数;通关星级关联误判次数,章节解锁需要星星。文章还报告第 20 关与第 40 关分别开启特定活动。这里保留为 **作者当时版本的体验报告**,不把这些关号当作当前所有版本的固定规则。[虎嗅转载,INT-07](https://www.huxiu.com/article/4860736.html)
同一文章把收入变化归因于这套改造,并引用第三方商业数据。本报告没有独立核实其收入,也不采用这种因果结论。尤其不能据此证明“多制造失误才能留住玩家”。
**迁移建议:** 颜色或线宽可以辅助读图,但先保证不改变我们的规则含义;星级、体力、广告和章节门槛属于另一层进度与商业系统。做 1000 关的第一版质量评估,应测布局本身的观察难度、反差和释放感,不能用重试次数或星级缺口替代。
**待核实矛盾:** 官方中文文案的“旋转箭头”与文章描述的直线退出是否对应不同功能、版本或翻译,目前无法确定。报告不自行补成一个混合玩法。
### 3.4 Tap Away:旋转观察、形状清空与旋转换路要区分
Popcore 的官方说明明确:点方块使其沿单一方向飞走,滑动屏幕旋转整体,从不同角度判断;随着推进,结构与方块形状变化,并有主题、皮肤。第一张宣传截图直接可见立方体堆叠、方向箭头与点击手势。[Google Play,INT-08](https://play.google.com/store/apps/details?id=com.jctswbglsm.SwipeAway&hl=en)
**迁移建议:** 方块或棋子可以拼成完整的物体,清空时整物逐步分解,这种“整体状态变化”值得借鉴。但 Tap Away 文案中的旋转用于从不同角度观察整个结构;HEX TRAILS 是棋子不动、底盘轨道改变。两种旋转对依赖关系的作用不同,不应共用一个难度计数。
一个可用的制作卡字段是:“这一操作增加了可见信息,还是实际改变了通行条件?”它能帮助我们识别无效旋转,以及真正的一转放行反差。
### 3.5 Traffic Escape!:清挡因果直观,新增压力未必增强原有享受
FOMO 官方说明要求通过车顶箭头查看路径,决定移动车辆次序,避免其他车辆,并宣称后续拥堵更大、更密集。这能支持清挡与出路判断的机制描述,不能支持真实关卡数或车道生成算法。[Google Play,INT-09](https://play.google.com/store/apps/details?id=com.bonnie.trafficescape&hl=en)
同页 2025 年 3–4 月的三条评论反对新增爆炸卡车或交换车辆:有用户说原本享受从容观察,现在不得不赶时间;其中两人自报已到 6588、17000 关。这些关号未经核验,但可形成一个明确研究问题:**把舒缓拆解增加为计时应急,是否改变了原先吸引这批玩家的体验?** 不能把三条负面评论推广为全部玩家反馈,也不据此认定这些功能总体失败。[同页评论,INT-09](https://play.google.com/store/apps/details?id=com.bonnie.trafficescape&hl=en)
**迁移建议:** 内容量增长优先改变路线形态、关键让路关系和阶段安排。引入新压力机制前,应能解释它怎样增强长路、反差或整盘释放,而不是仅仅增加失败机会。
### 3.6 Unpuzzle:多种解序与“轻松但满足”值得作为参照
KekGames 的原始发布页把目标写为逐块清空,操作为拖动方块拆离;Poki 的发行说明进一步写明有其他方块挡路时不能拖走,并允许多种解法。[Kongregate,INT-10](https://www.kongregate.com/en/games/kekgames/unpuzzle)、[Poki,INT-11](https://poki.com/en/g/unpuzzle)
原发布页有玩家说“容易但满足”,也有人指出旋转标记与方向标记叠加时不易辨认。这两类评论只能提示体验和可读性问题,不能替代测评样本。[评论所在发布页,INT-10](https://www.kongregate.com/en/games/kekgames/unpuzzle)
搜索还找到多个站转载“一百五十关、十项附加机制、无失误惩罚”等一人称文案;本次未在原官方商店重新核到,故不将转载次数计为多个独立证据,也不用它证明全体关卡性质。[存档转载线索,INT-18](https://apkpure.com/unpuzzle/com.kekgames.unpuzzle)
**迁移建议:** HEX TRAILS 成功移除只应减少障碍,玩家可以有多种合理解序。评审重点应是不同自然解序仍能触达巡游和反差,而不是强求唯一解。附加标记或新规则一旦提高识别负担,应能带来对应的体验收益。
## 4. 可以进入制作知识库的五张设计卡
以下全部是本项目建议,不能标成竞品已验证方法。
| 知识卡 | 使用时机 | 需要记录与验证 |
| --- | --- | --- |
| K1:长路不是难度代理 | 为花瓣、回环、长绕行打分时 | 实际路程、弯数、空间跨度;前置关键动作;玩家是否愿意跟完。不能用长路直接提高推理档。 |
| K2:释放关系与几何形状分开制作 | 从几个母题扩为大量关卡时 | 先写“谁放谁”,再写路线与轮廓。相同形状至少允许不同释放关系;相同依赖也可承担不同视觉内容。 |
| K3:操作流畅度是关卡可用性的前提 | 验证快点、连续清空和长路动画时 | 点击是否接收、何时启动、阻挡何时重算、是否丢输入;用实际连续操作测试,不能以视频看起来顺畅代替。 |
| K4:难关后的舒缓应降低判断量 | 安排波浪式节奏时 | 保留丰富路径与形状,减少前置依赖和必须旋转;不要一律缩为几条短直线。 |
| K5:新增内容先增强原有回报 | 考虑计时、幕布、炸弹、星级门槛时 | 写明服务哪项核心体验;若主要增加等待、赶时间或付费需求,单独评估,不纳入布局质量分。 |
## 5. 对“高质量 1000 关”的直接影响
不能据现有资料声称某竞品采取固定锯齿难度、每隔多少关给花形、前 500 关手工后 500 关程序生成。更稳妥的方案是把它们转成可测试的设计维度:
1. **结构内容轴:** 释放依赖、关键门槛数、旋转对通行条件的实际作用、阶段数量。
2. **观看内容轴:** 真实行进路程、连续弯绕、整体花形或其他轮廓、清空后的视觉变化。
3. **负担轴:** 跟线、跨区寻找阻挡、颜色与标记识别、重复点击、被系统迫使等待。
4. **节奏轴:** 首次回报何时出现,中段是否有新机会,最后几枚是否顺畅兑现。
5. **多样性轴:** 邻关在以上维度上有何不同;换色、镜像、旋转视觉包装不能自动当成新的体验。
这些轴可与论文中的任务/空间分离、质量多样性档案对接。竞品提供的是可观察的表达方式与反例;论文提供组织生成和筛选的框架;最终难度边界与编排频率仍由我们的样关、规则回放和真人体验来校准。
## 6. 排除的伪确定性,以及下一轮怎样补证
本轮明确排除两类看似直接却证据不足的材料:
- 一篇承接开发业务的文章给出“前 500 关手工、后面程序化”“每天 15–25 关”等数字,并推测 Lessmore 使用生成工具。文中没有制作方依据,不能当作 Lessmore 的实际生产法;示例代码要求唯一解,也不自然适合我们的多解序拆解规则。[被排除的商业建议,INT-16](https://raijinnstudio.com/blog/minimalist-arrow-puzzle-game-design-guide)
- 一个“第 1000 关攻略”搜索结果只列出先清外围、再清中心等通用步骤,缺少可复核的逐棋子次序。本次未验证其嵌入视频,不用它评定第 1000 关,更不把 1000 个网页条目等同于 1000 关研究。[未验证攻略,INT-17](https://arrowspuzzleguide.com/levels/1000)
后续如需竞品的精确难度曲线,应固定 App ID、版本、平台、存档起点和模式,连续记录早期关卡,再按已知关号抽取中后段;每关保留完整初盘与回放、真实输入、失误、提示使用和动画时长。对于本次仅见宣传截图的形状关,要找到带关号的实际回放。即便得到这些数据,也只能描述该版本的样本曲线;生成算法、动态分配与 AB 实验仍需公开开发者材料或获得授权的数据来确认。
@@ -0,0 +1,98 @@
# 中文箭头游戏调研:从《一箭又一箭》提取量产与节奏经验
调研日期:2026-09-12。适用项目:HEX TRAILS。检索工具:Exa。本文是有来源的设计研究;本轮没有安装、实玩这些移动游戏,也没有逐帧核验实机视频。
最有价值的发现,是《一箭又一箭》开发者已经公开讨论了我们面临的同一个问题:大量关卡怎样持续供给、怎样随玩家熟练程度重新编排。其做法可以支持“生成、评级、排序、反馈分别迭代”的生产方向,但没有公开可直接复用的难度公式,也没有证明固定的 1000 关配比。
## 1. 先确认研究的是哪个游戏
| 产品/版本 | 身份依据 | 可确认与不可合并之处 |
| --- | --- | --- |
| **一箭又一箭,微信小游戏** | [腾讯应用宝官方条目](https://sj.qq.com/appdetail/wx69949b45b793b612),小程序标识 `wx69949b45b793b612`,页面列开发者海南掌趣网络科技有限公司。[2026 年开发者大会实录](https://www.youxituoluo.com/534534.html)由广州畅想互动何毅坤讲述研发历程。 | 官方平台条目与研发分享者的主体名称不同,分别记录,不能擅自解释其代理、控股或发行关系。 |
| **一箭又一箭,Google Play App** | [Google Play 官方条目](https://play.google.com/store/apps/details?hl=zh_HK&id=com.cxgame.yjyyjgoo),包名 `com.cxgame.yjyyjgoo`,开发者 CXHD Network Technology Co. Ltd.,关于开发者列广州畅想互动网络科技有限公司。 | 可确认同名产品由该研发主体发布。不能据此认定其关卡、道具、广告、计时与微信版完全同步。 |
| **箭了又箭/超级消消,微信、抖音小游戏候选** | [行业报道](https://news.qq.com/rain/a/20260107A06XJ600)将产品归于广州池骋网络;[池骋官网](http://www.cc9527.com/)可确认公司身份,但本轮所读官网没有该产品的详细玩法条目。 | 有媒体关联,尚缺可核验的对应小程序 ID、研发说明与连续实机记录。本篇仅作为市场对照,不能当成《一箭又一箭》的别名。 |
| **箭了个箭 - 箭头向前冲,iOS App** | [App Store 官方条目](https://apps.apple.com/cn/app/id6755886795),ID `6755886795`,提供者文龙 刘。检索缓存中亦出现副标题“你聪明你来”。 | 以商店 ID 识别同一条目。其文案描述目标箭头出逃、邻箭头变向等规则,尚未实机核验;不能借相似名称给用户所指游戏补规则。 |
本轮发现了足以造成错误结论的同名和缓存问题:
- 搜索将 `wxc485463086fbd9d0` 标为“箭了又箭新”,但[实际抓取页面](https://sj.qq.com/appdetail/wxc485463086fbd9d0)标题已是“挪动物”,故排除为《箭了又箭》的当前身份凭据。
- [TapTap 的“箭了又箭”条目](https://www.taptap.cn/app/798583)和 [App Store ID 6756483139](https://apps.apple.com/cn/app/%E7%AE%AD%E4%BA%86%E5%8F%88%E7%AE%AD-%E8%B6%85%E7%BA%A7%E6%B6%88%E6%B6%88%E7%8E%8B/id6756483139)介绍的是冲刺、躲避障碍;后者提供者为盟 吉。没有证据可将它们并入池骋的箭头消除小游戏,故不用于分析其关卡逻辑。
- 复刻教程的网格尺寸、DAG 生成器、毫秒耗时,仅属于作者的复刻实现,不是原游戏的内部实现。下载站或聚合站的泛化玩法说明也不进入核心证据。
## 2. 《一箭又一箭》:开发者实际披露了什么
核心来源是 2026 年 5 月 27 日微信小游戏开发者大会上的何毅坤分享,全文核读了[游戏陀螺实录](https://www.youxituoluo.com/534534.html)、[参会者 ZRONG 实录](https://blog.zengrong.net/post/one-arrow-after-another-combo-innovation/)及[游戏日报实录](https://news.yxrb.net/2026/0528/7007.html)。三篇均来自**同一场演讲**,只算一个开发者经验来源;没有取得原始实验数据或独立复现。下列“开发者披露”均是演讲转录中的自述。
### 2.1 规模问题确实包含“内容消耗速度”
开发者称平均用户每日通过约 30–40 关,核心用户可能达到 200–300 关。这是该团队报告的产品数据,未附统计窗口、样本定义或分布,不能套用为 HEX TRAILS 的日均目标。[来源](https://www.youxituoluo.com/534534.html)
**对我们的推论:**1000 关库存能维持多久,要同时看单关体验和用户的内容消耗。按上述自述数字进行简单情景计算,1000 关对应约 25–33 个活跃日,或约 3–5 个高强度活跃日;这不是本项目的留存预测,却提示“达到 1000”与“持续有内容”需要两套验收。
### 2.2 难度排序需要随熟练程度改变
开发者称早期采用简单、中等、困难循环;老玩家后来反馈越来越简单,团队认为主要原因是熟练程度提高。随后在后段提高困难关出现频率,并在多次 A/B 试验中把难度分级从 3 档扩展到 5 档。[来源](https://blog.zengrong.net/post/one-arrow-after-another-combo-innovation/)
**对我们的推论:**相同结构的关卡,对第 20 关玩家和第 700 关玩家未必具有相同体感。我们的分级应同时记录结构负担和玩家阶段;舒缓关也应保留新的路线或漂亮的兑现方式,以免只剩熟练操作。这里没有披露“每几关一个难关”、难度阈值、评分系数或通关率目标,因此先前方案中的具体配额仍只是待测假设。
### 2.3 AI 参与了一整套制作工具与调优工作
演讲将评分算法、生成算法、编辑器、关卡排序及难度节奏调整都列为 AI 参与完成的工作;并说重排涉及大量关卡。没有公开代码、模型、提示词、数据格式、自动化边界,无法判断是运行时模型直接出图、AI 编写程序,还是二者结合。[来源](https://news.yxrb.net/2026/0528/7007.html)
**对我们的推论:**最可迁移的是工具链分工:生成器产候选,验证器保证规则,评级系统表征负担,编排器选择顺序,策划根据反馈改目标。不能把“使用 AI”当成关卡质量凭证,也不能把本项目拟议的质量多样性搜索说成该产品实际用了 MAP-Elites。
### 2.4 特殊机制以低频出现维护新鲜感
开发者说明彩色箭头额外消除、吃豆人灵感、巨大箭头、冲刺连击等变化,并称新机制平均每天只让用户遇到 1–2 次,以特殊或奖励关形式出现;巨大箭头的目标之一是带来明显的视觉变化,而不显著增加难度。[来源](https://www.youxituoluo.com/534534.html)
**对我们的推论:**“新鲜”可以来自视觉尺度、放行方式和回报变化,不必不断增加规则。但必须区分我们的两种内容:长路与轻巧反差是日常核心体验,应经常兑现;花瓣、编织、螺旋属于原有规则下的空间语言,也可以成为常见路线家族。真正改变规则的新机关,才更适合先按特殊关低频试验。不能机械地把长路关也降为每天一两次。
### 2.5 连击是正反馈目标,是否并行动画仍未知
演讲明确说连击机制来自用户希望消除更爽快的反馈,并描述利用上下线槽形成进度反馈。它没有说明同时在途棋子的数量、动画是否串行、是否缓存点击、碰撞状态何时提交。[来源](https://blog.zengrong.net/post/one-arrow-after-another-combo-innovation/)
**对我们的推论:**关卡制作和交互验证必须联合进行:同一盘在“一次看完一枚”的玩法下和快速连续点出的玩法下,奖励密度不同。我们应记录有效快速点击接收率、最大在途数、每段可连续释放的数量、长路是否被其他运动遮蔽。不能从竞品提到连击直接推出其实现了真正并行,更不能因此取消本项目用户要求的快速点击。
### 2.6 计时调节与关卡结构是两类变量
开发者自述通过动态时间限制适配不同熟练度,追求临近截止时通过的体验,并称测试改善了留存和商业表现。转录版本对商业指标出现 ARPU 与 IPU 的差异;本轮没有核实演讲幻灯片与原始口径,因此不报告提升百分比,也不把具体商业指标作为可靠结论。[游戏陀螺](https://www.youxituoluo.com/534534.html)、[ZRONG](https://blog.zengrong.net/post/one-arrow-after-another-combo-innovation/)
**对我们的推论:**同一空间谜题可以因时限变成不同的压力体验,所以难度数据必须区分结构、识别负担和外部压力。本项目现行方向强调完整观看长路、免费试路,暂无理由直接引入倒计时。先验证本项目的巡游与反差是否成立;若以后研究计时模式,应作为另一个明确的体验目标。
### 2.7 反馈解释“为什么”,不能只看流失数
演讲把内置问卷、游戏社群意见列为迭代输入,用来解释用户为什么无聊、为什么不继续,而不是只根据异常指标增加内容。[来源](https://news.yxrb.net/2026/0528/7007.html)
**对我们的推论:**试玩记录应把“没看到长路”“长路好看但接连点击不响应”“依赖看不懂”“已经熟练所以无聊”分开。这些原因对应路线、输入、可读性、排序四种不同修正,不能都归为难度偏高或偏低。
## 3. 中文同类的差异与可迁移范围
| 对照对象 | 来源能支持的设计信息 | 对 HEX TRAILS 的价值与边界 |
| --- | --- | --- |
| 一箭又一箭,Google Play 版 | 官方文案描述前方畅通时点击放出,另有黑洞、大箭头、水管传送转向等机关;强调消除音效和流畅动画。[商店](https://play.google.com/store/apps/details?hl=zh_HK&id=com.cxgame.yjyyjgoo) | 支持研究“沿路运动本身如何成为奖励”和“机关如何改变放行方式”。具体运动轨迹、连锁细节、三星规则尚未亲测;不能推定它和 HEX TRAILS 的固定轨道配对、底盘旋转相同。 |
| 箭了又箭/超级消消,小游戏候选 | 行业报道描述长短线条互相阻挡、依次拆出、碰撞回弹、失误次数与时限;提及形状、色彩、动物外观变体。[报道](https://news.qq.com/rain/a/20260107A06XJ600) | 值得对照的维度是从拥挤到清空、阻挡因果、视觉辨识与外部压力。该报道没有足够的关卡样本,不能据此重建前 1000 关曲线或推出图案关频率。 |
| 箭了个箭,iOS ID 6755886795 | 商店文案宣称朝向移动后会改变相邻箭头朝向,并有目标出口、障碍与传送门;更新说明把动画、跟手和消除反馈列为改进点。[商店](https://apps.apple.com/cn/app/id6755886795) | 若实机证实邻箭头变向,则属于“操作改变未来状态”的不同规则族,不宜照搬单调清挡的依赖模型。现阶段仅列为待测反例;“千关挑战”仍是商店宣称,不是 1000 关质量审计。 |
**一个需要纠正的行业术语:**报道把碰撞回弹、不易因误操作永久卡死称为“唯一解”。这并不严谨。有解、成功消除不会新增阻挡、只有一个合法完整消除序列,是三个不同命题。若 A、B 互不阻挡,先 A 后 B 与先 B 后 A 就已构成不同消除顺序。知识库统一使用“可解性”“成功移除的单调性”“解序列数量”,不沿用该报道的“唯一解”说法。[被核对的报道](https://news.qq.com/rain/a/20260107A06XJ600)
## 4. 长路、反差、花瓣路线应该怎样吸收这些经验
以下是本项目的设计推导,不是竞品公开配方。
| 本项目目标 | 建议进入制作卡的变量 | 候选验证方式 |
| --- | --- | --- |
| 长路巡游 | 实际成功路径长度、转弯与空间展开;首次放出位置;一路行进是否值得跟随 | 同时播放独立观赏与快速连点两种回放,检查关键长路能否被看见。不能用棋盘线条总长度替代。 |
| 轻巧反差 | 第一眼预期、目标箭头朝向、放行前置动作数、回报等待距离 | 使用朝内起步但能离场、清一枚放长路、转一次接出口等样关,询问预期与实际落差。巨大箭头的视觉反差只是相邻经验,不证明旋转反差已经有效。 |
| 花瓣及图形路线 | 外轮廓可辨认性、实际使用的花瓣路径、与上一关的结构差异 | 区分“整体轮廓像花”和“棋子真的走出花瓣轨迹”;给相同轮廓配置不同清挡或旋转节奏,剔除只换皮的近重复。 |
| 关内释放节奏 | 开局可动数、一次动作新增可动数、连续可释放数量、最后几枚的表演内容 | 制作“宽开局—短清挡—长路兑现”等明确结构,再看真实选择是否仍能碰到设计的回报。 |
| 1000 关难度曲线 | 玩家熟练阶段、结构负担、识别负担、操作和动画时长、内容新颖性 | 比较固定三拍循环与按熟练阶段调整的序列;观察继续游玩、疲劳、误点解释和回报识别,不只优化总通关数。 |
推荐先做成 **三组可比样关**:同结构换空间形态、同形态换依赖结构、同奖励换放行门槛。每组控制其他变量,分别研究玩家究竟是在享受路线、享受解锁,还是因拥挤和输入受阻而耗时。这个实验设计比直接借用竞品宣传的“越往后越难”更能指导本项目量产。
## 5. 本轮证据边界与下一次最值钱的补充
本流共运行 9 次 Exa 搜索,请求 50 个候选结果,返回 35 个不同的原始 URL;实际完成 11 个页面的正文阅读,另有 1 个 URL 抓取超时后以同一 App 的完整商店 URL 读到正文。候选数不等于阅读数,三个演讲转录也不等于三个独立产品实验。完整[检索日志](../../exa-results/level-design-2026-09-12/chinese-search-log.json)及[来源台账](../../exa-results/level-design-2026-09-12/chinese-sources.json)保留了排除项。
本轮未实玩移动版本,未亲眼核验完整实机视频或演讲配图;网页尝试受到连接和子任务浏览器能力限制。因此没有给出关号、运动时长、并行上限、花形出现频率等观察数据。正文中仅将商店文案视作产品方宣称,将演讲视作开发者经验,将行业报道视作二手信息。
后续现场样本应优先补齐:确认用户实际玩到的小程序身份与版本;各取早期、熟练后和特殊关的连续游玩记录;对同盘执行慢点、快速连点、解锁中连点,记录是否丢输入及奖励曝光;核验形状关到底改变了布局轮廓、实际路线还是规则。对样本之外的第 1000 关仍保持未知,直到得到对应数据。
+71
View File
@@ -0,0 +1,71 @@
# HEX TRAILS 关卡设计知识库
建立日期:2026-09-12。用途:为后续样关、生成器、关卡筛选、难度编排及试玩提供可追溯的设计依据。阅读入口:[关卡设计调研报告](../level-design-research-report.md)。
本库已完成两篇指定论文的全文精读,并通过 Exa 补充相关研究、产品官方资料、开发者分享和一份竞品录像的定点观察。论文、公开宣传、实际观察与项目方案分别标注,不能相互替代。
## 按设计问题查找
| 现在要解决的问题 | 首选条目 | 可直接取用的内容 |
| --- | --- | --- |
| 怎样把“清挡后放出长路”变成生成输入? | [P01:Mission 与 space](01-mission-space.md) | 任务关系、空间草图、中间表示、人工介入点 |
| 怎样保住漂亮花瓣,局部修改棋子与难度? | [P01:制作卡 B/C](01-mission-space.md) | 两路输入、固定项与可变项、局部修改后的重验证 |
| 怎样避免 1000 关只是同一种题换种子? | [P02:PCG-QD](02-pcgqd.md) | 行为特征、类内质量、多样候选档案、近重复检查 |
| 为什么不能拿长路长度直接当难度? | [P02](02-pcgqd.md)、[P04](03-progression-and-difficulty.md) | 质量/类型/难度分离,结构数据与真人表现校准 |
| 怎样安排新概念、旧概念组合和复习? | [P03:解法特征与编排](03-progression-and-difficulty.md) | 技能组合、局部差异、关卡库与顺序解耦 |
| 老玩家觉得越来越简单,该改什么? | [中文竞品研究](05-chinese-comparators.md) | 《一箭又一箭》开发者的分档、重排与反馈经验 |
| Arrow Jam 到底是哪一种规则? | [海外竞品研究](04-international-comparators.md) | 发行商/商店 ID 消歧,计时与非计时版本分开 |
| 图案、奖励和机关应如何安排频率? | [中文竞品研究](05-chinese-comparators.md)、[总报告](../level-design-research-report.md) | 核心体验、空间语言、特殊规则三者分开安排 |
| 快速连点会不会改变“好关卡”的判断? | [中文竞品研究](05-chinese-comparators.md)、[总报告](../level-design-research-report.md) | 输入响应、实际回放、奖励可见性、规则版本 |
## 证据标签与使用规则
| 标签 | 可用于什么 | 使用时保留的边界 |
| --- | --- | --- |
| 论文方法 | 生成器架构、评价与实验设计 | 方法提出、案例演示、对照实验分别写;保留前提 |
| 论文实验 | 支持在对应任务、样本、指标下的结论 | 不跨品类套用数值,不把无显著差异写成等效 |
| 开发者自述 | 了解原团队的设计意图与工作流程 | 转录可能有误;无原始数据时不作独立效果保证 |
| 官方产品说明 | 确认产品身份与其宣称的规则/内容 | “千关”“手工”“逐渐变难”不等于已审计质量 |
| 录像观察 | 描述该版本、时间点可见的行为与布局 | 未看到的不补写;单次录像不能恢复整条曲线 |
| 二手分析 | 提供待核查线索和有来源的作者体验 | 不冒充开发者算法或本轮亲测 |
| 项目建议 | 转换成样关意图、工具要求、实验问题 | 标明待验证;不因引用论文就升级为既定准则 |
同一论文的 PDF 与 HTML、同一演讲的三篇转载、同一 App 的多地区商店链接,不算独立证据。研究中的 novelty/surprise 与玩家的“新鲜/惊喜”不是天然等价指标。
## 后续制作时的最小知识使用流程
1. 先读[现行关卡设计准则](../level-design-principles-v2.md),明确该关承诺的主体验。
2. 从本库选一至两张相关设计卡,写出对本关的具体约束,避免堆砌所有指标。
3. 制作并在正式规则下回放;记录成功路径、放行关系、替代顺序与输入调度。
4. 给候选标体验类别、结构负担、评审状态和来源,不直接用单总分决定取舍。
5. 用连续试玩决定关号与相邻关,保留版本;必要时重排而不重做布局。
## 建议的关卡知识记录模板
```yaml
levelId: 稳定关卡标识,不等于当前关号
rulesVersion: 规则与输入调度版本
designIntent: 玩家应该获得的具体体验
sourceCards: [P01-B, QD-06]
primaryPiece: 关键棋子标识
fixedConstraints: 需要保留的路线/位置/放行条件
releasePattern: 直接放行/清挡/旋转/组合阶段
shapeFamily: 花瓣/环绕/螺旋/其他
observedTrace: 实际成功回放与逐棋子路径数据位置
alternativePolicies: 测过哪些合理点击和旋转策略
rewardExposure: 哪些策略中实际出现主奖励;附样本量
difficultyEvidence: 结构估计/设计者比较/玩家样本,分别填写
duplicateFamily: 同骨架与近似体验家族
reviewStatus: 待定/待修改/已验收/淘汰
reviewReason: 具体原因,不能只有分数
campaignPlacementVersion: 编排序列版本
```
这只是制作记录建议,尚未接入游戏数据格式。引用知识卡表示采用了一个设计思路,不能替代本关验证。
## 来源与维护
- [检索与来源台账入口](../../exa-results/level-design-2026-09-12/README.md):保留 URL、身份、阅读范围、证据类型与排除理由。
- [1000 关初步方案](../1000-level-production-plan.md):配额、分档及章节数仍为试验假设;本次研究没有确认其精确数值。
- 后续新增条目需记录日期、来源、阅读范围、支持的具体命题、限制及对本项目的推导。
- 玩家验证推翻建议时,保留旧建议和修正原因;不要反过来修改文献结论以迎合实现。
+191
View File
@@ -0,0 +1,191 @@
# HEX TRAILS 新版关卡设计准则
准则版本:v2 · 2026-09-10\
状态:新一轮关卡制作与评审基准;已据此制作 [v0.4 的 20 关体验版](v0.4-experience-review.md)及 [v0.5 千关首版](v0.5-production-report.md)。验收范围与例外以各版实际报告为准,真人长线体验仍待试玩。\
适用范围:主线关卡设计、样关制作、候选筛选、节奏编排与试玩评审。
本文基于本轮玩法讨论,以 v0.1 的长绕行、旋转换路和逐层让路结构为参照。准则版本不等于游戏中的布局版本;v0.4 是新增的独立体验版本,原有三版关卡与存档保持原状。
后续设计意图以本文为准;[现行玩法方向](gameplay-direction.md)和[技术说明](level-design.md)中的 v0.3 制作门槛用于解释现有实现,不能直接套用为新版目标。新准则涉及的筛选变更,须在制作样关时同步落实到生成器、测试与报告,不能仅凭本文宣称现有关卡已经符合。
## 1. 核心体验
**让玩家亲手放出棋子,看着它沿弯弯绕绕的长路径顺畅离场;也让看起来很难出去的棋子,通过一个简单动作就轻松消除。**
玩法同时提供过程享受和操作成就:棋子一路巡游本身值得观看;清挡或转盘之后把它放出来,又让玩家感到自己的操作很有收获。
箭头与路径的分工是玩法特色:**箭头决定起步方向,路径决定后续转向和最终出口。** 朝内不等于出不去,靠近边缘不等于必然好走。底盘旋转时,棋子的位置与箭头保持不动,轨道变化产生新的出路。
关卡设计先确定玩家将享受到什么,再安排达成它所需的观察和操作。难度、规模、弯轨比例与操作量是制作工具,不是核心体验的替代品。
## 2. 四项核心爽点
### 2.1 长路巡游:一次点击,享受一整段弯绕离场
玩家启动棋子,目光跟着它连续转弯、穿过交织轨道、绕到另一侧,最后开出棋盘。运动过程本身就是奖励,即使路线一眼可解,也成立。
制作要求:
- 设计实际成功离场时会走过的长绕行路线,关注连续转向、空间展开和完整的运动过程。
- 可以让长路开局就畅通,也可以通过清挡或旋转释放。长路不必先经过困难,才有观看价值。
- 路线长度、转弯数量和空间形态共同组织观感;大量互不相关的单弯消除不能替代一条完整的长绕行。
- 动画应连贯、可跟随,让转弯和穿行充分呈现。完整行进是内容,不能预先视为应压缩的等待。
- 速度与节奏通过实际播放调整;不以慢放、重复兜圈或额外停顿人为补足长路体验。
评审问题:**点下这枚棋子后,是否有一段让人愿意跟着看完的行进过程?**
### 2.2 轻巧解难的反差:看起来棘手,解决起来很轻巧
先让棋子的朝向和位置形成“它怎么出去”的直觉,再让一个简单、可理解的动作打开出路。
典型结构:一枚箭头朝内的棋子看起来不容易离场;旋转一次底盘后,箭头和棋子都没动,底下却接上向外的路线;随后点击,棋子顺畅离场。这里“一次旋转放行”指旋转建立离场条件,仍由玩家点击启动,不新增自动消除规则。
制作要求:
- 表面困难感来自箭头、位置、轨道和阻挡的组合;不靠藏线、模糊交叉或未教规则误导玩家。
- 解法保持轻巧,典型为一次旋转,或先移走一枚明显的挡路棋子,再点击目标。
- 出路打开后及时兑现,不再叠加多层阻挡,破坏“原来这么简单”的回报。
- 放行后的路线可长可短:短路突出轻巧,长绕行叠加巡游享受。
- 反差也可以由路径本身产生:朝内起步,沿轨道转向后直接离场,不要求每次都附带旋转。
评审问题:**玩家第一眼预计它有多难?实际需要多简单的动作?前后差异能否清楚感受到?**
### 2.3 清挡与换路的发现:我的操作把后面的路放出来了
棋子既是待释放对象,也可能为其他棋子占着空间。移走它,或改变底盘朝向,会打开新的路线。
制作要求:
- 让关键操作与新机会形成可辨认的因果,例如移走 A 后 B 通行,或转盘后内侧棋子接上出口。
- 允许短直出棋子承担让路、开局入口和即时反馈的作用,不按自身转弯少判定其价值低。
- 旋转应贯穿主线,并与占用变化结合;可使用“清一批再转”“转过去清挡再转回来”等结构。
- 避免所有旋转关都重复“清完能点的,随便转一下再清完”的同一种节奏。
- 成功移除只减少障碍,不破坏其他路线。解谜内容应来自发现关系和换路机会,不依赖合法消除后不可逆的死局。
评审问题:**哪一步改变了谁的出路?玩家能否看见、预判或在操作后理解这一变化?**
### 2.4 整盘逐步释放:越解越通,最终清空
单枚巡游提供局部奖励,整盘从交织受阻到逐渐放行提供持续满足。
制作要求:
- 给出可进入的开局,再通过清理和换路展开局面。
- 组织局部阶段,例如外围让路、中央放行、旋转换路、长轨收尾;并非每关必须包含全部阶段。
- 把长路和轻巧反差分布在过程中,不让前面大量操作都只是等待最后的奖励。
- 收尾可以轻松而漂亮。最后几枚既可以承担长路巡游,也可以接连顺畅离场。
- 增加棋子时,明确增加了什么体验;不能只延长重复点击。
评审问题:**从开局到结束,玩家是否不断获得新机会,并感到棋盘确实被自己逐步解开?**
## 3. 爽点之间的关系
| 组合 | 关卡表达 |
| --- | --- |
| 纯长路巡游 | 出口已经畅通,直接启动一段漂亮的长绕行,适合展示与舒缓。 |
| 轻巧反差 | 朝内棋子转一下就能出去,实际解法很简单。 |
| 清挡后巡游 | 短出口先让路,后面的长轨棋子获得释放。 |
| 旋转、反差与巡游 | 看似难出的棋子,一转接通长路线,随后完整绕行离场。 |
| 多阶段整盘释放 | 清挡、换路、长路巡游交替出现,最后清空。 |
每关应明确主爽点和关键棋子,不要求每关塞满全部四项。长路巡游与轻巧反差应成为主线反复出现的内容,不能只放在少数展示关;具体频率通过样关和试玩校准,暂不规定未经验证的每 10/20 关配额。
允许零旋转关直接提供长路巡游或路径反差,无需逐关豁免。与此同时,旋转必须保持主线核心操作的地位,不能长期退化成小棋盘中的偶尔点缀。审核时同时查看旋转频率与作用是否重复,而不是仅检查最少旋转数大于零。
## 4. 以 v0.1 为参照,纠正后续版本的偏移
三版在当前引擎下的参考解回放得到以下结构对照。这些是路径与解法数据,不是玩家满意度数据。
| 指标 | v0.1 | v0.2 | v0.3 |
| --- | ---: | ---: | ---: |
| 必须旋转的关卡 | 24/24 | 16/48 | 16/48 |
| 成功消除经过弯道的比例 | 56.2% | 7.0% | 75.1% |
| 每条弯轨成功路径平均转弯 | 3.75 次 | 1.45 次 | 1.25 次 |
| 单条成功路径最多转弯 | 16 次 | 4 次 | 4 次 |
v0.1 第 24 关的参考解先消除七枚直出棋子,后段包含 12、13、14、15 次转弯的成功路径。它说明短出口、逐层让路、旋转换路和长绕行可以组成完整的释放过程。相关案例与来源见 [v0.1 设计理念](v0.1-design-philosophy.md)及[归档布局](../levels/versions/v0.1.json)。
新版继承长绕行、解锁关系和旋转阶段,不机械复制原版的扣步压力、线性评分排序或教学缺点。尤其不能将“弯轨占比更高”视为长路体验已经恢复,也不能将原版最多 16 弯变成所有关卡必须追求的指标。
## 5. 难度、教学与节奏
### 表面困难与实际困难分开设计
“看起来难,轻松放出”是主动追求的内容。不要为了让布局显得有挑战,就同时加深依赖、延长试探或减少所有出口。
长路径增加观看内容和潜在跟线负担,但可以没有解锁门槛;短路径也可能承担复杂依赖。分别记录观看内容、推理要求和操作量,不能仅按弯数把一关定成困难。
### 教学要让玩家尽早尝到特色
前期需形成以下学习闭环,具体关号待样关编排:
1. 点击棋子,体验箭头起步、沿轨转向和离场。
2. 在低阻挡条件下完整观看一段长绕行,不把长路全部推迟到高难关。
3. 展示朝内箭头也能沿轨出盘,并用简单旋转制造一次轻巧反差。
4. 用清楚的 A 挡 B 关系,展示短出口如何释放后续路线。
5. 再组合清挡、交叉跟线与旋转;交叉不换轨须由实际路径清楚展示。
教学关一次突出一个主要理解点。玩家应亲手操作并看到回报,文字说明不能代替关卡表达。
### 舒缓不等于路线短,高潮不等于很难
- 舒缓关可减少前置阻挡,让长轨棋子更容易放出。
- 挑战关可增加少量清晰的让路与旋转关系,完成后及时兑现巡游或反差。
- 难关后降低判断负担,保留丰富的运动内容和成功反馈。
- 棋盘大小与节奏角色不固定绑定;大盘可以一转放行,小盘也能呈现长绕行。
- 六拍可作为编排参考,不固定每拍解法,也不预设首个尖峰必须位于某一关。
## 6. 每关制作卡
候选入库时填写下表;先用文字说明设计意图,再用结构数据与实际回放核对。
| 字段 | 必须说明的内容 |
| --- | --- |
| 主爽点 | 本关主要提供哪一种体验,关键棋子是谁。 |
| 第一眼预期 | 玩家预计哪些棋子好出、哪些难出;反差关尤需说明。 |
| 关键动作 | 直接点击、清挡、一次旋转,或一段短组合。 |
| 实际回报 | 哪枚棋子被放行,怎样行进,在哪一步兑现。 |
| 长路内容 | 实际成功路径的格步骤数、转弯数和空间形态;不能只统计空格装饰线。 |
| 反差内容 | 改变前后谁的出路发生变化,实际前置动作有多少。 |
| 阶段与收尾 | 开局入口、中段变化、最后几枚分别承担什么。 |
| 主要负担 | 跟线、识别阻挡、预判旋转,还是重复操作;哪些可减轻。 |
| 与相邻关的差异 | 路线形态、放行方式、依赖关系或旋转节奏有什么变化。 |
示例:主爽点为轻巧反差叠加长路巡游;目标是一枚朝内棋子;旋转一次后接上无阻挡的弯绕长路,点击即可完整离场;其余棋子提供容易理解的入口和收尾。此例是制作意图,必须由真实布局和回放证明,不能仅靠标签成立。
## 7. 验证与评审要求
### 规则正确
- 数据有效,旋转后的棋子与底格关系合法;完整参考解可回放清盘。
- 免费旋转、免费失败试路和撤销继续有效;成功消除预算为棋子数,表示剩余工作量。
- 求解触及搜索上限只能标为未确定,不能记为已验证可解。
- 轨道、碰撞、动画与点击使用一致的模型;交叉处不换轨,颜色不参与规则。
### 体验证据
- 按真实成功离场时的朝向与剩余棋子回放路径。保留 `pathUsage` 及逐棋子明细,同时检查关键路径在实际画面中的表现。
- 长路关须存在实际可释放的长绕行;多条单弯和未使用曲线不能代替。长度与弯数先记录分布和代表案例,样关验证后再制定制作带,不先用一个统一阈值裁剪全部内容。
- 反差关须明确目标棋子、改变前后路线、前置动作和放行结果。结构能证明动作简单,是否产生惊喜还需实际观看与试玩判断。
- 检查代表性的替代点击顺序与旋转探索,确认主爽点不会只藏在一条不自然的参考解中。报告注明覆盖范围,抽检不能宣称穷尽所有玩家操作。
- 检查阻挡是否可解释,必要时改布局或加强接触反馈。当前有格外擦碰不等于必然合理,也不等于应直接删去所有相关空间结构。
### 区分旧门槛与新目标
v0.3 的 65% 弯轨比例、全六朝向独立无闭环及每段至多一次旋转,不直接作为新版统一设计前提。它们可能排除值得保留的长绕行与换路关系,必须结合样关逐项决定是否沿用、调整或限定适用范围。
闭环与多次旋转不作为默认难点;若候选使用,须说明玩家如何辨认当前走不通、如何得到换路线索,以及操作后获得什么回报。轻巧反差关应保持短操作即可兑现,不能借此引入反复空转。首轮样关优先证明核心爽点,无须主动加入这些复杂情况。
### 试玩关注点
观察玩家是否愿意跟完长路、能否理解放行变化,以及是否出现“原来这么简单”的反应。分别记录主动观察、行进动画、失败试路和离开游戏的时间,不把全部动画时长当等待,也不把全部失败点击当挫败。
可询问:“哪一枚最想看它走完?”“哪一枚比你想的容易出去?”“哪一步让你觉得后面都通了?”结合行为和回答调整关卡,不用参考解、难度分或时长估计代替体验结论。
## 8. 实施顺序
先制作并回放三类样关:直接可享受的长路巡游、一次旋转放行的轻巧反差、短路清挡后释放长绕行。确认单项体验成立后,再组合成有开局、中段变化和收尾的短关卡序列。
随后根据样关修订生成器参数与筛选条件,同步测试、路径报告和制作卡,再扩大关卡量。以当前清单生成的主线仍遵循其既有生成流程;新增手作样关应单独保存可重复的布局与验证结果,不直接修改现有派生关卡文件。
本轮不预设量产总关数、广告配额或精确难度峰值。下一步首先验证:**玩家能否持续享受弯绕离场,并通过轻巧操作获得超出第一眼预期的释放感。**
+204
View File
@@ -0,0 +1,204 @@
# HEX TRAILS 关卡设计调研报告
2026-09-12 · 范围:两篇指定论文精读、相关研究、箭头消除及相邻游戏、1000 关生产建议。
**研究后的建议是:建立“设计意图与路线骨架 → 可验证的关卡候选 → 多样体验库 → 按熟练度编排 → 试玩修正”的生产体系。** 第一篇论文提供设计意图与空间共同生成的方法,PCG-QD 提供多样候选库的方法;《一箭又一箭》的开发者分享补充了大量关卡生成、分档、重排和反馈的实践。三者都没有给出可以直接照抄的千关难度曲线。
对本项目,长路巡游、轻巧反差、清挡换路和整盘释放仍是内容质量的核心。研究支持把它们变成生成约束与回放证据。具体出现频率、长度门槛、困难关比例,需要由我们的样关和玩家验证决定。
## 1. 本次研究完成了什么
| 工作 | 完成范围 | 独立笔记 |
| --- | --- | --- |
| Mission 与 space 论文 | 8 页全文,图 1–3、表 1;案例流程、结论与限制 | [精读条目 P01](level-design-knowledge/01-mission-space.md) |
| PCG-QD 论文 | 8 页全文,图 1–5、表 I;算法、应用、评价与开放问题 | [精读条目 P02](level-design-knowledge/02-pcgqd.md) |
| 序列与难度补充研究 | Refraction 自动编排研究;Lily’s Garden 真人与代理数据难度建模 | [条目 P03–P04](level-design-knowledge/03-progression-and-difficulty.md) |
| 海外竞品 | Arrow Jam 同名消歧;Arrows、Arrow Out、Tap Away、Traffic Escape、Unpuzzle;一份 Grand Games 录像定点观察与两款商店截图观察 | [海外调研](level-design-knowledge/04-international-comparators.md) |
| 中文竞品 | 一箭又一箭的版本与主体核对、开发者分享;箭了又箭、箭了个箭的差异与证据缺口 | [中文调研](level-design-knowledge/05-chinese-comparators.md) |
| 可复用知识 | 问题索引、设计卡、关卡记录模板、来源与检索台账 | [知识库入口](level-design-knowledge/README.md)、[研究台账](../exa-results/level-design-2026-09-12/README.md) |
搜索与网页阅读使用 Exa;指定论文还下载原始 PDF 核读,关键图表经过渲染检查。商店介绍属于产品方宣称,录像只说明抽查片段,开发者演讲的多个转录属于同一个经验来源。本次没有安装实玩这些移动游戏,没有审计任何竞品全部 1000 关,也没有获得其内部生成代码或原始 A/B 数据。
## 2. 两篇论文应该怎样进入我们的制作流程
### 第一篇:把“玩家经历”做成可编辑的生成对象
Karavolos 等人的两项案例分别采用“任务图先生成、再落空间”和“空间草图与任务顺序共同输入”。设计者在中间阶段编辑、检查、重跑模块,而非仅反复调整随机参数。原文也承认模板制作、歧义修正和模块测试仍需要工作,精确保留重生成结果中的指定局部尚待完善。[原文](https://livegamedesign.github.io/assets/FDG2015_Karavolos.pdf)
在我们这里,mission 可以写成“先清外侧挡子,再转一次盘,最后放出朝内的长路棋子”。space 是这个关系实际落在哪个花瓣、环带、交叉和出口。花瓣关可先锁住路线骨架,同时求兼容的放行关系;无需把所有关卡硬塞进同一种生成顺序。
需要新增的中间表示是**带状态条件的路线与释放关系**。例如“在底盘朝向 r、剩余棋子集合 S 下,移走 A 之后 B 可以沿路径 p 离场”。只记录 A 挡 B 的静态图,会漏掉旋转改变路线的情况。
### 第二篇:保存不同类型中各自优秀的候选
Gravina 等人的 PCG-QD 论文是综述与研究方向论述。其核心是让质量和行为多样性共同参与搜索;MAP-Elites 是其中一种方法,通过特征分区保存各类优秀个体。它提供候选库的思路,不负责决定玩家第 1 关到第 1000 关的顺序。[作者全文](https://antoniosliapis.com/articles/pcgqd.php)
对本项目,直接长路、清挡后巡游、一转反差、多阶段释放应该有各自的优秀候选。不能让所有关卡在“越长、越绕、旋转越多”这一个标准下竞争。先按主要放行方式分库,再用少量坐标浏览,形状与其他属性作为标签,避免过早建立巨大而空洞的多维网格。
第一版可以先实现分类、评审与检索;等特征有效,再决定是否加入从档案选择父代、变异、局部竞争的完整搜索。普通分组筛选不应冒称已实现 MAP-Elites。
### 两者结合后仍缺少的环节
可解性、核心回报是否出现、真人是否喜欢、连续十关是否重复,是四个不同判断。两篇论文都不能替我们验证后两项。补充的 Refraction 研究展示了基于解法特征的编排实验,但也暴露概念耗尽后连续选相似关的问题;Lily’s Garden 研究则说明结构、代理和玩家数据需要结合,且预测仍有误差。[Refraction 研究](https://www.ericbutler.net/assets/papers/chi2015_progression.pdf)、[难度建模研究](https://arxiv.org/html/2401.17436)
## 3. 相似游戏提供了哪些具体经验
### 先解决名称混淆
Arrow Jam 不是唯一产品:本轮发现 PoseidonJoy、Grand Games、CyberGame 等不同版本,还有 GAMEE 的 Arrows Jam、TidalAurum 的 Arrow Jam Go。Grand Games 的版本有倒计时;Lessmore 的 Arrows 官方明确无计时。身份、规则和压力来源必须分别建档。[Grand Games 商店](https://apps.apple.com/us/app/arrow-jam-tap-puzzle/id6762192889)、[Lessmore 商店](https://play.google.com/store/apps/details?id=com.ecffri.arrows&hl=en)
《一箭又一箭》也区分微信小程序与 Google Play App:腾讯平台条目列海南掌趣,开发者大会分享者是广州畅想互动何毅坤,Google Play 同名 App 的开发者信息对应畅想互动。本次没有擅自解释这些主体间的业务关系,也未假定两个平台同步更新。[腾讯条目](https://sj.qq.com/appdetail/wx69949b45b793b612)、[Google Play 条目](https://play.google.com/store/apps/details?hl=zh_HK&id=com.cxgame.yjyyjgoo)
### 核心对照
| 对象 | 可靠资料中的机制/观察 | 最值得迁移到本项目的设计问题 |
| --- | --- | --- |
| 一箭又一箭 | 开发者自述用 AI 参与生成、评分、编辑、排序;随熟练提高增加后段困难关频率,从三档扩到五档并做 A/B。[演讲实录](https://www.youxituoluo.com/534534.html) | 内容生成、难度标定和关号编排分开;用问卷解释为什么觉得无聊 |
| Arrow Jam / Grand Games | 官方列倒计时、连接箭头、转角和管道;录像可见小局起步、遮挡幕布、围框与 Super Hard 标签。[商店](https://apps.apple.com/us/app/arrow-jam-tap-puzzle/id6762192889)、[录像](https://www.youtube.com/watch?v=6tObwJPw-JA) | 新机关、空间结构、时间压力分别分析,不能把一个标签当真实难度 |
| Arrows / Lessmore | 官方强调无计时、避免碰撞与提示;商店截图可见密集折线构成整体轮廓。[商店](https://play.google.com/store/apps/details?id=com.ecffri.arrows&hl=en) | 有辨识度的整体形态与逐步清空;验证密集画面是否仍可跟线 |
| Arrow Out | 商店列形状、缩放和辅助工具;二手体验报道讨论颜色分组、星级和章节。商店部分规则文案与报道有差异,未合并成已确认规则。[商店](https://apps.apple.com/us/app/arrow-out/id6754243057?l=zh-Hans-CN)、[报道](https://www.huxiu.com/article/4860736.html) | 把局部视觉分组作为可读性实验;章节奖励与谜题结构分开评价 |
| Tap Away / Popcore | 官方说明单向移出方块、旋转立体形状观察角度,逐步改变规模和外形。[商店](https://play.google.com/store/apps/details?id=com.jctswbglsm.SwipeAway&hl=en) | 从拥挤到解开的层次感;其观察视角旋转与我们的底盘换轨作用不同 |
| Traffic Escape / FOMO | 官方说明车顶箭头指示路线,按顺序移出、避免车辆碰撞。[商店](https://play.google.com/store/apps/details?id=com.bonnie.trafficescape&hl=en) | 看得懂“谁挡了谁”以及移除后新机会;并行调度细节本轮未实测 |
| Unpuzzle / KekGames | 创作者发布页描述逐块拆解,平台说明被挡住时不能拉出、可以有多个解法。[原发布页](https://www.kongregate.com/en/games/kekgames/unpuzzle)、[平台规则](https://poki.com/en/g/unpuzzle) | 用拆解顺序与机制组合提供内容;明确可解、多解与无惩罚的区别 |
这些产品的“折线箭头有多长”“盘面轮廓是什么”,和本游戏“一枚棋子沿共享轨道行驶多远”不是同一个度量。只能迁移体验问题和组织方法,不能直接照搬它们的箭头数量或线条长度阈值。
### 有直接观察证据的片段
本轮定点查看了 IOSTouchplayHD 于 2026-06-02 发布的 Grand Games 录像:
- [00:20–00:39](https://www.youtube.com/watch?v=6tObwJPw-JA&t=20s):起步阶段的多个小局,适合研究反馈与教学密度。
- [01:00](https://www.youtube.com/watch?v=6tObwJPw-JA&t=60s):画面可见 Level 6。
- [04:00](https://www.youtube.com/watch?v=6tObwJPw-JA&t=240s):幕布及数字 7;只有画面事实,不能据此编造幕布完整触发规则。
- [07:00](https://www.youtube.com/watch?v=6tObwJPw-JA&t=420s):围框箭头与内部簇,提供外层/内层结构对照。
- [10:00](https://www.youtube.com/watch?v=6tObwJPw-JA&t=600s):可见 Super Hard 标签;没有验证其实际难度或对应的全局关号位置。
这是约 12 分钟录像中的抽查,不是连续通关测试。无法从视频准确读出点击是否被缓存、同时在途上限或丢输入情况;因此本轮没有用它宣称竞品已实现何种并行逻辑。
## 4. 《一箭又一箭》的量产经验,哪些能用
2026-05-27 的开发者分享,是本轮最贴近千关目标的实践材料。作者称早期简单—中等—困难循环在熟练用户中逐渐失去吸引力,后来增加后段困难关频率,扩充分档、重排大量关卡,并用 A/B 和问卷迭代。公开稿没有给出评分公式、实验分组规模或最优曲线参数。[全文实录](https://www.youxituoluo.com/534534.html)
由此可支持的项目决策是:
1. **关卡 ID 与关号分离。** 重新评级后可以调整顺序,同时保留来源、结构和历史表现。
2. **结构难度和熟练玩家的体感分离。** 后期是否增加组合与挑战,要看玩家反馈和行为;固定结构难度不保证体感稳定。
3. **保留核心,克制增加规则。** 演讲中的巨大箭头、彩色箭头、连击等是不同的新鲜感入口。我们的花瓣、螺旋、编织可以在原规则内提供变化。
4. **数据和解释一起采集。** “后期无聊”“看不清”“连点没反应”“只剩重复清理”应触发不同改动。
演讲中的低频特殊机制、动态计时和商业反馈需要放回其产品目标理解。长路与反差是我们的核心内容,不应因竞品特殊机关低频就降为偶尔奖励;倒计时也不能未经验证进入当前强调巡游观看、免费试路的主线。
## 5. 长路、反差、花瓣应分别怎样制作
以下为本项目方案,尚未通过本轮新试玩验证。
| 内容 | 生成时必须表达 | 验收时看什么 | 在序列中的角色 |
| --- | --- | --- | --- |
| 长路巡游 | 关键棋子的真实成功路线、转弯与空间展开,明确何时放行 | 实际行进是否成立、是否愿意跟完、多策略是否容易遇到 | 教学、舒缓、中段兑现和收尾都可使用 |
| 轻巧反差 | 第一眼预期、目标棋子、简短放行条件 | 模型证明动作轻巧;玩家证据证明预期落差 | 用少量动作带来清楚回报,可与短路或长路结合 |
| 花瓣等形状路线 | 可辨认的整体形态与实际可行驶的关键路段 | 图案是否可读、关键路线是否被真实使用、交叉是否清楚 | 成为常见路线家族;高完成度作品可承担章节记忆点 |
| 逐层释放 | 带状态条件的阻挡与换路关系、阶段奖励位置 | 哪一步打开哪些机会,是否只靠作者特定解才看得见 | 构成关内进展,并提供组合变化 |
花瓣需要分别记录三种证据:静态轮廓、实际路线、解开的阶段。轮廓相同可以换清挡/旋转关系;关系相同可以换路线形态。但仅换颜色或整体对称变换,不能自动计成新的体验原型。
一个花瓣原型至少可以提出三种不同制作意图:开局直接巡游、外侧让路后释放主瓣、一转接通内向长路。是否值得分别进入主线,要看实际释放顺序、路线和玩家感知是否有差别。
“反差”尤其不能只靠数值打标签。PCG-QD 中的算法 surprise 指结果偏离历史行为预测,与人看到内向箭头后说“原来转一下就行”含义不同。我们需要分别验证操作简洁与玩家预期,而不是套一个 surprise 算法名称。[P02 的概念辨析](level-design-knowledge/02-pcgqd.md)
## 6. 1000 关生产体系的具体建议
```mermaid
flowchart TD
A[体验意图与已教规则] --> C[带状态条件的路线和释放关系]
B[花瓣等空间草图与固定路段] --> C
C --> D[生成棋子与轨道候选]
D --> E{正式规则与回放验证}
E -->|冲突或未确定| C
E -->|通过| F[分类候选库与类内评审]
F --> G[去重和按熟练度编排]
G --> H[连续试玩与输入体验检查]
H -->|排序不合适| G
H -->|奖励或可读性有问题| C
H -->|通过| I[版本化发布与持续反馈]
I --> H
```
### 先固定真实操作逻辑
用户已经指出快速连点与并行体验的重要性。生产工具要使用最终约定的输入与运动规则:接受点击的时机、占用何时变化、旋转是否可与运动交叠、队列或并行动画如何表现。记录为 `rulesVersion`,让求解、回放和实际操作对应同一版本。
如果未来真实并行改变了沿路动态占用,静态顺序求解的证明范围也要重审。即便只是动画串行,快速点击等待仍会影响长路的体感;这类时间应与主动观察、主动观看分别计量。
### 三个可以分别改动的产物
| 产物 | 内容 | 何时修改 |
| --- | --- | --- |
| 原型/骨架库 | 路线语汇、释放关系、固定约束、变化范围 | 需要新体验或发现某类内容无法稳定生成 |
| 关卡候选库 | 固定布局、完整回放、体验标签、评审、近似家族 | 生成新布局或修改单关 |
| 主线编排表 | 关卡 ID 顺序、目标熟练度、相邻差异、版本 | 难度重新校准、连续体验重复或节奏失衡 |
评价按规则正确性、体验类型、本类质量和难度证据分别保存。先用已有样关标定可解释的档位,不让现有总分替代全部判断。每次修改筛选规则都保留淘汰原因,检查是否系统性删掉了轻松而漂亮的内容。
### 难度曲线控制的对象
推荐控制的是某类玩家连续游玩时的体感,而非强制结构分数单调变化。前期逐步引入箭头起步、沿轨转向、交叉不换轨、清挡和转盘,再增加熟悉关系的组合。后期保持舒缓与挑战的变化,并按熟练度反馈调整挑战出现率。
长路观看量、推理负担、视觉负担、操作量应该画成不同序列。难关后的舒缓关可以继续有丰富巡游;章节观赏高点也可以是轻松的。一段 **仅用于说明的八关节奏** 可以是:
| 位置 | 主要内容 | 目标推理负担 | 回报安排 |
| --- | --- | --- | --- |
| 1 | 熟悉入口,直接长路 | 低 | 立即巡游 |
| 2 | 清一枚放出目标 | 低至中 | 清楚因果 |
| 3 | 已教旋转带来内向出口 | 中 | 轻巧反差 |
| 4 | 花瓣形态,宽松放行 | 低 | 丰富观看 |
| 5 | 两个熟悉关系组合 | 中 | 分段兑现 |
| 6 | 跨区清挡与换路 | 较高 | 完成后充分放行 |
| 7 | 开放出口的长绕行 | 低 | 熟练感与舒缓 |
| 8 | 另一种形态的整盘释放 | 中 | 阶段收束 |
这不是发现了竞品的八关周期,也不是要求每段第六关最难。不同段落需要错开长度、峰值和内容顺序,具体节奏应比较后选择。
### 扩到 1000 的验收顺序
建议沿用“基准样关 → 首批 100 → 300 → 600 → 1000”的分批思路。基准样关按体验和负担覆盖,不直接当玩家前几十关。每批发布前分别检查:
1. **全部可验证。** 每关有正式规则下可回放的清盘解;超时或未确定的候选不混入已验证集合。
2. **承诺内容成立。** 主长路、反差、形状路线和阶段释放有对应证据;关键效果不是只存在于未使用装饰线。
3. **有可感知变化。** 同骨架、同释放节奏和相邻近似关可被查出;不以种子不同代替新内容。
4. **连续体验成立。** 按序游玩覆盖开局、中段和收尾,排查重复清理、视觉拥挤、输入等待及熟练后无聊。
5. **来源可追踪。** 规则、生成器、模板、评价、编排和试玩记录均有版本。
一批未通过时,先判断问题在骨架、布子、显示/输入还是排序,再修对应环节。不要靠扩大候选数掩盖评价目标不正确的问题。
## 7. 对之前 1000 关方案的修正
| 原有建议 | 研究后的处理 |
| --- | --- |
| 20 章 × 50 关、固定 D1–D5 数量 | 保留为制作预算假设;没有论文或竞品公开证据证明这些精确配额 |
| 后半程平均难度平台 | 改为追求目标玩家的体感稳定;结构要求和困难关频率可随熟练变化 |
| 长路、反差、花形的具体覆盖比例 | 不由学术引用背书;先验证识别、观看意愿与连续疲劳,再定频率 |
| 先体验骨架再几何 | 保留,同时允许花瓣空间草图与体验关系共同输入 |
| 使用质量多样性管理候选 | 支持方向;先检验标签与类内评审是否有效,再决定算法复杂度 |
| 原有多维评审与节奏编排 | 保留相邻差异、奖励曝光和熟练度校准,并补充解法特征编排研究及可比较实验 |
| 自动化提升制作效率 | 计入模板、评价器、工具和人工评审成本,实测总工时与验收产量 |
这些修正针对论据和实施方式,不代表本轮已经生成或验收了 1000 关。原始讨论稿继续保留:[1000 关制作方案](1000-level-production-plan.md)。
## 8. 最值得先做的三组验证
| 验证 | 控制什么 | 观察什么 | 用结果决定什么 |
| --- | --- | --- | --- |
| 同一释放结构,换花瓣/环绕等空间;同一形态,换释放结构 | 尽量保持棋子数、输入规则与主要操作负担可比 | 玩家是否感到不同、愿意看哪条路、能否说明关键变化 | 哪些维度真能支持内容扩容 |
| 相同候选预算:现有单分筛选与分类后类内评审 | 使用相同规则、候选来源与评审条件 | 合格数量、可感知差异、重复率、人工筛选时间 | 候选档案是否值得进一步实现 QD 搜索 |
| 同一批关卡,不同编排序列 | 规则、动画、内容和外部奖励保持一致;按熟练度分组 | 连续游玩、主动观察、奖励识别、疲劳及不继续的解释 | 难度波动、舒缓位置与后期挑战比例 |
先用小规模观察找机制问题,不能将探索性样本的通关率当精确行业指标。规模化 A/B 前再定义主要指标、样本与停止规则;同时保存反例和定性反馈。实际体验评审应覆盖慢点观看与快速连续点出的玩法,避免只优化其中一种。
## 9. 研究还没有回答的事情
- 各竞品真实的千关布局、重复率与难度分布;商店关数声明尚未逐关核对。
- Arrow Jam 与《一箭又一箭》的实际点击缓存、并行动画、状态提交与碰撞实现。
- 开发者自述中的 AI 技术类型、原始评级公式、A/B 最优参数与效果量。
- 本项目玩家对长路长度、花瓣密度、反差和难度波动的偏好分布。
这些缺口已进入知识库的验证问题。现阶段足够明确的方向是:用有意图的路线和释放结构生成,用分类候选库维护变化,用真人连续体验校准顺序,逐批扩大已验收的内容。
+30
View File
@@ -0,0 +1,30 @@
# 三关入门序章
2026-09-12。入口:[开始教学](http://localhost:4173/?campaign=v0.5&tutorial=1)。选关窗口将三个教学入口放在正式章节前,可以随时重玩。
| 教学 | 棋盘 / 棋子 | 玩家学会什么 | 最少操作 |
| --- | --- | --- | --- |
| 点一下,出发 | 完整 19 格 / 1 枚 | 箭头决定起步方向,沿弯道自动转向,离场即完成 | 1 次点击 |
| 先给它让路 | 同一完整 19 格盘 / 2 枚 | 先移下方挡子,再点上方棋子;可以连续点击 | 2 次点击 |
| 转一下,路就通了 | 完整 19 格 / 2 枚 | 旋转轨道打开新出口,棋子位置和箭头不动 | 1 次旋转 + 2 次点击 |
根据用户反馈,原先的 4 / 4 / 7 格教学盘统一替换为与正式第 1 关相同的完整半径 2 六边形,保留全部 19 个格子和边角,仅减少棋子。三课由规整的直脊和两侧连续圆弯组成,前两课共用同一底板;第二课只增加一个新的阻挡关系。第三课上下对称,左右任一方向转一次都能清盘。主路线经过 6 格、转 5 次弯;第二课的挡子走 2 弯离场。每格的三对轨道全部真实、完整且格内不交叉,统一颜色和线宽。
界面与操作沿用游戏已有逻辑:教学说明使用原来的限时提示,旋转、撤销、重来和提示使用原有控件。前两课通过关卡数据禁用旋转,第三课允许旋转;不新增或隐藏教学专用控件,不另设布局或配色。每课结算复用原有弹窗;完成第三课后点击“开始第 1 关”,进入原来的正式关卡。
## 入口与进度
教学布局位于 `src/tutorial-levels.js`,作为 `campaign.tutorials` 接入,未插入正式的 `levels` 数组。正式 1–1000 的编号、关卡 ID、直接链接和已完成记录都保持原位。
新玩家无指定关号进入 v0.5 时自动开始教学。未完成的教学可以续玩;有正式关进度的玩家继续原关卡。`?tutorial=1` 至 `?tutorial=3` 明确打开对应教学,`?level=1` 仍直达正式第 1 关。教学使用独立键 `hex-trails-tutorial-v1-v0.5`,完成或重玩教学不计入正式通关数。
## 已完成的验证
- 正式 `Game`、`validateLevel`、`trace` 和求解器验证全部三课。第二课点击被挡棋子不耗额度;清挡后的新点击立即可用。第三课验证左右两种旋转和两种清盘顺序。
- 本轮 **43 项相关测试通过**,覆盖三课布局与显式 19 格坐标集合、三课衔接、重玩、旧正式关进度、切版本后刷新、从教学进入工坊,以及原快速连点规则。静态构建通过。正式 1000 关的布局和生成流水线未改动。
- 390×844 浏览器正常动画下重新依次完成完整棋盘的三课。第二课挡子与主棋子可连续点击;第三课向右旋转一次,两个箭头保持原位并成功离场。教学期间正式存档保持不变,点击开始第 1 关后只更新当前正式关位置,保留原通关集合。[当前操作记录](tutorial-review/playthrough.json)。旧小棋盘截图与操作证据移至 `tutorial-review/initial-small/`,不作为当前布局的验收证据。
- 检查 320×568 与 1440×1000 的第三课、390×844 的全部三课与选关入口。[尺寸记录](tutorial-review/responsive.json)。这是浏览器视口与实际指针操作验证,不等同于真机手指误触测试。
按用户限定的制作范围,已撤回自行添加的缩放按钮显示、教学控件隐藏、常驻提示及专用布局与配色。43 项相关测试再次通过,包含原提示到时消失的验证。390×844 浏览器确认原有控件显示,前两课旋转禁用、第三课启用,选关使用既有按钮样式且能够切换教学,正式第 1 关也无新增缩放按钮。[恢复现有界面后的画面](tutorial-review/ui-restored-mobile.png)。
以下为恢复界面前的完整棋盘记录,布局与操作验证仍适用,控件样式以最新画面为准:[第一课](tutorial-review/lesson-1-mobile.png) · [第二课](tutorial-review/lesson-2-mobile.png) · [第三课](tutorial-review/lesson-3-mobile.png) · [选关入口](tutorial-review/map-mobile.png) · [小屏](tutorial-review/lesson-3-small.png) · [桌面](tutorial-review/lesson-3-desktop.png)
Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

@@ -0,0 +1,85 @@
{
"earlier": {
"actions": [
{
"lesson": "trail-tutorial-01",
"type": "tap",
"id": "traveler",
"status": "exit",
"steps": 4,
"time": 462.7000000178814
},
{
"lesson": "trail-tutorial-02",
"type": "tap",
"id": "traveler",
"status": "blocked",
"steps": 3,
"time": 46924.20000001788
},
{
"lesson": "trail-tutorial-02",
"type": "tap",
"id": "gate",
"status": "exit",
"steps": 1,
"time": 47732.20000001788
},
{
"lesson": "trail-tutorial-02",
"type": "tap",
"id": "traveler",
"status": "exit",
"steps": 4,
"time": 47740.40000000596
}
],
"formalBefore": "{\"current\":848,\"completed\":[999,33,848]}"
},
"opened": {
"orientation": "300°",
"feedback": "转一转,2 枚棋子的出口打开了!"
},
"third": {
"won": true,
"result": "入门 3 / 3\n转一下,路就通了\n\n旋转只改变底盘轨道,棋子的位置和箭头不变。新路线接通,就能出发。\n\n开始第 1 关\n再试一次",
"actions": [
{
"lesson": "trail-tutorial-03",
"type": "rotate",
"dir": -1,
"status": "rotated",
"tilesFixed": true
},
{
"lesson": "trail-tutorial-03",
"type": "tap",
"id": "north",
"status": "exit",
"steps": 4,
"time": 779.5
},
{
"lesson": "trail-tutorial-03",
"type": "tap",
"id": "south",
"status": "exit",
"steps": 4,
"time": 891
}
],
"tutorialProgress": "{\"current\":2,\"completed\":[0,1,2]}",
"formalAfterTeaching": "{\"current\":848,\"completed\":[999,33,848]}"
},
"entered": {
"header": "LEVEL 01",
"moves": "3",
"tutorial": false,
"formalProgress": "{\"current\":0,\"completed\":[999,33,848]}",
"viewport": {
"width": 390,
"height": 844,
"scrollWidth": 390
}
}
}
@@ -0,0 +1,116 @@
[
{
"header": "入门 3 / 3",
"width": 320,
"height": 568,
"scrollWidth": 320,
"scrollHeight": 568,
"notice": {
"x": 20,
"y": 98,
"width": 280,
"height": 56,
"top": 98,
"right": 300,
"bottom": 154,
"left": 20
},
"noticeOpacity": "1",
"canvas": {
"x": 8,
"y": 160,
"width": 304,
"height": 336,
"top": 160,
"right": 312,
"bottom": 496,
"left": 8
},
"rotate": {
"x": 210.6640625,
"y": 493.3565979003906,
"width": 101.3359375,
"height": 63.999969482421875,
"top": 493.3565979003906,
"right": 312,
"bottom": 557.3565673828125,
"left": 210.6640625
}
},
{
"header": "入门 3 / 3",
"width": 390,
"height": 844,
"scrollWidth": 390,
"scrollHeight": 844,
"notice": {
"x": 49.5,
"y": 107,
"width": 291,
"height": 38,
"top": 107,
"right": 340.5,
"bottom": 145,
"left": 49.5
},
"noticeOpacity": "1",
"canvas": {
"x": 8,
"y": 160,
"width": 373.9921875,
"height": 612,
"top": 160,
"right": 381.9921875,
"bottom": 772,
"left": 8
},
"rotate": {
"x": 257.328125,
"y": 769.2265014648438,
"width": 124.6640625,
"height": 64,
"top": 769.2265014648438,
"right": 381.9921875,
"bottom": 833.2265014648438,
"left": 257.328125
}
},
{
"header": "入门 3 / 3",
"width": 1440,
"height": 1000,
"scrollWidth": 1440,
"scrollHeight": 1000,
"notice": {
"x": 564.75,
"y": 130.25,
"width": 310.5,
"height": 39.5,
"top": 130.25,
"right": 875.25,
"bottom": 169.75,
"left": 564.75
},
"noticeOpacity": "1",
"canvas": {
"x": 260,
"y": 184,
"width": 919.9921875,
"height": 712,
"top": 184,
"right": 1179.9921875,
"bottom": 896,
"left": 260
},
"rotate": {
"x": 873.328125,
"y": 895.62353515625,
"width": 306.6640625,
"height": 72,
"top": 895.62353515625,
"right": 1179.9921875,
"bottom": 967.62353515625,
"left": 873.328125
}
}
]
Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

+79
View File
@@ -0,0 +1,79 @@
{
"edition": "complete-19-cell-boards",
"formalBefore": "{\"current\":0,\"completed\":[999,33,848]}",
"results": [
{
"header": "入门 1 / 3",
"won": true,
"moves": "0",
"cells": 19
},
{
"header": "入门 2 / 3",
"won": true,
"moves": "0",
"cells": 19
},
{
"header": "入门 3 / 3",
"won": true,
"moves": "0",
"cells": 19
}
],
"actions": [
{
"lesson": "trail-tutorial-01",
"type": "tap",
"id": "traveler",
"status": "exit",
"steps": 6,
"time": 64082.79999998212
},
{
"lesson": "trail-tutorial-02",
"type": "tap",
"id": "gate",
"status": "exit",
"steps": 3,
"time": 66306
},
{
"lesson": "trail-tutorial-02",
"type": "tap",
"id": "traveler",
"status": "exit",
"steps": 6,
"time": 66308.79999998212
},
{
"lesson": "trail-tutorial-03",
"type": "rotate",
"dir": 1,
"status": "rotated",
"tilesFixed": true
},
{
"lesson": "trail-tutorial-03",
"type": "tap",
"id": "north",
"status": "exit",
"steps": 6,
"time": 68922.19999998808
},
{
"lesson": "trail-tutorial-03",
"type": "tap",
"id": "south",
"status": "exit",
"steps": 6,
"time": 68928
}
],
"formalAfterTeaching": "{\"current\":0,\"completed\":[999,33,848]}",
"tutorialProgress": "{\"current\":2,\"completed\":[0,1,2]}",
"entered": {
"header": "LEVEL 01",
"formalProgress": "{\"current\":0,\"completed\":[999,33,848]}"
}
}
+46
View File
@@ -0,0 +1,46 @@
[
{
"width": 320,
"height": 568,
"scrollWidth": 320,
"scrollHeight": 568,
"cells": 19,
"canvas": {
"x": 8,
"y": 160,
"width": 304,
"height": 336,
"top": 160,
"right": 312,
"bottom": 496,
"left": 8
},
"bounds": {
"top": 29.43674831559187,
"bottom": 306.5632516844081
},
"allRowsVisible": true
},
{
"width": 1440,
"height": 1000,
"scrollWidth": 1440,
"scrollHeight": 1000,
"cells": 19,
"canvas": {
"x": 260,
"y": 184,
"width": 919.9921875,
"height": 712,
"top": 184,
"right": 1179.9921875,
"bottom": 896,
"left": 260
},
"bounds": {
"top": 47.69676500219191,
"bottom": 664.3032349978081
},
"allRowsVisible": true
}
]
Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

+219
View File
@@ -0,0 +1,219 @@
# v0.4 · 长路与惊喜:20 关体验与回放
依据 [新版设计准则](level-design-principles-v2.md),按 4 组 × 5 关编排。制作来源为 [种子与制作卡](../levels/v0.4-seeds.json),运行 `npm run levels:v04` 同步布局、模块和本报告。全部为新种子生成与筛选的布局,没有重用旧版关卡。
20 关参考解共 199 次成功消除,其中 89 条路径至少转弯 6 次;每条弯轨路径平均 6.89 弯,最长 18 弯。13 关必须旋转,5 关存在开局朝内棋子一次旋转后立即可点击离场的完整体验解。
“长路”在本批统计中指至少 6 弯,仅用于样关比较。下表路径与旋转来自最少旋转参考解;反差关另有先转盘、再点击目标的完整体验解。结构分会给长路加分,不应把直接可清空的巡游关误判成高推理负担。没有真人用时或满意度数据。
| 关 | 名称 | 体验 | 格 / 棋子 | 开局可出 | 最少旋转 | 最长弯数 | 长路条数 | 参考 / 体验格外阻挡样本 |
| --- | --- | --- | --- | ---: | ---: | ---: | ---: | ---: |
| 1 | 跟着它绕出去 | 长路巡游 | 19 / 4 | 4 | 0 | 9 | 2 | 0 / 0 |
| 2 | 朝里面,也能出去 | 轻巧反差 | 19 / 5 | 2 | 1 | 6 | 1 | 0 / 1 |
| 3 | 让开,长路就通了 | 清挡放行 | 37 / 7 | 5 | 0 | 10 | 4 | 0 / 0 |
| 4 | 转出另一段风景 | 旋转换路 | 37 / 9 | 4 | 1 | 14 | 4 | 0 / 0 |
| 5 | 尽情绕一圈 | 长路巡游 | 37 / 7 | 7 | 0 | 14 | 4 | 0 / 0 |
| 6 | 里面藏着一条长路 | 清挡放行 | 37 / 11 | 1 | 1 | 16 | 6 | 3 / 3 |
| 7 | 轻轻一转就放行 | 轻巧反差 | 37 / 7 | 1 | 1 | 15 | 6 | 0 / 0 |
| 8 | 转过去,再转回来 | 往返换路 | 37 / 12 | 4 | 2 | 11 | 8 | 5 / 5 |
| 9 | 一路弯到出口 | 长路巡游 | 37 / 8 | 8 | 0 | 16 | 3 | 0 / 0 |
| 10 | 把整片路打开 | 分段释放 | 37 / 14 | 4 | 2 | 12 | 4 | 4 / 4 |
| 11 | 原来近在眼前 | 轻巧反差 | 37 / 8 | 2 | 1 | 16 | 5 | 1 / 1 |
| 12 | 小出口,大巡游 | 清挡放行 | 37 / 12 | 6 | 0 | 15 | 5 | 0 / 0 |
| 13 | 两次转机 | 分段释放 | 37 / 16 | 4 | 2 | 17 | 7 | 7 / 7 |
| 14 | 向内出发,向外远行 | 轻巧反差 | 37 / 8 | 4 | 1 | 12 | 3 | 2 / 1 |
| 15 | 给眼睛一段旅行 | 长路巡游 | 37 / 7 | 7 | 0 | 14 | 3 | 0 / 0 |
| 16 | 回来时,路已不同 | 往返换路 | 37 / 16 | 4 | 2 | 14 | 6 | 5 / 5 |
| 17 | 一个转角,全盘松开 | 轻巧反差 | 37 / 7 | 3 | 1 | 13 | 3 | 2 / 0 |
| 18 | 畅通的弯弯长路 | 长路巡游 | 37 / 7 | 7 | 0 | 18 | 3 | 0 / 0 |
| 19 | 逐层放出长回廊 | 分段释放 | 37 / 18 | 6 | 2 | 18 | 5 | 8 / 8 |
| 20 | 最后,一路盛放 | 长路收束 | 37 / 16 | 4 | 3 | 18 | 7 | 21 / 21 |
## 验收边界
两套完整回放均可通关,相邻消除之间最多一次旋转;巡游关开局全可出;反差关目标确实朝内,开局被路线内棋子阻挡,左右其中一次旋转就获得无碰撞出口;清挡关有短路线释放至少 8 弯路径;往返关包含两个相反方向的必要旋转。
本版恢复多阶段与长绕行,没有沿用 v0.3 全六朝向无闭环、参考状态格外阻挡为零的统一筛选。表中的格外阻挡样本按“决策状态 × 棋子”计,同一阻挡可重复出现;实际阻挡对象与接触反馈继续使用现有引擎。六朝向开局的闭环和擦碰明细保存在 [完整分析](../levels/v0.4-analysis.json),不能宣称所有探索路径都无闭环、无擦碰。替代顺序的可解性另由测试检查,真人可读性与完整动画手感仍需试玩。
## 逐关制作卡
### 01 · 跟着它绕出去
4 枚棋子开局都能离场。用直接可点的长绕行建立“箭头起步、轨道转向”的感受;不要求先找顺序,首关就完整赠送巡游。
- 提示:先点一枚棋子,看它沿弯弯绕绕的轨道开出去
- 关键体验路径:`t0`,9 弯 / 11 格步骤。
- 完整体验动作:t0 → t1 → t2 → t3。
### 02 · 朝里面,也能出去
右下角的目标朝内,被路线上的另一枚棋子阻挡。一次左转直接放出它,并完整经过多处弯道;几枚外围棋子提供可自由尝试的入口。
- 提示:留意右下角向上的箭头,向左转一下,再让它出发
- 关键体验路径:`t1`,7 弯 / 10 格步骤。
- 反差操作:开局左转一次,再点 `t4`(6 弯);箭头确实指向更内侧的六边形环。
- 参考换路阶段:剩 2 枚时右转。
- 完整体验动作:左转 → t4 → t3 → t2 → t1 → t0。
### 03 · 让开,长路就通了
用短出口承担让路作用,清除关键阻挡后放出至少 8 弯的路线。保持无需旋转,集中体验一次消除给后面带来的变化。
- 提示:交叉处沿同一条线走;先移走挡路棋子,长路就通了
- 关键体验路径:`t1`,10 弯 / 14 格步骤。
- 清挡证据:参考解第 5 次操作移走 `t6`,为 `t1` 打开 10 弯路径。
- 完整体验动作:t2 → t3 → t4 → t5 → t6 → t0 → t1。
### 04 · 转出另一段风景
把一次必要换路引入小规模的分段清理。旋转前后都保留长路径的观看回报,避免只有末子为转而转。
- 提示:先放出能走的棋子,再转动底盘,看看新路线
- 关键体验路径:`t0`,14 弯 / 18 格步骤。
- 参考换路阶段:剩 5 枚时左转。
- 完整体验动作:t4 → t5 → t7 → t8 → 左转 → t3 → t6 → t2 → t1 → t0。
### 05 · 尽情绕一圈
本组放气关。全部棋子开局可走,没有先后要求,让多条长路线直接供玩家启动;通过观看内容收束前面的学习。
- 提示:这些弯路已经畅通,选喜欢的一枚看它走完
- 关键体验路径:`t0`,14 弯 / 17 格步骤。
- 完整体验动作:t0 → t1 → t2 → t3 → t4 → t5 → t6。
### 06 · 里面藏着一条长路
少量初始出口形成明确突破口。清挡和旋转共同打开深处路线,让一枚短路棋子的移除释放长绕行;比上一关增加关系负担。
- 提示:先找到一枚能出去的,给里面的长路腾出位置
- 关键体验路径:`t0`,16 弯 / 21 格步骤。
- 清挡证据:参考解第 7 次操作移走 `t7`,为 `t3` 打开 9 弯路径。
- 参考换路阶段:剩 9 枚时左转。
- 完整体验动作:t10 → t4 → 左转 → t8 → t9 → t6 → t7 → t3 → t5 → t2 → t1 → t0。
### 07 · 轻轻一转就放行
用较少棋子表现看似受困的内向箭头。开局一次正确旋转就能直接启动目标的长路径,允许先转后消,降低实际前置操作。
- 提示:朝内不等于出不去,试着换一个方向
- 关键体验路径:`t0`,15 弯 / 19 格步骤。
- 反差操作:开局左转一次,再点 `t5`(9 弯);箭头确实指向更内侧的六边形环。
- 参考换路阶段:剩 6 枚时左转。
- 完整体验动作:左转 → t5 → t3 → t4 → t6 → t2 → t1 → t0。
### 08 · 转过去,再转回来
两次相反方向的必要旋转形成完整往返。中间确实移走棋子,因此回到原朝向后新增出口;长轨道贯穿清理过程。
- 提示:转过去让开位置,再转回来,原来的路就通了
- 关键体验路径:`t1`,11 弯 / 13 格步骤。
- 参考换路阶段:剩 3 枚时右转 → 剩 2 枚时左转。
- 完整体验动作:t6 → t8 → t10 → t11 → t5 → t7 → t2 → t3 → t0 → 右转 → t9 → 左转 → t1 → t4。
### 09 · 一路弯到出口
往返判断后的释放关。开局全可出,任意消除顺序都安全;保持长路径内容,减少推理要求。
- 提示:路都通了,慢慢看它们绕出去
- 关键体验路径:`t0`,16 弯 / 19 格步骤。
- 完整体验动作:t0 → t1 → t2 → t3 → t4 → t5 → t6 → t7。
### 10 · 把整片路打开
用两次必要旋转分段清开棋盘。各阶段持续提供巡游内容,长路线分布在多个成功消除中,避免前段只有准备动作。
- 提示:每打开一片出口,就让它们先走一段
- 关键体验路径:`t1`,12 弯 / 14 格步骤。
- 参考换路阶段:剩 7 枚时左转 → 剩 6 枚时左转。
- 完整体验动作:t8 → t11 → t12 → t13 → t0 → t10 → t9 → 左转 → t5 → 左转 → t4 → t6 → t7 → t3 → t2 → t1。
### 11 · 原来近在眼前
独立展示短路型反差:朝内目标开局一次旋转后只经过 3 弯即可离场。其他棋子保留长路巡游,使轻巧反差不依赖长路线长度。
- 提示:看似往里走,换条路就近出去了
- 关键体验路径:`t0`,16 弯 / 19 格步骤。
- 反差操作:开局左转一次,再点 `t7`(3 弯);箭头确实指向更内侧的六边形环。
- 参考换路阶段:剩 6 枚时左转。
- 完整体验动作:左转 → t7 → t5 → t6 → t4 → t3 → t2 → t1 → t0。
### 12 · 小出口,大巡游
无需旋转的清挡组合。开局提供多个入口,一枚短路棋子解除真实路线占用,立即放行长路径;用更深的内容承接短路反差。
- 提示:先放走短路棋子,后面的长回廊就打开了
- 关键体验路径:`t0`,15 弯 / 17 格步骤。
- 清挡证据:参考解第 2 次操作移走 `t7`,为 `t2` 打开 10 弯路径。
- 完整体验动作:t6 → t7 → t8 → t9 → t10 → t11 → t2 → t4 → t5 → t1 → t3 → t0。
### 13 · 两次转机
两次必要旋转与较多棋子形成中段小峰。不是延长空转,而是在每次旋转后获得可消除出口,并将多条长绕行组织进清场。
- 提示:清开一段,转出一段,再接着解开
- 关键体验路径:`t0`,17 弯 / 22 格步骤。
- 参考换路阶段:剩 11 枚时左转 → 剩 10 枚时左转。
- 完整体验动作:t9 → t13 → t14 → t15 → t12 → 左转 → t10 → 左转 → t7 → t11 → t6 → t8 → t5 → t4 → t3 → t2 → t1 → t0。
### 14 · 向内出发,向外远行
看似朝内的目标开局一次旋转即可出发,接上一条长绕行;基准朝向的布局全部可出,发现方向后进入持续放行。
- 提示:这个朝内的箭头,一转也能接上长路
- 关键体验路径:`t0`,12 弯 / 16 格步骤。
- 反差操作:开局左转一次,再点 `t0`(12 弯);箭头确实指向更内侧的六边形环。
- 参考换路阶段:剩 3 枚时左转。
- 完整体验动作:左转 → t0 → t1 → t2 → t3 → t4 → t5 → t6 → t7。
### 15 · 给眼睛一段旅行
本组观看回报关。全盘开局可出,直接放送更长的绕行与多条巡游,收回上一段的操作与判断负担。
- 提示:先不用转盘,把这段长风景看完
- 关键体验路径:`t0`,14 弯 / 19 格步骤。
- 完整体验动作:t0 → t1 → t2 → t3 → t4 → t5 → t6。
### 16 · 回来时,路已不同
复习往返换路,扩大剩余棋子关系。转过去处理关键阻挡,再回到原方向形成新的放行条件;不靠增加棋盘面积表现进展。
- 提示:同一个方向,少了一枚挡路棋子,就不一样了
- 关键体验路径:`t0`,14 弯 / 18 格步骤。
- 参考换路阶段:剩 10 枚时右转 → 剩 9 枚时左转。
- 完整体验动作:t11 → t12 → t14 → t15 → t8 → t9 → 右转 → t13 → 左转 → t10 → t6 → t7 → t0 → t5 → t4 → t3 → t1 → t2。
### 17 · 一个转角,全盘松开
用一次旋转把明显受阻的内向目标变成可直接消除的棋子。基准朝向保留大量同时可出的路线,让反差之后衔接连续长路巡游。
- 提示:轻轻一转,朝内的棋子也有了出口
- 关键体验路径:`t0`,13 弯 / 15 格步骤。
- 反差操作:开局左转一次,再点 `t0`(13 弯);箭头确实指向更内侧的六边形环。
- 参考换路阶段:剩 4 枚时左转。
- 完整体验动作:左转 → t0 → t1 → t2 → t3 → t4 → t5 → t6。
### 18 · 畅通的弯弯长路
在最后的组合关前安排明确放气。全盘开局畅通,多枚长轨棋子任意点击离场,增加观看内容而不增加清挡门槛。
- 提示:不用解结了,让它们一条条绕出去
- 关键体验路径:`t0`,18 弯 / 22 格步骤。
- 完整体验动作:t0 → t1 → t2 → t3 → t4 → t5 → t6。
### 19 · 逐层放出长回廊
以两次必要旋转和多层占用组织较完整的清场。保留开局入口与多条长路径,让不同阶段都有实际离场回报。
- 提示:给短路让位,长回廊会一层层打开
- 关键体验路径:`t0`,18 弯 / 21 格步骤。
- 参考换路阶段:剩 9 枚时左转 → 剩 6 枚时左转。
- 完整体验动作:t11 → t12 → t13 → t14 → t16 → t17 → t2 → t9 → t10 → 左转 → t15 → t6 → t5 → 左转 → t7 → t8 → t3 → t4 → t1 → t0。
### 20 · 最后,一路盛放
20 关收束:三次必要旋转之间都有消除进展,后段连续释放多条至少 10 弯的路线。以清开整盘后获得的长绕行完成庆祝。
- 提示:最后几枚,也藏着长长的出口
- 关键体验路径:`t8`,18 弯 / 20 格步骤。
- 参考换路阶段:剩 11 枚时右转 → 剩 3 枚时右转 → 剩 2 枚时右转。
- 完整体验动作:t12 → t13 → t14 → t15 → t9 → 右转 → t7 → t11 → t6 → t3 → t0 → t5 → t10 → t8 → 右转 → t4 → 右转 → t2 → t1。
+80
View File
@@ -0,0 +1,80 @@
# v0.5 千关浏览与操作检查
检查日期:2026-09-12。状态:**最终冻结批次的浏览器与操作检查已完成**。
正式 `pipelineHash`:`ef59b3d561147031a8cbfd059c67fabe01054039e89cba4c27c7b6408d05b03d`。
范围修订(2026-09-12):用户明确要求只制作关卡,界面与操作沿用原游戏。已撤回 v0.5 的缩放按钮强制显示与其 48 px 留白,以及教学关专用的控件隐藏、布局和配色。下文第 3 节的缩放按钮检查属于已撤回方案的历史记录,不代表当前界面;关卡数据和原有操作逻辑未变。
显示修订(2026-09-12):用户指出正式游戏只有设计主路线较粗,其他可行驶轨道像辅助线。已从主游戏移除 `trackEmphasis`,所有真实轨道恢复原游戏统一的线宽和颜色;制作审核页仍可用强调模式查看造型。关卡布局、行走规则和流水线哈希未变。第 5 关及其旋转后画面均有 57 对标准轨道,第 1000 关有 273 对标准轨道;390×844 视口无横向溢出。相关 22 项回归与静态构建通过。[绘制记录](v0.5-review/tracks-unified.json) · [第 5 关新画面](v0.5-review/tracks-unified-level-5-mobile.png) · [第 1000 关新画面](v0.5-review/tracks-unified-level-1000-mobile.png)。下文原截图中的轨道强调样式属于修订前记录,操作结果仍适用。
扩展策略审核后,最终批次相较开发快照重制了 790 关。本轮强制刷新浏览器模块,在浏览器内重新计算六个现场样本的规范布局 SHA-256,并与冻结配方逐一核对;第 1、4、34、849 关已重跑,第 3、1000 关布局哈希完全相同,保留其已有正常速度操作证据。20 张联系表全部重新导出。[浏览器哈希核对](v0.5-review/final-browser-batch.json) · [新旧布局对照](v0.5-review/layout-verification.json)
原开发记录的相关日志与画面保存在 `docs/v0.5-review/pre-final/`,不代替本批次记录。
本报告记录实际浏览器操作与画面检查。关卡全量求解、二十种策略回放和整体分布由生产报告记录;这里没有把自动化点击视为真人体验评价。
## 1. 接入与浏览
- v0.5 注册为新访客默认版本;已有版本选择继续沿用。v0.1–v0.4 的关卡与独立存档保留。
- 主游戏接受 `?campaign=v0.5&level=1000` 等链接,关号从 1 开始。越界关号不会写入进度。
- 主选关弹窗按章显示,每页最多 50 关。实测第 1 章索引 0–49,第 20 章索引 950–999;隐藏侧栏同样只生成当前章的 50 个按钮。
- 直接前往 501 关成功。切到 v0.4 后再回 v0.5,恢复第 501 关;旧版位置保持独立。[操作记录](v0.5-review/navigation.json)
- 正式展示使用制作分档与“预估”字样;长路格数、弯数单独描述观看内容。生产关不再运行旧的“长路加分”分析来显示难度。静态旧版分析和当前状态提示各有缓存。
主选关截图:[390×844 视口](v0.5-review/map-mobile.png)。截图像素可能按设备像素比放大,文中尺寸均指 CSS 视口。
## 2. 原操作逻辑现场检查
这些操作通过主游戏的真实鼠标/指针事件与旋转按钮完成。记录器只包装 `Game.tap` / `Game.rotate` 返回值,没有替代碰撞、移除或动画逻辑。使用正常动态效果;测试等待轨道和离场动画实际结束,再触发需要等待的旋转或结算操作。
| 样本 | 操作与现场结果 | 证据 |
| --- | --- | --- |
| 第 1 关,长路巡游 | 点击 t0 后 109.6 ms 再点 t1,两次都立即返回 `exit`,剩余数量 3→2→1;t0 原动画时长约 2627 ms,第二枚已在它结束前启动 | [连点日志](v0.5-review/rapid-tap.json)、[画面](v0.5-review/main-mobile-rapid.png) |
| 第 3 关,清挡放行 | t0 初始被挡。移走 t1 后 t0 状态变为 `exit`,35.6 ms 后可立即启动,剩余 5→4→3 | [清挡与反差日志](v0.5-review/gate-contrast.json) |
| 第 4 关,轻巧反差 | t0 初始被挡;右转至 60° 后点击 t0,沿 10 格轨道成功离场 | [清挡与反差日志](v0.5-review/gate-contrast.json)、[画面](v0.5-review/main-mobile-contrast.png) |
| 第 34 关,分段释放 | 最终保存的 10 步路线全部执行,8 枚棋子清空,实际出现胜利弹窗 | [完整回放日志](v0.5-review/full-replays.json) |
| 第 849 关,重制后的舒缓关 | 61 格编织盘、8 枚棋子;新保存的 8 步路线全部成功离场,正常播放结束后出现胜利弹窗 | [完整回放日志](v0.5-review/full-replays.json)、[完成画面](v0.5-review/level-849-complete.png) |
| 第 1000 关,分段释放 | 14 次成功离场、右转及左转各一次,共 16 步全部执行。最后一枚动画结束后出现胜利弹窗;点击“完成旅程 · 回到第一关”后显示 `LEVEL 01` | [完整回放日志](v0.5-review/full-replays.json)、[完成画面](v0.5-review/level-1000-complete.png) |
原 `rapid-tap-app` 回归还覆盖重复点击、阻挡反馈、运动时释放新棋子、重置、撤销、旋转期间缓存点击,以及切关取消旧动画。
## 3. 大盘与小屏(缩放按钮方案已撤回,保留历史记录)
以第 1000 关的 91 格盘面,在 390×844 视口检查。最终布局哈希与此操作记录的布局相同,因此保留本组正常速度的界面证据:
- 默认完整显示棋盘,无页面横向溢出,棋子几何直径约 37.8 CSS px。
- 现有样式曾隐藏所有缩放按钮。本次仅为 v0.5 恢复缩小、比例重置、放大控件,并为控件预留 48 px 区域,使它不会挡住棋盘上侧的棋子。
- 两次放大后显示 154%,棋子几何直径约 58.3 CSS px;这是该视口与盘面下的缩放上限,不是所有设备的统一值。实际横向拖动改变画面,棋子数量仍为 14;点击比例重置后恢复 100%。[拖动与重置记录](v0.5-review/pan-reset.json)
- 放大后右转 60°,再点击可见棋子 t13,成功离场,数量 14→13。主轨道强调随棋盘旋转;纯函数回归另外验证所有六个朝向都只强调对应真实配对。
[大盘原尺寸](v0.5-review/r5-mobile-fit.png) · [放大局部](v0.5-review/r5-mobile-zoom.png) · [旋转后局部](v0.5-review/r5-mobile-zoom-rotated.png) · [尺寸与点击记录](v0.5-review/r5-mobile.json)
这些结果证明控件与点击路径可用;手指误触、连续跟线负担及长时间观看舒适度仍需真机与真人试玩。放大视图会裁去棋盘两侧,重置比例可回到全盘。
## 4. 制作审核页
入口:[千关制作记录](../labs/campaign-review/index.html)。页面按章节浏览,可筛选体验与难度预估、直接跳关、下载单关 JSON、逐步或连续播放制作时保存的清盘路线。
- 390×844 与 1440×1000 视口均无横向溢出,每章只创建 50 张卡片,进入视野时才绘制缩略图。
- 第 1 章筛选“轻巧反差”得到 5 关;输入 1000 跳至第 20 章并打开对应详情,显示 16 步记录。
- 审核页第 1 关的连续回放完成 3 步,界面确认 3 枚棋子全部离场。[回放状态](v0.5-review/review-replay.json)
- 自动记录从 `levels/v0.5-analysis.json` 读取;后续人工记录从独立 `levels/v0.5-reviews.json` 合并为 `manualReview`,不覆盖生成时快照。
- 最终重新加载第 1000 关详情,确认独立文件有 1000 条人工记录、批次哈希一致,详情中的 `manualReview` 与对应文件记录逐字段一致。记录明确区分章节总览目检、浏览器抽查与尚未进行的真人校准。[合并读取证据](v0.5-review/manual-review-load.json)
- 章节总览导出不受筛选或缩略图懒绘制影响。每张包含本章 50 关,5 列×10 行,1524×3876 像素;关号、名称、体验、结构预估和巡游指标同时保留。
[桌面审核页](v0.5-review/review-desktop.png) · [手机宽度审核页](v0.5-review/review-mobile.png)
最终批次在关闭浏览器网络缓存后的本地加载观测:关卡模块 9,622,010 字节,资源耗时 42.5 ms,页面 `loadEventEnd` 约 178.7 ms。此处没有开启移动网络限速,也不是低端手机性能测试;不能据此推断线上下载时间或冷启动预算。[加载记录](v0.5-review/load-metrics.json)
## 5. 回归与联系表
相关自动回归命令:
```sh
node --test tests/campaign-browser.test.js tests/campaign-versions.test.js tests/rapid-tap-app.test.js
```
22 项通过,覆盖版本注册、独立进度、URL 定位、章节边界、静态分析缓存、六方向配对强调,以及原快速连点行为。
20 张最终联系表位于 `docs/v0.5-review/contact-01.png` 至 `contact-20.png`,全部从上述冻结批次重新导出。[图像清单与 SHA-256](v0.5-review/contact-manifest.json)记录每张图片对应的章节、关号与尺寸。前 500 关与后 500 关的目视结论分别记录在对应视觉审核文档;联系表目检不等于逐关真人通关。第 849 关已替换为编织巡游,第 850 关保留章节收束花瓣。
+118
View File
@@ -0,0 +1,118 @@
# v0.5「千段轨迹」1000 关制作报告
日期:2026-09-12。首版已经冻结 1000 个可玩布局,20 章 × 50 关,直接接入原游戏运行时。旧版布局与独立进度保留。当前交付是经过规则、策略和静态画面检查的试玩版本;没有把自动通过当作已证明千关长期体验优良。
- [从第 1 关开始](http://localhost:4173/?campaign=v0.5&level=1)
- [第 1000 关](http://localhost:4173/?campaign=v0.5&level=1000)
- [制作审核页](http://localhost:4173/labs/campaign-review/index.html)
## 实际产出与验收
| 项目 | 本批结果 |
| --- | ---: |
| 冻结布局 / 独立求解成功 | 1000 / 1000 |
| 忽略颜色、名称并整体旋转/镜像归一后的不同布局 | 1000 |
| 完整回放(作者解 + 最少旋转解 + 20 种策略) | 22000 |
| 通过回放的成功操作 | 273702 |
| 需要旋转 / 不需要旋转 | 432 / 568 |
| 最少旋转数的最高值 | 2 |
| 最少旋转解中有长路的关卡 | 1000 |
| 最少旋转解中单次最长格步骤 / 最多转弯 | 95 / 65 |
| 每关 20 策略中出现长路的最低次数 | 16 |
| 每关 20 策略中出现指定主长路的最低次数 | 10 |
长路的统计带是至少 6 次转弯;主目标还须满足该关制作卡的最低转弯数。格步骤允许一条路经过同一格的不同轨道,不等于不同格子的数量。以上是本引擎模型中的观察量,不是玩家通关率、观看率或平均时长。
## 形态、体验和难度
| 路线家族 | 关数 | 体验类型 | 关数 |
| --- | ---: | --- | ---: |
| 花瓣 | 183 | 长路巡游 | 285 |
| 环绕 | 164 | 清挡放行 | 283 |
| 螺旋 | 163 | 轻巧反差 | 120 |
| 回折 | 164 | 旋转换路 | 172 |
| 编织 | 164 | 分段释放 | 140 |
| 双叶交叉 | 162 | 合计 | 1000 |
这六类是可变开口、可变规模和布子的路线家族,不是 1000 种独立美术外形。花瓣与编织使用棋子真正可以行驶的轨道配对。作者主棋子走过的配对中,属于强调造型的最低比例为 100.0%;完整作者清盘覆盖全盘强调配对的最低比例为 10.4%。两个分母不同:主路确实属于造型,不代表每关会把整朵花的所有路线走遍。
结构难度 D1–D5 的实际数量为 319 / 239 / 288 / 145 / 9。分数使用必要旋转、放行深度、开局可走比例和扫掠阻挡,不加入长路转弯数;全部标记为未经玩家校准的结构预估。后期继续有直接巡游和小盘,不把关号、盘面尺寸或棋子数直接等同于难度。
| 章节 | 关号 | D1 / D2 / D3 / D4 / D5 | 棋子数范围 | 需旋转关数 | 画面 |
| --- | --- | --- | --- | ---: | --- |
| 1 · 初见弯路 | 1–50 | 21 / 12 / 14 / 3 / 0 | 3–11 | 20 | [总览](v0.5-review/contact-01.png) |
| 2 · 朝内的出口 | 51–100 | 19 / 10 / 11 / 9 / 1 | 3–11 | 22 | [总览](v0.5-review/contact-02.png) |
| 3 · 绕行花园 | 101–150 | 22 / 11 / 10 / 6 / 1 | 4–14 | 20 | [总览](v0.5-review/contact-03.png) |
| 4 · 轻轻让路 | 151–200 | 16 / 15 / 13 / 6 / 0 | 4–14 | 21 | [总览](v0.5-review/contact-04.png) |
| 5 · 环里的风景 | 201–250 | 13 / 11 / 17 / 9 / 0 | 4–14 | 23 | [总览](v0.5-review/contact-05.png) |
| 6 · 花瓣初开 | 251–300 | 19 / 10 / 14 / 6 / 1 | 4–14 | 20 | [总览](v0.5-review/contact-06.png) |
| 7 · 交织之间 | 301–350 | 15 / 12 / 16 / 7 / 0 | 6–14 | 22 | [总览](v0.5-review/contact-07.png) |
| 8 · 两岸来信 | 351–400 | 15 / 12 / 15 / 7 / 1 | 5–14 | 21 | [总览](v0.5-review/contact-08.png) |
| 9 · 回旋的发现 | 401–450 | 15 / 9 / 21 / 4 / 1 | 6–14 | 23 | [总览](v0.5-review/contact-09.png) |
| 10 · 层层放行 | 451–500 | 15 / 15 / 12 / 7 / 1 | 6–14 | 23 | [总览](v0.5-review/contact-10.png) |
| 11 · 走进花心 | 501–550 | 14 / 14 / 11 / 10 / 1 | 6–14 | 24 | [总览](v0.5-review/contact-11.png) |
| 12 · 曲径相逢 | 551–600 | 15 / 11 / 13 / 11 / 0 | 6–14 | 21 | [总览](v0.5-review/contact-12.png) |
| 13 · 另一侧的出口 | 601–650 | 15 / 16 / 11 / 8 / 0 | 7–14 | 20 | [总览](v0.5-review/contact-13.png) |
| 14 · 编织新路 | 651–700 | 15 / 9 / 17 / 9 / 0 | 7–15 | 23 | [总览](v0.5-review/contact-14.png) |
| 15 · 旋开的花园 | 701–750 | 15 / 16 / 13 / 6 / 0 | 7–15 | 21 | [总览](v0.5-review/contact-15.png) |
| 16 · 从容穿行 | 751–800 | 15 / 11 / 15 / 9 / 0 | 7–16 | 21 | [总览](v0.5-review/contact-16.png) |
| 17 · 旧路新发现 | 801–850 | 14 / 14 / 15 / 6 / 1 | 8–16 | 21 | [总览](v0.5-review/contact-17.png) |
| 18 · 花与回声 | 851–900 | 17 / 9 / 17 / 6 / 1 | 7–16 | 20 | [总览](v0.5-review/contact-18.png) |
| 19 · 千回百转 | 901–950 | 15 / 12 / 16 / 7 / 0 | 7–17 | 23 | [总览](v0.5-review/contact-19.png) |
| 20 · 一路盛放 | 951–1000 | 14 / 10 / 17 / 9 / 0 | 9–17 | 23 | [总览](v0.5-review/contact-20.png) |
## 制作逻辑与质量修正
先构造有形态的开放路线,再逆向布子并保存完整构造解。换路关与反差关包含旋转前互相阻挡、旋转后可放行的核心棋子;分段关使用经正式碰撞与求解器验证的两次换路锁组。每个槽位在同一家族和体验内比较合格候选,避免只追求一个总分。
每个清挡关的指定短路门在开局即可移走,移走后主棋子立刻获得长路;作者回放从这个关键动作开始。巡游关开局可连续点选。反差关主棋子朝内,旋转一次即可走上长路;分段关的最少解也必须有至少两次旋转。
独立审核曾发现旧候选中“另一枚长路替主目标过检”、关键长路过晚及随机探索大量绕过的问题。本批增加了指定主棋子的单独门槛:核心六策略至少四条走到主长路,20 条中至少 16 条有长路、至少 10 条走到主长路;清挡与反差另查实际兑现的放行事件。这个筛选阈值是制作约束,不是研究证明的最优比例。
视觉审核还退回了过于相似的 849/850 连排:849 改为中盘编织巡游,850 保留为章末重瓣分段释放。小盘布子受到实际容量限制,避免通过堆积棋子延长关卡。
## 操作顺序的证据边界
四种“先清所有可出棋子再转”的常规策略可能得到相同统计,不能视作四份独立玩家证据。表中每行只是一个确定的策略。14 条额外随机探索与核心策略分别记录;额外的未参与筛选种子由独立质量审核报告说明。
| 策略 | 回放数 | 清盘数 | 出现长路数 |
| --- | ---: | ---: | ---: |
| outer-first | 1000 | 1000 | 1000 |
| short-first | 1000 | 1000 | 1000 |
| long-first | 1000 | 1000 | 1000 |
| blocker-first | 1000 | 1000 | 1000 |
| rotate-early | 1000 | 1000 | 991 |
| seeded-random | 1000 | 1000 | 982 |
| seeded-random-2 | 1000 | 1000 | 912 |
| seeded-random-3 | 1000 | 1000 | 924 |
| seeded-random-4 | 1000 | 1000 | 913 |
| seeded-random-5 | 1000 | 1000 | 929 |
| seeded-random-6 | 1000 | 1000 | 923 |
| seeded-random-7 | 1000 | 1000 | 918 |
| seeded-random-8 | 1000 | 1000 | 896 |
| seeded-random-9 | 1000 | 1000 | 924 |
| seeded-random-10 | 1000 | 1000 | 926 |
| seeded-random-11 | 1000 | 1000 | 916 |
| seeded-random-12 | 1000 | 1000 | 910 |
| seeded-random-13 | 1000 | 1000 | 922 |
| seeded-random-14 | 1000 | 1000 | 900 |
| seeded-random-15 | 1000 | 1000 | 917 |
## 画面、浏览器与尚未验证的范围
- [前 500 关静态审阅](v0.5-visual-audit-early.md)、[后 500 关静态审阅](v0.5-visual-audit-late.md):20 张逐章联系表的全局目检,不冒充 1000 次手玩。
- [浏览器记录](v0.5-browser-review.md):快速连点、清挡即发、反差、分段解、第 1000 关结算、选关/版本/缩放的实际样本与尺寸。
- [独立质量审核](v0.5-quality-audit.md):全量复查、主奖励出现时机、未参与筛选的策略与后续复审项。
- `levels/v0.5-reviews.json` 单独保存 AI 辅助静态审阅与浏览器样本状态;布局分析中的 `visual: pending` 是生成时快照,审核页会并列显示后续记录。
客户端读取冻结关卡,不在进入每关时实时生成。当前实现按章显示 50 项,但关卡模块仍一次载入全部数据;本地加载验证不等同于移动网络性能验证。真人新手/熟练玩家的连续游玩、疲劳、图案辨识度及留存尚未测量。原生 Cocos/Android/iOS 运行与实机触控没有在本轮验收。
## 文件与复现
布局全集:`levels/v0.5.json`;分章:`levels/v0.5/chapter-01.json` 至 `chapter-20.json`;浏览器模块:`src/levels-v05.js`。逐关配方在 `levels/v0.5-recipes.json`,策略与实际路径在 `levels/v0.5-analysis.json`,本批独立验证在 `levels/v0.5-validation.json`。
流水线 SHA-256:`ef59b3d561147031a8cbfd059c67fabe01054039e89cba4c27c7b6408d05b03d`。
`npm run levels:v05` 离线重新生产;`npm run levels:v05:verify` 重求解并回放冻结数据;`node scripts/write-production-report.mjs` 只对已通过对应哈希验证的数据更新本报告。源码指纹改变时不允许混用旧检查点。
方法与最初假设见[千关制作方案](1000-level-production-plan.md)、[设计准则](level-design-principles-v2.md)和[论文与竞品知识库](level-design-knowledge/README.md)。
+203
View File
@@ -0,0 +1,203 @@
# v0.5 千关质量独立审核
审核日期:2026-09-12。对象:正式冻结的 1000 关,流水线标识 `ef59b3d561147031a8cbfd059c67fabe01054039e89cba4c27c7b6408d05b03d`。
**结论:1000 关通过本轮规则、回放与既定自动体验门槛。旧版“别枚长路冒充主目标”和“清完大部分棋子才让指定门生效”的问题已修复。本轮未发现必须按规则或既定自动门槛退回的关卡;视觉辨识、动画观看感受、真人难度与长期新鲜感仍未由这些数据证明。** 下文列出继续试玩时应优先观察的具体关卡。
## 1. 数据与审核方法
直接读取 [1000 关冻结布局](../levels/v0.5.json)、[逐关回放与评价](../levels/v0.5-analysis.json)、[生成配方及源码哈希](../levels/v0.5-recipes.json)。核对清单中的全部源码哈希与当前文件一致。本审核没有修改布局、生成器或筛选门槛。
本次独立检查包括:
- 每关重新调用正式 `solveRotations`,检查有效数据、无搜索触顶、最少旋转数,以及整体旋转/镜像归一后的精确重复。
- 用正式 `Game` 重放每关的参考解、作者解及 20 种策略,共 **22,000 套回放、273,702 个成功动作**。全部清盘,存档中的逐棋子弯数、步骤数、动作序号与朝向均和实际执行一致。
- 验证每关在 20 策略中至少 16 条出现任意长路、至少 10 条出现指定主长路;前 6 策略至少 4 条出现指定主长路。清挡关至少 8/20 兑现指定主棋子的轨道内清挡长路,反差关至少 6/20 兑现指定主反差。原有前 6 策略门槛同时核验。
- 对全部 283 个清挡关额外核验:开局指定挡子可走,只移去这枚挡子,主棋子即能离场。对反差关与分段关分别核验必须旋转、至少两次旋转。
- 另挑 30 关扩展至 32 策略;其中后 12 个种子未参与本批逐候选筛选,单独列为扩展检查。
这里的“长路”统一用 **至少 6 弯**作统计带;生产中指定主奖励仍按各配方的 `minHeroBends` 核验。这个分界是本轮诊断口径,不是论文给出的质量标准。
“首次可点长路”是在一条完整回放的每个动作前,用真实剩余棋子和底盘朝向检查是否已存在可成功离场的长路。它表示**沿该顺序首次可点的时点**,不声称已经穷尽所有操作,找到全局最快的奖励解。
所有策略能读取精确可出信息,并按有限规则选择点击与旋转;它们没有模拟人看错轨道、误触、注意力转移和动画遮挡。回放次数不是玩家人数,也不等于相互独立的解法数量。
## 2. 正式版的可靠性与奖励曝光
| 项目 | 结果 |
| --- | ---: |
| 数据有效、独立可解、无搜索触顶 | 1000/1000 |
| 精确整体对称去重后的布局 | 1000 |
| 作者解及参考解完整清盘 | 各 1000/1000 |
| 已存策略完整清盘 | 20000/20000 |
| 参考解至少出现一条长路 | 1000/1000 |
| 每关 20 策略的任意长路出现次数范围 | 16–20 |
| 每关 20 策略的指定主长路出现次数范围 | 10–20 |
| 清挡关指定清挡长路兑现次数范围 | 8–19/20 |
| 反差关指定长路反差兑现次数范围 | 9–20/20 |
| 必须旋转的关卡 | 432/1000 |
| 最少旋转数上限 | 2 |
长路与主长路应分开看:
| 策略组 | 回放数 | 任意长路出现 | 指定主长路出现 |
| --- | ---: | ---: | ---: |
| 外圈优先、短路优先、长路优先、挡子优先 | 4000 | 4000 | 4000 |
| 较早旋转 | 1000 | 991 | 952 |
| 第一组固定种子的随机探索 | 1000 | 982 | 875 |
| 其余 14 组固定种子的随机探索 | 14000 | 12830 | 11592 |
| 全部 | 20000 | 18803 | 17419 |
四种常规策略虽然点击次序不同,但都先清当前能走的棋子再旋转。本游戏中成功消除只减少占用,因此它们能清掉的集合常常相同;本批四者路径分类总数完全一致。这是规则与策略造成的相关性,不能视为四份独立玩家证据。所有比例均只描述指定算法的执行结果。
精确去重覆盖整体棋盘、轨道、棋子和箭头的同步对称变换,并忽略名称、ID 与颜色。只转底盘会改变规则状态,未被误当成整体等价变换。**1000 个精确不同布局仍不自动证明有 1000 种独特体验。**
## 3. 回报时点和实际行进构成
参考解的 10208 次成功离场中:
| 行进类型 | 次数 | 占成功离场比例 |
| --- | ---: | ---: |
| 直出,0 弯 | 6181 | 60.6% |
| 1 弯 | 1734 | 17.0% |
| 2–5 弯 | 730 | 7.2% |
| 至少 6 弯 | 1563 | 15.3% |
共有 673 关的参考解恰好只有一条长路。单路径弯数最高 65,步骤数最高 95,两项分别取最大值。直出棋子可以承担让路、教学和收尾作用,不能仅按弯数淘汰;同时,“1000 关都有长路”也不能被解读成多数点击都在长路行进。
323 关开局已经有可直接点击的长路。沿最少旋转参考解,343 关需要先完成至少一半消除,才首次出现可点长路;沿作者解为 221 关,沿外圈优先策略为 554 关。三者差异说明:**奖励是否早已可获得,与玩家/回放是否选择先去获得,是两件事。**
| 体验类型 | 关数 | 平均棋子数 | 参考顺序中先消除至少一半才出现可点长路 | 参考解首条长路是最后一枚 |
| --- | ---: | ---: | ---: | ---: |
| 长路巡游 | 285 | 8.16 | 0 | 0 |
| 清挡放行 | 283 | 11.28 | 0 | 10 |
| 轻巧反差 | 120 | 10.57 | 111 | 0 |
| 旋转换路 | 172 | 10.17 | 127 | 0 |
| 分段释放 | 140 | 11.92 | 105 | 2 |
关键判断:
- **清挡已从结构上变轻巧。** 全部 283 关都能开局先清指定挡子,立即点击主棋子。第 3、6、9 关沿作者解都是一次清挡后可点长路。外圈策略可能晚点这个挡子,那是顺序选择,不能再说关卡强制先清其余棋子。
- **反差可以早兑现。** 全部反差关作者解都先做一次旋转再点目标。参考解先清免费出口,导致 111/120 关的首次长路偏后,不代表这些关必须先完成那些消除。
- **旋转与分段关仍需检查连玩节奏。** 第 697 关沿参考和作者顺序都先消除 12/14 枚,才出现可点长路;其中 13 枚为直出。第 949 关沿参考顺序先消除 13/14 枚,作者顺序先消除 12/14 枚。这里的时点不排除其他旋转顺序更早兑现,但值得优先观察是否显得前段过于机械。分段关当前意图是“至少两次换路后放出主路线”,没有宣称每个阶段都出现长路。
## 4. 未参与筛选种子的扩展检查
取第 1、4、8、12、16、20 章各五种体验,共 30 关,六种路线家族各 5 关。每组先优先补足较少覆盖的家族,再取原 20 策略中主长路曝光较低、关号较早的关卡。**这是偏向薄弱处的目的抽样,不是随机代表样本。**
30 关扩展到 32 策略后,960 次策略回放全部清盘。前 20 种和生产筛选重合;真正新增的后 12 种共 360 次:
| 范围 | 回放数 | 任意长路出现 | 指定主长路出现 |
| --- | ---: | ---: | ---: |
| 这 30 关已参与筛选的 20 策略 | 600 | 546(91.0%) | 459(76.5%) |
| 这 30 关未参与本批筛选的后 12 策略 | 360 | 291(80.8%) | 231(64.2%) |
后 12 种全部为随机探索,而前 20 种还包括相关性很高的常规策略,组别构成也不同。因此,两行差值同时包含未参与筛选的种子变化和策略构成差异,不能直接当作一个“过拟合百分比”,更不能换算成玩家概率。
下表最后一列只在清挡/反差关记录“指定目标实际兑现对应长路”的次数:
| 关号 | 体验/路线 | 已筛选20种:任意长路 | 新增12种:任意长路 | 新增12种:主长路 | 新增12种:主清挡/反差 |
| --- | --- | ---: | ---: | ---: | ---: |
| 1 | 长路巡游/回折 | 16/20 | 6/12 | 6/12 | — |
| 13 | 清挡放行/编织 | 16/20 | 8/12 | 2/12 | 2/12 |
| 12 | 轻巧反差/环绕 | 20/20 | 11/12 | 5/12 | 4/12 |
| 46 | 旋转换路/双叶跨区 | 17/20 | 8/12 | 8/12 | — |
| 39 | 分段释放/螺旋 | 20/20 | 12/12 | 12/12 | — |
| 158 | 长路巡游/花瓣 | 18/20 | 11/12 | 11/12 | — |
| 166 | 清挡放行/编织 | 19/20 | 11/12 | 10/12 | 2/12 |
| 161 | 轻巧反差/回折 | 20/20 | 11/12 | 5/12 | 5/12 |
| 189 | 旋转换路/双叶跨区 | 17/20 | 9/12 | 7/12 | — |
| 164 | 分段释放/螺旋 | 20/20 | 12/12 | 12/12 | — |
| 367 | 长路巡游/环绕 | 20/20 | 12/12 | 12/12 | — |
| 366 | 清挡放行/花瓣 | 20/20 | 12/12 | 12/12 | 5/12 |
| 357 | 轻巧反差/环绕 | 17/20 | 8/12 | 5/12 | 5/12 |
| 368 | 旋转换路/螺旋 | 20/20 | 12/12 | 7/12 | — |
| 352 | 分段释放/花瓣 | 20/20 | 12/12 | 12/12 | — |
| 563 | 长路巡游/双叶跨区 | 16/20 | 7/12 | 5/12 | — |
| 554 | 清挡放行/编织 | 16/20 | 9/12 | 4/12 | 3/12 |
| 553 | 轻巧反差/回折 | 16/20 | 7/12 | 3/12 | 3/12 |
| 576 | 旋转换路/编织 | 16/20 | 10/12 | 8/12 | — |
| 557 | 分段释放/回折 | 19/20 | 10/12 | 9/12 | — |
| 771 | 长路巡游/双叶跨区 | 18/20 | 6/12 | 4/12 | — |
| 790 | 清挡放行/花瓣 | 19/20 | 10/12 | 8/12 | 6/12 |
| 769 | 轻巧反差/回折 | 18/20 | 8/12 | 4/12 | 3/12 |
| 782 | 旋转换路/螺旋 | 19/20 | 10/12 | 10/12 | — |
| 773 | 分段释放/环绕 | 20/20 | 12/12 | 12/12 | — |
| 951 | 长路巡游/双叶跨区 | 16/20 | 6/12 | 4/12 | — |
| 978 | 清挡放行/编织 | 16/20 | 10/12 | 6/12 | 5/12 |
| 953 | 轻巧反差/环绕 | 17/20 | 7/12 | 4/12 | 3/12 |
| 952 | 旋转换路/花瓣 | 20/20 | 12/12 | 12/12 | — |
| 968 | 分段释放/螺旋 | 20/20 | 12/12 | 12/12 | — |
**优先试玩观察:**
- 第 13 关:单门立即放行确实成立,但额外旋转探索中指定主长路和主清挡都只有 2/12;任意长路为 8/12。观察玩家是否能辨认指定挡子,以及主动换路后是否仍有足够回报。
- 第 553 关:新增策略主长路与主反差都是 3/12,任意长路为 7/12。检查“一转就懂”的视觉提示与不同旋转方向的体验。
- 第 1、771、951 关:新增策略任意长路各 6/12。它们开局已有长路,常规点击能够兑现;弱点主要发生在主动旋转后的替代路线。不能据此直接否定直接巡游关,也不应称所有探索方式都能保留同一奖励。
这些是后续体验检查优先级,不是本轮规则失败。若之后使用这些额外种子继续调参,它们便不再是下一批的未参与筛选种子,下一批应换一组独立记录的检查种子。
## 5. 难度曲线、工作量与相邻变化
结构档位为 D1 319、D2 239、D3 288、D4 145、D5 9。评分只使用最少旋转、放行层次、开局出口约束及侧擦碰阻挡等结构量;长路弯数没有直接加到难度分中。所有关卡仍标记 `structural-estimate`、`playerCalibrated: false`。
| 章 | 平均结构档位 | 平均棋子数 | 必须旋转 | 参考顺序中长路偏后 |
| --- | ---: | ---: | ---: | ---: |
| 1 | 1.98 | 7.22 | 20/50 | 17/50 |
| 2 | 2.26 | 7.54 | 22/50 | 18/50 |
| 3 | 2.06 | 8.24 | 20/50 | 18/50 |
| 4 | 2.18 | 8.96 | 21/50 | 18/50 |
| 5 | 2.44 | 8.90 | 23/50 | 18/50 |
| 6 | 2.20 | 8.76 | 20/50 | 15/50 |
| 7 | 2.30 | 9.82 | 22/50 | 16/50 |
| 8 | 2.34 | 9.78 | 21/50 | 17/50 |
| 9 | 2.34 | 10.12 | 23/50 | 18/50 |
| 10 | 2.28 | 10.92 | 23/50 | 14/50 |
| 11 | 2.40 | 10.24 | 24/50 | 21/50 |
| 12 | 2.40 | 10.72 | 21/50 | 15/50 |
| 13 | 2.24 | 10.92 | 20/50 | 15/50 |
| 14 | 2.40 | 11.34 | 23/50 | 18/50 |
| 15 | 2.20 | 11.48 | 21/50 | 17/50 |
| 16 | 2.36 | 11.78 | 21/50 | 17/50 |
| 17 | 2.32 | 11.88 | 21/50 | 15/50 |
| 18 | 2.30 | 11.80 | 20/50 | 17/50 |
| 19 | 2.30 | 12.10 | 23/50 | 19/50 |
| 20 | 2.42 | 11.64 | 23/50 | 20/50 |
第一章平均结构档位 1.98,第 20 章 2.42,中间有波动;平均棋子数从 7.22 增至 11.64。**后期工作量的增加,比结构档位的增加更明显。** 这条曲线是当前编排与估计器的结果,尚不能说已匹配熟练玩家的成长。
同一种主体验连续最多 2 关;同一结构档位连续最多 3 关。相邻粗粒度体验签名相同的只有 1→2、195→196,均是巡游关,但路线家族不同。这适合保留作连续观感检查,不构成精确重复。反过来,签名不同也不能证明视觉上一定新鲜。
有 141 个相邻位置跨越至少 3 个结构档位,包含挑战到舒缓及舒缓到挑战两个方向。不能把这些跳动都判为坏节奏,也不能说已形成平滑真人难度曲线;应优先连续试玩第 31–40 关、第 49–56 关及后期章节交界。档位是序数估计,表中均值只用于比较当前编排轮廓。
## 6. 形状证据的边界
主棋子已行驶轨道中属于设计形状轨道的比例最低为 100%。这说明主路线没有依赖未标记的装饰轨道来满足长度,但**不等于每关把整朵花或整幅图形都走了一遍**。整盘已行驶的设计轨道比例最低为 10.4%,分母不同。
本报告没有逐一观看 1000 关动态图像,也没有检查全部手机尺寸下的触控、连点后的视觉遮挡和超长路线的跟随感。上述数字不能替代视觉辨识与实际播放检查。第 849 关现为编织巡游,第 850 关为花瓣分段释放;数据层面的类别差异已确认,视觉修改的效果应由单独的画面评审确认。
## 7. 旧版问题与本轮修复依据
本节仅描述旧流水线 `a2188a0951cf3985337e2d3cfaff5ca97f5dcd25c426c5373512f6b0e6684193`,其数字**未混入以上正式版指标**。
旧版虽有 1000 个可解布局和 22000 套可完成回放,仍有 61 关的前 6 策略一次也不走指定主长路;其他棋子的长路撑住了总指标。旧第 965 关沿参考解先清 16 枚,才出现唯一长路;32 策略只有 10 条出现任意长路,27 种随机探索没有一次兑现指定主清挡长路。这些结果推动了主棋子身份、即刻清挡和更广策略保留条件的修订。
正式版重验的具体变化:
- 四种常规策略现在分别在 1000/1000 关走到指定主长路。
- 第 965 关作者解改为第 1 个动作清挡、第 2 个动作启动 11 弯主路;20 策略任意长路 18 次、指定主长路 12 次、指定主清挡长路 10 次。
- 第 361 关指定主长路为 17/20;第 773 关为 20/20;第 798 关为 17/20。它们没有再用另一枚长路掩盖指定主目标的落空。
- 首次可点长路偏后的关数,沿参考顺序从 593 降至 343;这项变化也包含布局、棋子数量及回放顺序修改,不能单独归因于某一项算法。
这一轮证明了“可解”与“主体验确实出现”必须分开验收,也证明了门槛需要在实际候选上接受反例检查。它没有证明目前 16/20、10/20 等阈值是长期最优配置。
## 8. 可追溯标识
- 布局文件 SHA-256:`b3d599e637c1aa9820cbb9186cd9be49421d81b3e2ad206f4bfa1ee366f39017`
- 分析文件 SHA-256:`a691edd0cc78e750953934868e6bfc21e4c79c55088bbfa8d93c2eb0ba4b33c4`
- 生成流水线 SHA-256:`ef59b3d561147031a8cbfd059c67fabe01054039e89cba4c27c7b6408d05b03d`
- 正式重复核验入口:[verify-production-levels.mjs](../scripts/verify-production-levels.mjs)
- 策略、对称去重与评价定义:[campaign-evidence.js](../src/campaign-evidence.js)
- 设计依据:[现行关卡准则](level-design-principles-v2.md)、[关卡知识库](level-design-knowledge/README.md)
后续版本更换布局、规则或策略后,应重新核验并另存版本标识,不直接沿用本报告数字。
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

+185
View File
@@ -0,0 +1,185 @@
{
"pipelineHash": "ef59b3d561147031a8cbfd059c67fabe01054039e89cba4c27c7b6408d05b03d",
"files": [
{
"chapter": 1,
"first": 1,
"last": 50,
"path": "docs/v0.5-review/contact-01.png",
"width": 1524,
"height": 3876,
"sha256": "7d427f9540b3a2357358367f47d2b83e4cc52fecf88b733bc3f8f0829421495c"
},
{
"chapter": 2,
"first": 51,
"last": 100,
"path": "docs/v0.5-review/contact-02.png",
"width": 1524,
"height": 3876,
"sha256": "ba33ac284f23d8d1dd197b259ccf9ace37f9d24c41ef31a81dd091124d92ac1e"
},
{
"chapter": 3,
"first": 101,
"last": 150,
"path": "docs/v0.5-review/contact-03.png",
"width": 1524,
"height": 3876,
"sha256": "04edcf0acd252cfd7039320be1360e21bb22d7972d4a66ea56d2c81e9d599e19"
},
{
"chapter": 4,
"first": 151,
"last": 200,
"path": "docs/v0.5-review/contact-04.png",
"width": 1524,
"height": 3876,
"sha256": "325b1ccdbb9c24af981eb1560ad5f1b4f7a98e2bf0882ddd0c00062b045fb8a6"
},
{
"chapter": 5,
"first": 201,
"last": 250,
"path": "docs/v0.5-review/contact-05.png",
"width": 1524,
"height": 3876,
"sha256": "4d117b50cc82b720be9ecd94c72ce8a29cc336eafe26d91f4fd8a0a7c258e375"
},
{
"chapter": 6,
"first": 251,
"last": 300,
"path": "docs/v0.5-review/contact-06.png",
"width": 1524,
"height": 3876,
"sha256": "1c83dd3c799886099ff39c1a883753e20c7dcd9e404505a85638ebecb8987063"
},
{
"chapter": 7,
"first": 301,
"last": 350,
"path": "docs/v0.5-review/contact-07.png",
"width": 1524,
"height": 3876,
"sha256": "0d943a96cf661409357d18dd2429fb806f4da738665ac201a4d43d0ad9713917"
},
{
"chapter": 8,
"first": 351,
"last": 400,
"path": "docs/v0.5-review/contact-08.png",
"width": 1524,
"height": 3876,
"sha256": "f892fd7a96b7a9793ce14d63f8b636d2a48aeb53ad3b907b1d8b715afd44ec0f"
},
{
"chapter": 9,
"first": 401,
"last": 450,
"path": "docs/v0.5-review/contact-09.png",
"width": 1524,
"height": 3876,
"sha256": "e27b08364f9c3f20ccd9cf804e61cb480dfa583d933136a5fbf6a2eb86bf43a3"
},
{
"chapter": 10,
"first": 451,
"last": 500,
"path": "docs/v0.5-review/contact-10.png",
"width": 1524,
"height": 3876,
"sha256": "e47a2b9fbff70c3699f6c7ddf4cad64d60e066630daf25e05d2014a4eb1dcb47"
},
{
"chapter": 11,
"first": 501,
"last": 550,
"path": "docs/v0.5-review/contact-11.png",
"width": 1524,
"height": 3876,
"sha256": "9e5ecd87383af7c008ddcffaed930eb7a0b5e726526fcfdc8cd3dde93e4adbe4"
},
{
"chapter": 12,
"first": 551,
"last": 600,
"path": "docs/v0.5-review/contact-12.png",
"width": 1524,
"height": 3876,
"sha256": "183c8cf1348a8c5f4a2505e98f6152b2d986a06a6cb4c112f132b2264491759a"
},
{
"chapter": 13,
"first": 601,
"last": 650,
"path": "docs/v0.5-review/contact-13.png",
"width": 1524,
"height": 3876,
"sha256": "4a70031fd760f440a20dba999f132c0bca4e7c3fb451c78ae4e37a9646fe6add"
},
{
"chapter": 14,
"first": 651,
"last": 700,
"path": "docs/v0.5-review/contact-14.png",
"width": 1524,
"height": 3876,
"sha256": "5e65d366050cd7b3a259b7e6e6e465adffbb0f18063e2448971472087757d6fd"
},
{
"chapter": 15,
"first": 701,
"last": 750,
"path": "docs/v0.5-review/contact-15.png",
"width": 1524,
"height": 3876,
"sha256": "a72dfe42b728ccbabd09c8fca4172d725f37766391af872d89163b04c3551389"
},
{
"chapter": 16,
"first": 751,
"last": 800,
"path": "docs/v0.5-review/contact-16.png",
"width": 1524,
"height": 3876,
"sha256": "d8dda5c1d53d35078bb15a67b615101e011562a42737b404bb017f664bf316ee"
},
{
"chapter": 17,
"first": 801,
"last": 850,
"path": "docs/v0.5-review/contact-17.png",
"width": 1524,
"height": 3876,
"sha256": "811b59cd004b0e33046ba7c96109a2868ef6a206daa93d07f185dd4098ad31d3"
},
{
"chapter": 18,
"first": 851,
"last": 900,
"path": "docs/v0.5-review/contact-18.png",
"width": 1524,
"height": 3876,
"sha256": "078ccf07931bac8893fca74019089cd5e46f7dfe1b0ccf13c1d81d8fd3f0d968"
},
{
"chapter": 19,
"first": 901,
"last": 950,
"path": "docs/v0.5-review/contact-19.png",
"width": 1524,
"height": 3876,
"sha256": "77ac13cf98305b694f6f1b820dc5f272fb956f3984d7a76ba2b48700587228dd"
},
{
"chapter": 20,
"first": 951,
"last": 1000,
"path": "docs/v0.5-review/contact-20.png",
"width": 1524,
"height": 3876,
"sha256": "5aec4c5b52cda1185ce8a8aad088d3674b4b192816b9f9fe0690646fa2fe14ae"
}
]
}
+54
View File
@@ -0,0 +1,54 @@
{
"pipelineHash": "ef59b3d561147031a8cbfd059c67fabe01054039e89cba4c27c7b6408d05b03d",
"levels": 1000,
"samples": [
{
"number": 1,
"id": "trail-v05-0001",
"name": "回折 · 长路巡游",
"layoutHash": "d40409ef64404be3faaddd00576309648439d7d5b34a991f91a10a76f62090a0",
"expected": "d40409ef64404be3faaddd00576309648439d7d5b34a991f91a10a76f62090a0",
"verified": true
},
{
"number": 3,
"id": "trail-v05-0003",
"name": "花瓣 · 清挡放行",
"layoutHash": "9b6259948949878233b94977dffccc9a2cd1a22b2ae7961b723af67ec85a9d49",
"expected": "9b6259948949878233b94977dffccc9a2cd1a22b2ae7961b723af67ec85a9d49",
"verified": true
},
{
"number": 4,
"id": "trail-v05-0004",
"name": "螺旋 · 轻巧反差",
"layoutHash": "aaa748bc33cb199f27478a76b23e71959082f5974a93b8173bde29c7466ca833",
"expected": "aaa748bc33cb199f27478a76b23e71959082f5974a93b8173bde29c7466ca833",
"verified": true
},
{
"number": 34,
"id": "trail-v05-0034",
"name": "环绕 · 分段释放",
"layoutHash": "31736443aaa234fe34fee7a6263d75a679ab46d37dd548f28304085d650b6927",
"expected": "31736443aaa234fe34fee7a6263d75a679ab46d37dd548f28304085d650b6927",
"verified": true
},
{
"number": 849,
"id": "trail-v05-0849",
"name": "编织 · 长路巡游",
"layoutHash": "82243dd0eee425b1ce2bc640ca184046712959fe3090d0f8287f0e0645367838",
"expected": "82243dd0eee425b1ce2bc640ca184046712959fe3090d0f8287f0e0645367838",
"verified": true
},
{
"number": 1000,
"id": "trail-v05-1000",
"name": "花瓣 · 分段释放",
"layoutHash": "c855ba95f504d7280b81820c2af64010fddcfc731041c3b176e7d88301249ba9",
"expected": "c855ba95f504d7280b81820c2af64010fddcfc731041c3b176e7d88301249ba9",
"verified": true
}
]
}
+393
View File
@@ -0,0 +1,393 @@
[
{
"number": 34,
"tiles": 8,
"cells": 37,
"layoutHash": "31736443aaa234fe34fee7a6263d75a679ab46d37dd548f28304085d650b6927",
"actions": [
{
"type": "tap",
"id": "t7"
},
{
"type": "tap",
"id": "t6"
},
{
"type": "tap",
"id": "t5"
},
{
"type": "tap",
"id": "t4"
},
{
"type": "tap",
"id": "t3"
},
{
"type": "rotate",
"direction": 1
},
{
"type": "tap",
"id": "t1"
},
{
"type": "rotate",
"direction": -1
},
{
"type": "tap",
"id": "t0"
},
{
"type": "tap",
"id": "t2"
}
],
"kind": "stages",
"entry": "LEVEL 34",
"reduced": false,
"pipelineHash": "ef59b3d561147031a8cbfd059c67fabe01054039e89cba4c27c7b6408d05b03d",
"events": [
{
"method": "tap",
"value": "t7",
"status": "exit",
"remaining": 7
},
{
"method": "tap",
"value": "t6",
"status": "exit",
"remaining": 6
},
{
"method": "tap",
"value": "t5",
"status": "exit",
"remaining": 5
},
{
"method": "tap",
"value": "t4",
"status": "exit",
"remaining": 4
},
{
"method": "tap",
"value": "t3",
"status": "exit",
"remaining": 3
},
{
"method": "rotate",
"value": 1,
"status": "rotated",
"remaining": 3
},
{
"method": "tap",
"value": "t1",
"status": "exit",
"remaining": 2
},
{
"method": "rotate",
"value": -1,
"status": "rotated",
"remaining": 2
},
{
"method": "tap",
"value": "t0",
"status": "exit",
"remaining": 1
},
{
"method": "tap",
"value": "t2",
"status": "exit",
"remaining": 0
}
],
"remaining": "0",
"wonDialog": true
},
{
"number": 849,
"tiles": 8,
"cells": 61,
"layoutHash": "82243dd0eee425b1ce2bc640ca184046712959fe3090d0f8287f0e0645367838",
"actions": [
{
"type": "tap",
"id": "t0"
},
{
"type": "tap",
"id": "t7"
},
{
"type": "tap",
"id": "t6"
},
{
"type": "tap",
"id": "t5"
},
{
"type": "tap",
"id": "t4"
},
{
"type": "tap",
"id": "t3"
},
{
"type": "tap",
"id": "t2"
},
{
"type": "tap",
"id": "t1"
}
],
"kind": "tour",
"entry": "LEVEL 849",
"reduced": false,
"pipelineHash": "ef59b3d561147031a8cbfd059c67fabe01054039e89cba4c27c7b6408d05b03d",
"events": [
{
"method": "tap",
"value": "t0",
"status": "exit",
"remaining": 7
},
{
"method": "tap",
"value": "t7",
"status": "exit",
"remaining": 6
},
{
"method": "tap",
"value": "t6",
"status": "exit",
"remaining": 5
},
{
"method": "tap",
"value": "t5",
"status": "exit",
"remaining": 4
},
{
"method": "tap",
"value": "t4",
"status": "exit",
"remaining": 3
},
{
"method": "tap",
"value": "t3",
"status": "exit",
"remaining": 2
},
{
"method": "tap",
"value": "t2",
"status": "exit",
"remaining": 1
},
{
"method": "tap",
"value": "t1",
"status": "exit",
"remaining": 0
}
],
"remaining": "0",
"wonDialog": true
},
{
"number": 1000,
"tiles": 14,
"actions": [
{
"type": "tap",
"id": "t13"
},
{
"type": "tap",
"id": "t12"
},
{
"type": "tap",
"id": "t11"
},
{
"type": "tap",
"id": "t10"
},
{
"type": "tap",
"id": "t9"
},
{
"type": "tap",
"id": "t8"
},
{
"type": "tap",
"id": "t7"
},
{
"type": "tap",
"id": "t6"
},
{
"type": "tap",
"id": "t5"
},
{
"type": "tap",
"id": "t4"
},
{
"type": "tap",
"id": "t3"
},
{
"type": "rotate",
"direction": 1
},
{
"type": "tap",
"id": "t1"
},
{
"type": "rotate",
"direction": -1
},
{
"type": "tap",
"id": "t0"
},
{
"type": "tap",
"id": "t2"
}
],
"kind": "stages",
"entry": "LEVEL 1000",
"reduced": false,
"events": [
{
"method": "tap",
"value": "t13",
"status": "exit",
"remaining": 13
},
{
"method": "tap",
"value": "t12",
"status": "exit",
"remaining": 12
},
{
"method": "tap",
"value": "t11",
"status": "exit",
"remaining": 11
},
{
"method": "tap",
"value": "t10",
"status": "exit",
"remaining": 10
},
{
"method": "tap",
"value": "t9",
"status": "exit",
"remaining": 9
},
{
"method": "tap",
"value": "t8",
"status": "exit",
"remaining": 8
},
{
"method": "tap",
"value": "t7",
"status": "exit",
"remaining": 7
},
{
"method": "tap",
"value": "t6",
"status": "exit",
"remaining": 6
},
{
"method": "tap",
"value": "t5",
"status": "exit",
"remaining": 5
},
{
"method": "tap",
"value": "t4",
"status": "exit",
"remaining": 4
},
{
"method": "tap",
"value": "t3",
"status": "exit",
"remaining": 3
},
{
"method": "rotate",
"value": 1,
"status": "rotated",
"remaining": 3
},
{
"method": "tap",
"value": "t1",
"status": "exit",
"remaining": 2
},
{
"method": "rotate",
"value": -1,
"status": "rotated",
"remaining": 2
},
{
"method": "tap",
"value": "t0",
"status": "exit",
"remaining": 1
},
{
"method": "tap",
"value": "t2",
"status": "exit",
"remaining": 0
}
],
"remaining": "0",
"wonDialog": true,
"nextButton": "完成旅程 · 回到第一关 ",
"returnedLevel": "LEVEL 01",
"pipelineHash": "ef59b3d561147031a8cbfd059c67fabe01054039e89cba4c27c7b6408d05b03d",
"layoutHash": "c855ba95f504d7280b81820c2af64010fddcfc731041c3b176e7d88301249ba9",
"retainedByIdenticalLayoutHash": true,
"replaySource": "development-snapshot-witness"
}
]
+48
View File
@@ -0,0 +1,48 @@
{
"gate": {
"number": 3,
"heroBefore": "blocked",
"tiles": 5,
"kind": "gate",
"heroAfterGate": "exit",
"events": [
{
"id": "t1",
"status": "exit",
"at": 345,
"routeCells": 2,
"remaining": 4
},
{
"id": "t0",
"status": "exit",
"at": 380.59999999403954,
"routeCells": 13,
"remaining": 3
}
],
"layoutHash": "9b6259948949878233b94977dffccc9a2cd1a22b2ae7961b723af67ec85a9d49",
"retainedByIdenticalLayoutHash": true,
"pipelineHash": "ef59b3d561147031a8cbfd059c67fabe01054039e89cba4c27c7b6408d05b03d"
},
"contrast": {
"number": 4,
"tiles": 5,
"kind": "contrast",
"heroBefore": "blocked",
"loadMs": 168.5,
"orientation": "60°",
"events": [
{
"id": "t0",
"status": "exit",
"at": 2039.9000000059605,
"routeCells": 10,
"duration": 1995.229284140118,
"remaining": 4
}
],
"pipelineHash": "ef59b3d561147031a8cbfd059c67fabe01054039e89cba4c27c7b6408d05b03d",
"layoutHash": "aaa748bc33cb199f27478a76b23e71959082f5974a93b8173bde29c7466ca833"
}
}
+43
View File
@@ -0,0 +1,43 @@
{
"pipelineHash": "ef59b3d561147031a8cbfd059c67fabe01054039e89cba4c27c7b6408d05b03d",
"previousPipelineHash": "a2188a0951cf3985337e2d3cfaff5ca97f5dcd25c426c5373512f6b0e6684193",
"changed": 790,
"samples": [
{
"number": 1,
"previous": "e808ef41665cca5b44d01acdfacf5a24d0b058c011389ca7f9b89097d7690158",
"final": "d40409ef64404be3faaddd00576309648439d7d5b34a991f91a10a76f62090a0",
"unchanged": false
},
{
"number": 3,
"previous": "9b6259948949878233b94977dffccc9a2cd1a22b2ae7961b723af67ec85a9d49",
"final": "9b6259948949878233b94977dffccc9a2cd1a22b2ae7961b723af67ec85a9d49",
"unchanged": true
},
{
"number": 4,
"previous": "5a3d8fd6909bc341cf6bee6586c8d785fba4c1ecfb90b5a5d4018ff2e53c1e08",
"final": "aaa748bc33cb199f27478a76b23e71959082f5974a93b8173bde29c7466ca833",
"unchanged": false
},
{
"number": 34,
"previous": "f7fc41f08ea89a58eee51a217190be08450c1f2933578821cb8892a041996e7d",
"final": "31736443aaa234fe34fee7a6263d75a679ab46d37dd548f28304085d650b6927",
"unchanged": false
},
{
"number": 849,
"previous": "f7846fbc3361fda6c5e2670c3cea2b0b9887da3145140bd7fe4eed83b594f125",
"final": "82243dd0eee425b1ce2bc640ca184046712959fe3090d0f8287f0e0645367838",
"unchanged": false
},
{
"number": 1000,
"previous": "c855ba95f504d7280b81820c2af64010fddcfc731041c3b176e7d88301249ba9",
"final": "c855ba95f504d7280b81820c2af64010fddcfc731041c3b176e7d88301249ba9",
"unchanged": true
}
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

+12
View File
@@ -0,0 +1,12 @@
{
"pipelineHash": "ef59b3d561147031a8cbfd059c67fabe01054039e89cba4c27c7b6408d05b03d",
"viewport": {
"width": 1440,
"height": 1000
},
"loadMs": 178.69999998807907,
"moduleMs": 42.5,
"moduleBytes": 9622010,
"cacheDisabled": true,
"environment": "local HTTP, no mobile network throttling"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

+22
View File
@@ -0,0 +1,22 @@
{
"pipelineHash": "ef59b3d561147031a8cbfd059c67fabe01054039e89cba4c27c7b6408d05b03d",
"entries": 1000,
"level": "trail-v05-1000",
"manualLoaded": true,
"manualReview": {
"id": "trail-v05-1000",
"number": 1000,
"layoutHash": "c855ba95f504d7280b81820c2af64010fddcfc731041c3b176e7d88301249ba9",
"visual": "chapter-overview-reviewed",
"browserPlay": "complete-browser-replay-passed: 16 actions, victory, campaign ending; mobile zoom/pan/rotate sampled",
"playerCalibration": "not-tested",
"sources": [
"docs/v0.5-review/contact-20.png",
"docs/v0.5-visual-audit-late.md",
"docs/v0.5-browser-review.md",
"docs/v0.5-review/final-browser-batch.json"
]
},
"dialogOpen": true,
"title": "花瓣 · 分段释放"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

+24
View File
@@ -0,0 +1,24 @@
{
"first": {
"chapter": "0",
"buttons": 50,
"sideButtons": 50,
"first": "0",
"last": "49"
},
"last": {
"buttons": 50,
"first": "950",
"last": "999",
"overflow": false
},
"jumped": "LEVEL 501",
"old": {
"version": "v0.4",
"level": "LEVEL 01"
},
"restored": {
"version": "v0.5",
"level": "LEVEL 501"
}
}
+10
View File
@@ -0,0 +1,10 @@
{
"changed": true,
"remainingBefore": "14",
"remainingAfter": "14",
"zoomDuringPan": "154%",
"resetZoom": "100%",
"pipelineHash": "ef59b3d561147031a8cbfd059c67fabe01054039e89cba4c27c7b6408d05b03d",
"layoutHash": "c855ba95f504d7280b81820c2af64010fddcfc731041c3b176e7d88301249ba9",
"retainedByIdenticalLayoutHash": true
}
@@ -0,0 +1,290 @@
[
{
"number": 34,
"tiles": 8,
"actions": [
{
"type": "tap",
"id": "t7"
},
{
"type": "tap",
"id": "t6"
},
{
"type": "tap",
"id": "t5"
},
{
"type": "tap",
"id": "t4"
},
{
"type": "tap",
"id": "t3"
},
{
"type": "rotate",
"direction": 1
},
{
"type": "tap",
"id": "t1"
},
{
"type": "rotate",
"direction": -1
},
{
"type": "tap",
"id": "t0"
},
{
"type": "tap",
"id": "t2"
}
],
"kind": "stages",
"entry": "LEVEL 34",
"events": [
{
"method": "tap",
"value": "t7",
"status": "exit",
"remaining": 7
},
{
"method": "tap",
"value": "t6",
"status": "exit",
"remaining": 6
},
{
"method": "tap",
"value": "t5",
"status": "exit",
"remaining": 5
},
{
"method": "tap",
"value": "t4",
"status": "exit",
"remaining": 4
},
{
"method": "tap",
"value": "t3",
"status": "exit",
"remaining": 3
},
{
"method": "rotate",
"value": 1,
"status": "rotated",
"remaining": 3
},
{
"method": "tap",
"value": "t1",
"status": "exit",
"remaining": 2
},
{
"method": "rotate",
"value": -1,
"status": "rotated",
"remaining": 2
},
{
"method": "tap",
"value": "t0",
"status": "exit",
"remaining": 1
},
{
"method": "tap",
"value": "t2",
"status": "exit",
"remaining": 0
}
],
"remaining": "0",
"wonDialog": true,
"reduced": false
},
{
"number": 1000,
"tiles": 14,
"actions": [
{
"type": "tap",
"id": "t13"
},
{
"type": "tap",
"id": "t12"
},
{
"type": "tap",
"id": "t11"
},
{
"type": "tap",
"id": "t10"
},
{
"type": "tap",
"id": "t9"
},
{
"type": "tap",
"id": "t8"
},
{
"type": "tap",
"id": "t7"
},
{
"type": "tap",
"id": "t6"
},
{
"type": "tap",
"id": "t5"
},
{
"type": "tap",
"id": "t4"
},
{
"type": "tap",
"id": "t3"
},
{
"type": "rotate",
"direction": 1
},
{
"type": "tap",
"id": "t1"
},
{
"type": "rotate",
"direction": -1
},
{
"type": "tap",
"id": "t0"
},
{
"type": "tap",
"id": "t2"
}
],
"kind": "stages",
"entry": "LEVEL 1000",
"reduced": false,
"events": [
{
"method": "tap",
"value": "t13",
"status": "exit",
"remaining": 13
},
{
"method": "tap",
"value": "t12",
"status": "exit",
"remaining": 12
},
{
"method": "tap",
"value": "t11",
"status": "exit",
"remaining": 11
},
{
"method": "tap",
"value": "t10",
"status": "exit",
"remaining": 10
},
{
"method": "tap",
"value": "t9",
"status": "exit",
"remaining": 9
},
{
"method": "tap",
"value": "t8",
"status": "exit",
"remaining": 8
},
{
"method": "tap",
"value": "t7",
"status": "exit",
"remaining": 7
},
{
"method": "tap",
"value": "t6",
"status": "exit",
"remaining": 6
},
{
"method": "tap",
"value": "t5",
"status": "exit",
"remaining": 5
},
{
"method": "tap",
"value": "t4",
"status": "exit",
"remaining": 4
},
{
"method": "tap",
"value": "t3",
"status": "exit",
"remaining": 3
},
{
"method": "rotate",
"value": 1,
"status": "rotated",
"remaining": 3
},
{
"method": "tap",
"value": "t1",
"status": "exit",
"remaining": 2
},
{
"method": "rotate",
"value": -1,
"status": "rotated",
"remaining": 2
},
{
"method": "tap",
"value": "t0",
"status": "exit",
"remaining": 1
},
{
"method": "tap",
"value": "t2",
"status": "exit",
"remaining": 0
}
],
"remaining": "0",
"wonDialog": true,
"nextButton": "完成旅程 · 回到第一关 ",
"returnedLevel": "LEVEL 01"
}
]
@@ -0,0 +1,41 @@
{
"gate": {
"number": 3,
"heroBefore": "blocked",
"tiles": 5,
"kind": "gate",
"heroAfterGate": "exit",
"events": [
{
"id": "t1",
"status": "exit",
"at": 345,
"routeCells": 2,
"remaining": 4
},
{
"id": "t0",
"status": "exit",
"at": 380.59999999403954,
"routeCells": 13,
"remaining": 3
}
]
},
"contrast": {
"number": 4,
"heroBefore": "blocked",
"tiles": 5,
"kind": "contrast",
"orientation": "60°",
"events": [
{
"id": "t0",
"status": "exit",
"at": 912.1000000238419,
"routeCells": 10,
"remaining": 4
}
]
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

+23
View File
@@ -0,0 +1,23 @@
{
"events": [
{
"id": "t0",
"status": "exit",
"at": 356.19999998807907,
"routeCells": 14,
"duration": 2818.0381373993723,
"remaining": 2
},
{
"id": "t1",
"status": "exit",
"at": 390.7999999821186,
"routeCells": 3,
"duration": 779.6152422706633,
"remaining": 1
}
],
"remaining": "1",
"resultOpen": false,
"overflow": false
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

+46
View File
@@ -0,0 +1,46 @@
{
"before": {
"width": 390,
"height": 844,
"zoom": "100%",
"visible": "flex",
"overflow": false,
"canvas": {
"x": 8,
"y": 208,
"width": 373.9921875,
"height": 564,
"top": 208,
"right": 381.9921875,
"bottom": 772,
"left": 8
},
"toolbar": {
"x": 228.3515625,
"y": 163,
"width": 143.640625,
"height": 42,
"top": 163,
"right": 371.9921875,
"bottom": 205,
"left": 228.3515625
}
},
"zoom": "154%",
"tile": {
"id": "t13",
"x": 106.1888882483258,
"y": 387.45427199526,
"pieceDiameter": 58.31673161276606,
"fitPieceDiameter": 37.77674172794118
},
"orientation": "60°",
"tap": {
"id": "t13",
"status": "exit",
"remaining": 13
},
"pipelineHash": "ef59b3d561147031a8cbfd059c67fabe01054039e89cba4c27c7b6408d05b03d",
"layoutHash": "c855ba95f504d7280b81820c2af64010fddcfc731041c3b176e7d88301249ba9",
"retainedByIdenticalLayoutHash": true
}
+30
View File
@@ -0,0 +1,30 @@
{
"number": 1,
"tiles": 3,
"kind": "tour",
"heroBefore": "exit",
"loadMs": 183.5,
"events": [
{
"id": "t0",
"status": "exit",
"at": 356.09999999403954,
"routeCells": 13,
"duration": 2627.2810841634755,
"remaining": 2
},
{
"id": "t1",
"status": "exit",
"at": 465.7000000178814,
"routeCells": 1,
"duration": 318.5640646055102,
"remaining": 1
}
],
"remaining": "1",
"resultOpen": false,
"overlapConfirmed": true,
"pipelineHash": "ef59b3d561147031a8cbfd059c67fabe01054039e89cba4c27c7b6408d05b03d",
"layoutHash": "d40409ef64404be3faaddd00576309648439d7d5b34a991f91a10a76f62090a0"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 317 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Some files were not shown because too many files have changed in this diff Show More