The shipped 1000 levels have a hole: 568 of them need no rotation at all, and none needs more than two — the mechanic the game is built on is mostly decoration. This fills the empty band with levels that need at least three. createDeepLock builds a four-piece chain where each link only releases at a later orientation, and growDeepLevel packs the rest of the board around it without opening a shortcut. Candidate pools are built per orientation and left untruncated; ranking by bend count first starved the packer and capped levels at four to six pieces instead of twelve. deadTurnAudit enumerates every reachable (orientation, remaining-set) state to prove no dead ends exist, and counts how long a player can be left with nothing to do — solvable and feeling solvable are different things, which is what "level 2 is impossible" turned out to be about. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
3.4 KiB
3.4 KiB
D5 · 三转链式锁构造原型
目的:验证在现行规则(消除单调、旋转免费可逆)下,能否稳定构造出最少需要三次旋转、且开局大部分棋子被锁住的关卡。这是 v0.6 难度曲线里 D5 档的内容来源;v0.5 千关里该档为 0,createStageSeed 只能产出两转锁。
打开:npm run dev 后访问 /labs/d5/index.html。只读 levels/prototypes/d5.json,不写入主线存档。
构造方法
src/deep-lock.js
createDeepLock(base)— 四子链式锁 A/B/C/D。朝向 0 全部被锁;+1 只有 B 能走;+2(B 走后)只有 C 能走,A 与 D 互锁;转回 +1 放 A,再放 D。网格路线只用来提议,每一阶段都用主游戏的扫掠碰撞trace()逐条认证,最后由solveRotations()证明不存在一转或两转的清盘方案。growDeepLevel(base, lock, { target, layerShares })— 反向插入更多棋子,按朝向 0 / 1 / 2 分层配额;优先选「在更早的朝向都被挡」的棋子,使它们真正等旋转;每插一枚重新求解,最少旋转数跌破 3 即拒绝。deepLevelStats(level)— 锁住占比(首转时剩余)、每次旋转释放数、首转是否只有一侧能开路、波次。
一次扫描的产出(6 形态 × r3/r4 × 8 种子)
找到锁 55/96 · 长成 R≥3 关 55 · 旋转次数 {3:47, 4:1, 5:7}
锁住占比中位 78%(v0.5 现状 22%)· 每转释放 ≥2 枚 38/55 · 首转单向 9/55
随机玩家 动作÷棋子 中位 7.5(v0.5 全库 1.67,v0.4 手作 3.42)
switchback r3、crossing r3 产出 0:小盘上这两种形态找不到满足四子约束的候选
重新生成:node scripts/prototype-d5.mjs --seeds=8 --keep=18(--radii=3,4,5 可含 91 格;默认不含)。
「无解」问题与可玩性门槛
第一批里的第 02 关(orbits r3 s3)被试玩者判为无解。穷举全部 324 个可达状态:0 个死局,参考解在真实界面里也能清盘。问题出在体感:开局 100% 锁死 + 首转只有右边有效 + 最后一步要转回来。先往左转的人连看 3 个空朝向,右右之后继续右转的人连看 4 个——两条路都读作"无解"。
对策分两层,都已落地:
- 结构门槛(
scripts/prototype-d5.mjs):deadTurnAudit()穷举玩家可达的全部状态(任意点击顺序、任意旋转序列),证明没有死局,并统计「双向死转态」(卡住时左右各转一次都打不开的状态数)与「最长盲转」。入选关必须:首转两侧都能开路、开局锁住 ≤90%、无不可解可达态;按双向死转态升序排。现在前 4 关这两项都是 0,随机玩家动作÷棋子回到 3.6–6.5。 - 反馈(
labs/d5/app.js):卡住后闲置 3 秒,正确的旋转按钮开始脉冲并提示方向——即 §07 第 1 条的做法,方向永远不即时给出。任何输入都会清掉提示。
尚未解决
- 随机玩家的动作数仍高于手作版(v0.4 为 3.42);D5 放在第 501 关后是否合适,要真人试玩。
- 现在的参考解是求解器给出的最短解,不是作者解;正式接入生产时应保留作者见证(同
createStageSeed)。 - 「首转释放 ≥2 枚」只在扫描时排序,未在生长时强制。
- 「双向死转态 = 0」目前只是排序偏好,不是硬门槛;D5 后段若需要单向关,应配合闲置提示一起上线,不能单独放。