DESIGN MODEL v2 · SPACE TOPOLOGY · 2026.10.11
空间结构参与评分,完整解法保证可完成。
本版将棋盘地面建成图,再结合身体与洞口摆放计算窄口负荷、绕墙距离、长身体的回转余量和连续空地。相同面积、数量和长度的关卡,可以因空间结构不同得到不同设计分。
1. 空间数学:地面图与局面图分开计算
地面图 G=(V,E):每个可走格是一个顶点,四向相邻可走格之间连边。它回答墙体、房间和通道的结构问题。局面图:每个完整游戏状态是一个顶点,每次合法移动一格是边;它包含身体形状、颜色、冰冻、钥匙和剩余洞口,用于判断可解与求最短步数。地面连通不能代替局面可解。
| 数学工具 | 计算什么 | 怎样影响难度 |
|---|---|---|
| 割点与小规模顶点分隔 | Tarjan 找单格割点;再检测横向或纵向只含两格的切片。删除后若第二大区域至少占本连通区8%、且不少于3格,记录为显著窄口。 | 结合两侧身体到同色洞口的最低跨区需求,以及已横跨窄口的身体数量,除以通道宽度。取最大负荷,避免同一走廊多个切口重复加分。 |
| 图上的最短距离与最小费用匹配 | BFS 计算绕墙距离;按颜色用匈牙利算法分配不重复洞口,比较其总成本与曼哈顿距离匹配成本。 | 身体和洞口在墙的哪一侧,比地图外形复杂度更重要。差值越大,墙体带来的绕行越强;同色洞口不能反复当作同一个最近目标。 |
| 局部二维空间 | 统计哪些地面格属于至少一个完整可走的2×2方块,再看长身体有多少格落在这类空间之外。 | 同样的通道对短身体与长身体影响不同;按长度加权。这只是局部回转余量指标,不能单独证明某次转弯可行或不可行。 |
| 空地连通分量 | 暂时把身体和未使用洞口也视作障碍,计算空地总数、分块数与最大连续空地。 | 20个碎空格与20格完整空地不能等价;最大空地相对最长身体越小,临时停放越受限。真正能否挪动仍由实际规则搜索验证。 |
| 局面图上的全局 A* | 枚举所有身体头尾的合法单步,完整回放碰撞、彩衣、冻结和钥匙。 | 提供有解证书与步数上下界。完成最优性证明才显示最少步数;搜索预算耗尽只表示未确定。 |
诊断还保留连通区数量、图直径、平均绕行倍率、2×2覆盖率与回路秩 E−V+C。回路可能增加路线选择,也可能提供让路空间,所以不把“回路越多”简单计为更难。
同一个地图也会有不同的空间压力
双厅只有两格宽的门:若每条身体的同色洞口都在本厅,跨厅负荷可以为0;若多条身体必须穿门或已经占住门,负荷会上升。测试使用相同墙、身体、长度和颜色数量,只交换洞口颜色位置,确认空间分发生变化。
2. 参数与空间模板
| 参数 | 约束 |
|---|---|
| 空间模板 | 混合、开阔庭院、凹口与侧湾、阶梯轮廓、十字收腰、环岛绕行、双厅窄口、折返通道、梳齿侧室、柱阵回廊、独立分区。最后一种保留两个独立区域,各区颜色供需必须匹配。 |
| 列 / 行 / 有效格数 | 列2–18,行2–24,有效格4–400;含外围墙不超过600格。自动推荐会按模板调整尺寸;关闭推荐后列、行、有效格数全部固定,容不下模板会拒绝候选。 |
| 身体 / 长度 / 总节数 | 1–16条,每条2–40节,总计2–350节;总节数位于数量×最短长度与数量×最长长度之间。连续、自避、身体间不重叠。 |
| 颜色 / 彩衣 | 外层1–15色且不超过身体数量;彩衣每条额外1–3层,共享原有身体路径。每一层配一个同色目标。 |
| 冻结 / 钥匙 | 冻结按累计退出层数解锁;银色1钥匙1锁,金色2钥匙1锁。先取得空间解,再安排合法依赖,最后完整回放。 |
| 难度 / 步数 / 预算 | 设计分0–100,默认±7;步数范围约束当前完整解法。候选、快速分支、单身体寻路、精确状态数与精确耗时分别设预算。 |
当前覆盖机制为彩衣共享路径;独立身体叠放、立交穿越和原作多棋盘联动尚未实现。原作独立分区思路在本版同一地面坐标系内实现。
3. 难度公式
clip(x)=min(1,max(0,x))。七项贡献相加、保留一位小数;总权重100。它是结构设计分,尚未用玩家数据拟合。
| 指标 | 权重 | 归一化值 | 说明 |
|---|---|---|---|
| 空间占用 | 18 | clip((占用率−0.25)/0.60) | 占用率=(初始身体格+洞口格)/可走格。 |
| 身体规模 | 12 | clip(身体节数/70) | 同时显示身体数量、均长与最长身体。 |
| 完成步数 | 18 | clip(完整解法步数/100) | 缩短解法后重新评分,禁止用绕圈凑分。 |
| 空间阻挡 | 14 | 1−潜在出口上界/身体数量 | 取消冰冻与锁,允许走过自身,但保留其他身体、墙和洞口。 |
| 机制依赖 | 12 | clip(额外层/(数量×0.7)+冻结门槛总和/(数量×5)+(钥匙身体+挂锁身体)/(数量×1.1)) | 只计已经实现并完整验证的规则。 |
| 腾挪需求 | 8 | 0.55×开局潜在出口为0+0.45×clip(腾挪步数/max(4,身体节数×0.2)) | 解法中的腾挪量不等于最少必要腾挪量。 |
| 棋盘空间 | 18 | sqrt(0.45B²+0.25D²+0.20N²+0.10F²) | 加权均方根使严重单项约束不被其他低值过度稀释;具体权重仍需试玩校准。 |
B = clip(最大窄口负荷 / 2)
窄口负荷 = (最低跨区需求 + 横跨窄口的身体数) / 窄口格数
× min(1, 第二大区域占比 / 0.25)
D = clip((绕墙匹配下界 − 曼哈顿匹配下界) / max(2, 曼哈顿匹配下界))
N = clip(2 × 长度加权的窄空间身体格占比)
F = clip((1 − 最大连续空地 / 空格总数)
× min(1, 最长身体 / max(1, 最大连续空地)))
窄口与空地指标会相互影响,当前使用分项与阈值保持可解释,不声称它们统计独立。后续应以首通耗时、失败次数、提示使用和腾挪次数校准权重,特别要区分操作难与思考难。
4. 生成、筛选与固定主线
- 模板按公式生成新坐标,镜像与边界小变化增加布局变化;仅移除边界格并保持预期连通区数量,直到达到精确有效面积。不复制原作坐标。
- 从长到短放置自避身体;同色目标避开初始端点邻格,并放在匹配连通区。
- 快速搜索寻找退出顺序与让路动作。失败候选丢弃;成功后安排彩衣、冰冻与钥匙依赖,并调用实际游戏规则回放。
- 解法按完整状态去掉绕圈;检查难度、步数、腾挪条件。全局搜索缩短解法后再次检查,未达请求范围不冒充合格候选。
- 编辑器固定参数绝不自动放宽。主线批量构建可在多次失败后更换空间模板,同时保留该关身体规模、空格与教学要求。每25关保存完整进度,允许续跑。
- 主线2000关已按本版模板重建,玩家进入关卡时读取固定布局。前期仍引导头部、尾部、连续转弯,12/18/24/30关分别教授彩衣、冻结身体、冻结洞口与钥匙。
5. 可解证书与最少步数
一步是某条身体一端移动到相邻格;一次拖动可能包含多步,进洞动画不计步。所有认证关卡都有完整合法动作序列,最后要求全部身体完成、全部洞口使用。任何编辑会使旧证书失效,导出前再次回放。
| 状态 | 依据 | 可导出 |
|---|---|---|
| 已验证有解 | 完整合法序列回放成功;生成批次还须满足指定范围。 | 是 |
| 已证明无解 | 连通区颜色供需不匹配,或全局搜索穷尽全部状态。 | 否 |
| 预算内未确定 | 达到状态或时间上限,没有完整解。 | 否;不等于无解 |
| 有解但未达范围 | 解法正确,设计分或步数不符合请求。 | 仅可查看与试玩,不进入合格批次 |
A* 的可采纳下界也已经纳入墙体。按每种当前外层颜色,为身体与不重复的剩余同色洞口做最小费用匹配:
成本(身体w, 洞口h) = max(1, min(头到h的绕墙距离, 尾到h的绕墙距离) − 1) 下界 = 各颜色最小匹配成本之和 + 所有剩余内层数 上界 = 已经完整回放成功的解法步数
下界保留静态墙体,忽略其他身体、冰冻、锁和活动洞口的临时阻挡,所以是必要成本而非完整解法。每层至少需一次移动。所有待搜索状态的成本下界都不小于已知完整解时,才证明最优;否则显示下界—上界与“最少步数未证明”。小局面用独立穷举BFS校对,匹配算法用独立穷举分配校对。
6. 编辑、试玩与批量接入
- 在编辑器选择空间模板与目标难度;自动推荐按模板分配尺寸。关闭推荐后可固定所有布局与机制参数。
- 点击对象改属性,石块工具修改空间结构,画身体工具按相邻格重新绘制;支持导入JSON和主线1–2000关。
- 验证后查看窄口负荷、绕墙下界、最大连续空地、七项贡献和完整解法;回放或进入游戏试玩。
- 导出认证JSON保存批次。浏览器草稿与同源试玩不改变主线进度。
npm run design:levels -- --target 70 --count 10 --seed 123 --out output/batch.json npm run design:levels -- --spec my-spec.json --out output/custom.json npm run design:levels -- --verify output/custom.json --out output/certificate.json npm run check:designer npm run generate:levels -- --resume
自定义JSON可设置 topology: "twin" 等模板ID;其余为 courtyard、notched、stepped、cross、island、winding、comb、pillars、split、mixed。浏览器与命令行共享相同模块。下载本版认证样本。
源码:designer/topology.js 图、匹配与空间评分;templates.js 模板;generator.js 生成与认证;analysis.js 规则与总分;exact.js 全局最短搜索。完整主线图鉴及原作空间依据保存在本地设计报告。
本版分档认证样本
目标10、30、50、70、90各两关,种子20261011;容差±7。候选预算6000,高档16000;精确搜索2000状态、10秒。本轮10关全部通过。100分档尚未完成稳定生成验证,不能宣称所有档位或任意参数都在预算内成功。
| 目标 | 设计分 | 模板 | 完整解法 | 最少步数 |
|---|---|---|---|---|
| 10 | 14.1 | 独立分区 | 3步 | 3步 |
| 10 | 13.2 | 环岛绕行 | 7步 | 7步 |
| 30 | 34.6 | 折返通道 | 22步 | 22步 |
| 30 | 25.3 | 双厅窄口 | 19步 | 19步 |
| 50 | 54.2 | 折返通道 | 71步 | 未证明;下界57 |
| 50 | 49.4 | 双厅窄口 | 39步 | 未证明;下界36 |
| 70 | 72.7 | 折返通道 | 98步 | 未证明;下界87 |
| 70 | 63 | 双厅窄口 | 54步 | 未证明;下界29 |
| 90 | 87.7 | 双厅窄口 | 128步 | 未证明;下界87 |
| 90 | 87.4 | 双厅窄口 | 112步 | 未证明;下界82 |
7. 目前的边界
- 保证每个认证关卡有解;不保证任意参数组合都存在解,也不保证预算内找到指定难度。
- 当前窄口检测覆盖单格割点与轴向两格分隔;尚不是任意形状、多格通道的完整最小割算法。后续可用顶点拆分后的最大流扩展。
- 2×2覆盖与连续空地是空间余量指标,不能作为长身体可转弯或可停放的充分条件。
- 大关评分使用已找到解法;最短解可能更短。全部2000关的解法有验证,不声称全部已证明最短或已经人工玩完。
- 主线档位是配方标签,设计分也不是实际玩家通关率;需持续试玩校准。操作手感沿用现有连续移动系统。
- 固定种子控制候选序列;精确搜索仍受时间预算影响。需重现时保存关卡、证书和版本,使用固定状态上限与足够时间。