四个难度 · 每档两关 · 全部开放
点按或拖动相邻格 · 松手可继续 · 点已走格回退
玩法规则
固定数字必须在对应步到达。所有格各走一次。永久墙、关闭的门和同色移动会阻止移动;其他条件画错可继续,错误处标红。
记录本关体验
用自己的话说明关键分叉为什么只能这样走。导出记录含首次错误、回退和提示次数。
import fs from 'node:fs';import path from 'node:path';import {fileURLToPath} from 'node:url';import {definitions} from './definitions.mjs'; const root=path.resolve(path.dirname(fileURLToPath(import.meta.url)),'..'); const css=`*{box-sizing:border-box}body{margin:0;background:#f6f5fb;color:#292a43;font-family:system-ui,'Microsoft YaHei',sans-serif}main{max-width:620px;margin:auto;padding:20px 18px 32px}a{color:#6650bf}header{display:flex;justify-content:space-between;align-items:center}h1{font-size:26px;margin:10px 0 4px}h2{font-size:18px;margin:14px 0 8px}p{line-height:1.6;margin:8px 0;color:#66677e}.eyebrow{font-size:12px;letter-spacing:.1em;color:#7e728f}button{font:inherit;min-height:44px;border:1px solid #d8d5e5;border-radius:12px;background:white;color:#47405f;padding:9px 15px;cursor:pointer}button:focus-visible,a:focus-visible,textarea:focus-visible{outline:3px solid #a586ed}button.active{background:#6c56c8;border-color:#6c56c8;color:white}button:disabled{opacity:.4}nav,.controls,#constraints{display:flex;gap:8px;flex-wrap:wrap;margin:10px 0}#difficulties{display:grid;grid-template-columns:repeat(4,1fr)}#levels{margin-bottom:18px}.card{padding:14px;border:1px solid #e4e0ef;border-radius:20px;background:white;box-shadow:0 6px 26px #41336508}.meta{display:flex;justify-content:space-between;align-items:center;font-size:13px;color:#767286}#remaining{background:#ece7ff;color:#6650bf;padding:6px 10px;border-radius:20px;font-weight:700}canvas{display:block;width:100%;height:470px;touch-action:none}#status{min-height:48px;font-size:14px;color:#554b70;line-height:1.7}#caption{font-size:13px}#constraints{margin-bottom:0}.constraint{font-size:13px;min-height:36px;padding:6px 10px;background:#f7f4ff}.controls button{flex:1;padding:10px 8px}.controls button.primary{background:#6c56c8;color:white}details{margin-top:16px;padding:12px;background:#eeebf6;border-radius:12px}summary{cursor:pointer;font-weight:600;min-height:28px}textarea{width:100%;min-height:80px;font:inherit;margin:8px 0;border:1px solid #d5cce6;border-radius:8px;padding:10px}.small{font-size:12px}.cards{display:grid;gap:14px}.cards a{display:block;text-decoration:none;color:inherit}.cards .card:hover{border-color:#8d78cf}.pill{font-size:12px;color:#7c659a}footer{margin-top:22px;font-size:12px;color:#857d93}@media(max-width:400px){main{padding:12px}canvas{height:420px}h1{font-size:23px}button{padding:8px 10px}}@media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}`; const esc=s=>s.replaceAll('&','&').replaceAll('<','<').replaceAll('>','>'); for(const def of definitions){const folder=path.join(root,'modes',def.id),pack=JSON.parse(fs.readFileSync(path.join(folder,'levels.json'),'utf8').replace(/^\uFEFF/,'')); fs.copyFileSync(path.join(root,'tools','ui-template.mjs'),path.join(folder,'ui.mjs')); let engine=fs.readFileSync(path.join(folder,'rules.mjs'),'utf8').replaceAll('export ','');let ui=fs.readFileSync(path.join(folder,'ui.mjs'),'utf8').replace(/^import[^\n]+\n/,''); const script=`const PACK=${JSON.stringify(pack).replaceAll('<','\\u003c')};\n${engine}\n${ui}`; const html=`
四个难度 · 每档两关 · 全部开放
点按或拖动相邻格 · 松手可继续 · 点已走格回退
固定数字必须在对应步到达。所有格各走一次。永久墙、关闭的门和同色移动会阻止移动;其他条件画错可继续,错误处标红。
用自己的话说明关键分叉为什么只能这样走。导出记录含首次错误、回退和提示次数。
每个玩法 8 关:入门、普通、进阶、难,各 2 关。先观察,再一笔完成。
五章渐进 · 奇偶与机制组合 · 全部关卡开放
${definitions.map((d,i)=>`0${i+1} · 8 关${esc(d.rule)}
`).join('')}