纠正仓库内容为衍生项目,标明 campaign-200-r2 最新版

This commit is contained in:
toshiocn
2026-10-19 16:56:31 +08:00
parent a492c5b80e
commit fdca4f67ea
1396 changed files with 392768 additions and 19530 deletions
+76 -146
View File
@@ -1,168 +1,98 @@
# number-swipe
# NumberSwipe_New · 数字一笔画衍生项目
多玩法休闲 puzzle(工作名,上架名未定)。目前两个玩法,都属于「顺序一笔画」路径推理:用一次滑动走遍盘面上每一格,预先写好的数字必须刚好在那一步踩到。两者几何与障碍不同,共用一个壳,规则代码彼此独立。
本仓库管理 NumberSwipe-Variants 下的衍生玩法、关卡、生成工具和设计资料。
手机竖屏、单机、离线可玩;无计时、无体力、无分数。先做 Web 触摸原型验证玩法,再迁 Cocos Creator。
## 当前最新版:campaign-200-r2
| 玩法 | 目录 | 一句话 | 状态 |
|---|---|---|---|
| 一 · 数字一笔 | [`modes/01-number-stroke`](modes/01-number-stroke) | 矩形拼板一笔画,大格只计一步,数字 / 奇偶线索必须踩对 | Web 竖屏原型可玩,26 关(入门 10 + 进阶 10 + 奇与偶 6),有单文件试玩版 |
| 三 · 六边一笔 | [`modes/03-hex-walls`](modes/03-hex-walls) | 六边形一笔画,墙贴在边上挡住那一条邻接 | Web 竖屏原型可玩,10 关 + 转墙实验包 9 关 |
- 试玩入口:[200 关评分修订版](campaign-200-r2/index.html),下载后可直接打开。
- 版本说明与校验方式:[最新版 README](campaign-200-r2/README.md)。
- 关卡评分:[SCORES.html](campaign-200-r2/SCORES.html)。
- `campaign-200`、`campaign-50` 和 `archive` 保留为历史版本及来源资料。
- 根目录 `index.html` 是早期五玩法验证入口,最新版请使用上方入口。
目录编号保留 `01` / `03`:曾有玩法二(连连气球),2026-09-16 放弃并移出仓库(历史在首个提交里)。编号同时是存档桶名和 Cocos 资源路径,不要重排。
以下保留早期玩法验证说明。
---
## 两个玩法的共同规则
# 一笔路径 · 第二轮玩法验证
- **哈密顿路径**:每格恰好经过一次,只能走到相邻且未走过的格,第 `k` 步的格子显示数字 `k`。
- **线索**:部分格预写数字 `c`,走到时步号必须等于 `c`。线索可在中段;可以没有 `1`(起点未知)。
- **允许画错,不允许锁死**:踩错线索的格变红,不打断手势;随时沿原路撤销或一键重开;没有失败弹窗。
- **解唯一**:每一关发布前由求解器断言恰好 1 条满足全部线索的路径。
- **提示不带错**:无路径时指起点;路径是解的前缀时给下一步;已偏离时高亮分叉点让玩家退回,不继续往错路上填。
- **过关**:所有格走过且所有线索正确 → 短动效后自动下一关。
按第一轮试玩反馈,当前只保留五个入口,每个玩法8关:入门、普通、进阶、难,各两关,共40关。
## 两个玩法的差异
## 开始试玩
| | 一 · 数字一笔 | 三 · 六边一笔 |
|---|---|---|
| 格子 | 轴对齐矩形(`1×1` 到 `3×3`)和俄罗斯方块式异形块,**整块只计 1 步** | 正六边形,一格一步,无大格 |
| 邻接 | 四向共边 | 六向共边(轴坐标 `q, r`) |
| 障碍 | 空洞 | 空洞 + **边墙**(有墙的两格视为不相邻);实验:随步数旋转的转墙 |
| 额外线索 | 奇 / 偶(该格步号的奇偶性) | – |
| 难度主旋钮 | 大格出口多但只算 1 步;相邻线索的步号差 | 墙掐掉表面上的近路;墙贴在线索旁让第一步只剩一个方向 |
| 存档桶 | `mode:01-number-stroke` | `mode:03-hex-walls` |
双击 `index.html`。各玩法 `modes/<id>/play.html` 都是可独立运行的离线单文件,所有关卡开放。首页也可直接进入各玩法的设计评审与答案图。
玩法三不是玩法一的 DLC:几何、邻接、障碍都独立,两边各写一份规则代码,禁止互相 import。
| 入口 | 核心区别 |
|---|---|
| 方向通道 | 横线只通左右,竖线只通上下;四种拐角连接不同两条边,都可以反向经过 |
| 双色交替 | 每步蓝→橙→蓝;大格整块一步,走过后仍保留原颜色 |
| 永久墙壁 | 共边上的黑黄墙整局不变,无开关,必须绕行 |
| 步进开关门 | 只有一道门;每落一格切换开/关,必须安排到门边的步数 |
| 六边融合:双色与墙 | 六向邻接同时满足换颜色与不穿墙,进阶和难关拓宽到三行 |
---
相对步差、先后链、到达窗口和路径开门已从试玩入口退出,保存在 `archive/v1/`,不参与当前生成、构建及验收。
## 仓库结构
## 方向图示
```
number-swipe/
README.md 本文件
docs/
PRODUCT.md 产品级约定:壳、隔离规则、玩法清单、里程碑
design.md UI 设计规范:色彩令牌、字阶、组件、四档动效(玩法一为参考实现)
design.html 设计师版:色板、组件样张、可回放动效(离线双击可看)
modes/
01-number-stroke/ 玩法一 · 数字一笔(自包含)
docs/GDD.md 规格(权威)
docs/HANDOFF.md 交接:做了什么、怎么做、与 GDD 的偏差、待办、Cocos 迁移顺序
levels/*.json 三个关卡包
src/ 纯 TS 规则层(零 DOM / 零 Cocos 依赖)
web/ 浏览器粘合层:DOM / Canvas / PointerEvent / localStorage
tools/ 求解器命令行:校验、设计辅助、随机生成
tests/ 规则层单元测试(node:test)
03-hex-walls/ 玩法三 · 六边一笔(自包含,同样的分层)
docs/GDD.md
docs/HANDOFF.md
levels/*.json
src/ web/ tools/ tests/
shared/ 壳:选玩法首页、设置、存档索引、广告位(尚无代码)
releases/
数字一笔-试玩版.html 玩法一单文件试玩版,离线可开
图标是通道形状,不是单向箭头:
- `─`:左 ↔ 右。
- `│`:上 ↔ 下。
- `└`:上 ↔ 右。
- `┌`:右 ↔ 下。
- `┐`:下 ↔ 左。
- `┘`:左 ↔ 上。
试玩用Canvas绘制清晰的线条通道,不依赖系统字体箭头。点击条件标签可高亮对应格。通道格不能做起点或终点,离开该格时检查进出边。
## 双色图示
蓝格带○,橙格带△;颜色为主要信息,符号辅助区分。蓝→橙→蓝是每关常驻说明。经过的格显示步号,底色仍是原来的蓝或橙;不能把已走格统一染成另一个颜色。
## 永久墙与步进门
黑黄粗线画在两格真实共边上,是永久墙,不占一个格,也不会切换。
步进门没有开关格,也没有钥匙:
1. 空盘门关。
2. 落下起点算第一格,门变开。
3. 落下第二格门变关,第三格再开,依此交替。
4. 移动之前用当前门状态判断能否穿过;落格后再切换。
5. 不落格、点击按钮或原地等待不会切换;撤销按剩余路径恢复状态。
盘面门口显示“开/关”,条件栏同时显示“再落一格就关/开”。开门是两段绿色边框之间的缺口,关门是连续阻挡。
## 操作与设计资料
点按或拖动相邻格追加,松手可继续;点已走格回退,也可撤销和重开。固定数字与通道条件画错会标红,但允许保留路径再修正;永久墙、关闭门和同色移动直接阻止追加。指路不会沿错误前缀继续。
每个文件夹含 `levels.json`、独立 `rules.mjs` / `ui.mjs`、离线 `play.html`、`DESIGN.html` / `DESIGN.md` / `design.json`,以及8张原始盘面和8张作者解SVG。
设计资料记录作者解、关键分叉、诱惑路线及每项新机制解除后的完整反例。试玩包只有规则和原始关卡,运行时求解,不读取设计资料答案。进度按玩法分别存档。
## 构建与检查
Node.js 22+,本次使用24.21.0;无需安装第三方依赖。
```powershell
node --test tests/*.test.mjs
node tools/validate.mjs
node tools/build.mjs
node tools/design-pages.mjs
node tools/isolation.mjs
```
每个玩法目录都是一个独立的 npm 工程,有自己的 `package.json`、`tsconfig` 和 `node_modules`。
`node tools/generate.mjs` 使用固定种子,会覆盖当前五个玩法的关卡与设计资料;重生成后必须重新构建、检查。历史四个玩法不会重新加入入口。
---
当前40/40关完整有序解唯一,每项通道要求、颜色机制、永久墙及步进门逐项必要;解除任意一项均至少两解。除教学起点外,辅助数字逐项检查必要性。
## 快速开始
27项规则与离线页面脚本测试通过。浏览器工具禁止file://地址,因此尚未完成实际浏览器像素与真机触感验收;DOM/Canvas测试不能替代这些检查。难度仍需新玩家校准。
需要 Node.js 20+。两个玩法的命令完全一致,只是目录和端口不同。
原NumberSwipe项目保持只读,全部修改在同级NumberSwipe-Variants目录。原项目91个受检查文件的内容及清单保持一致,详见 `reports/ISOLATION.md`。
```bash
# 玩法一 · 数字一笔(默认端口 8000)
cd modes/01-number-stroke
npm install
npm run dev # 本地服务 + 监听改动,终端打印手机可访问的局域网地址
npm run check # 类型检查(含 src/ 无 DOM 校验)+ 单元测试 + 全关卡唯一解校验
## 对比试玩
# 玩法三 · 六边一笔(默认端口 8100)
cd modes/03-hex-walls
npm install
npm run dev
npm run check
```
建议先玩方向通道、双色交替,再玩永久墙与步进门,最后玩六边融合。各玩法按四档顺序推进;观察是否能只看盘面说明就复述规则。
其它脚本(两边都有):
| 命令 | 作用 |
|---|---|
| `npm run build` | 打包到 `web/dist/app.js`,之后可直接双击 `web/index.html` |
| `npm run validate` | 逐关校验:连通、恰好 1 解(玩法三额外:第 3 关起去墙后不唯一、无冗余墙) |
| `npm run validate -- 1-7` | 只看某关并打印解 |
| `npm run design -- 1-7 --minimize` | 当前线索里哪些可删 |
| `npm run generate -- ...` | 随机铺盘 + 作者解 + 挑线索,批量产候选关 |
仅玩法一有 `npm run build:standalone`,导出 `releases/数字一笔-试玩版.html`:脚本、样式、26 关数据与合成音效全部内置,发一个文件给朋友即可离线试玩,全部关卡直接可选。
开发参数:URL 加 `?dev=1` 解锁全部关卡并暴露调试句柄(`window.__numberStroke` / `window.__hexWalls`);玩法一支持 `&level=3-1` 直接跳关。
---
## 关卡
关卡全部是 JSON,运行时只做规则模拟,不存解;解由 `tools/validate.ts` 在发布前枚举并断言唯一。
**玩法一**(`modes/01-number-stroke/levels/`)
- `pack-1-tutorial.json` 入门 10 关:每关只加一个旋钮——滑动 → 走完 → 撤销 → 大格 → 中段线索 → 空洞 → 先推再画 → 2×2 枢纽 → 长条 → 小考。
- `pack-2-advanced.json` 进阶 10 关:生成器产出 + 人工过目。大连块高频、`3×3`、异形块,难度靠相邻线索的步号差拉开;2-8 是第一关无线索 `1`。
- `pack-3-parity.json` 奇与偶 6 关:格上写「奇」/「偶」要求步号奇偶,与数字线索互斥、可与大格共用;每条奇偶条件都参与唯一性。
**玩法三**(`modes/03-hex-walls/levels/`)
- `pack-1-tutorial.json` 教学 10 关:无墙两关 → 第一堵墙 → 墙贴在 `1` 旁 → 中段线索 → 空洞 + 两墙 → 陷阱格 → 综合 → 走廊 → 满花盘 4 墙。每关断言「去掉全部墙后解不唯一」,保证墙在干活。
- `pack-2-spinner.json` 转墙 9 关(实验):绕顶点转的墙,每走一格顺时针转 120°。规则见玩法三 GDD 附录 A。
每关明细(格数、线索、去墙解数)见各玩法 README。
---
## 工程约定
隔离规则(详见 [`docs/PRODUCT.md`](docs/PRODUCT.md)):
1. `modes/*` 之间禁止互相 import。规则、求解器、关卡、对局视图都属于玩法自己。
2. `shared/` 只放壳:玩法注册表、首页、设置、存档索引、广告位、通用皮肤。禁止出现过关判定、邻接、提示算法、关卡 JSON。
3. 存档按玩法 id 分桶,互不读写。
4. 壳看到的入口只有 `{ id, title, mount(root, ctx), unmount() }`;`ShellContext` 只给存档读写、音效、振动、返回首页。
分层约定(两个玩法一致,为迁 Cocos 设计):
- `src/` 用 `tsconfig.src.json`(`lib: ["ES2020"]`)编译,**不能碰 DOM**,import 全部无后缀。这层原样拷进 Cocos 工程。
- 绘制走 `Painter` 接口(圆角矩形 / 多边形 / 圆 / 居中文字),Web 用 Canvas 实现,Cocos 换 `Graphics` + `Label` 池实现,`View.draw()` 不改。
- 输入走 `PointerInput.down/move/up()`,事件源可替换;存档走 `KeyValueStore` 抽象,Cocos 用 `sys.localStorage` 包一层。
- 视觉令牌三处一致:`web/style.css :root`、`src/theme.ts`、`docs/design.md`,由 `tests/theme.test.ts` 校验。
内容约定:关卡、美术、文案全部原创,不使用第三方题库或素材。
---
## 文档索引
| 文档 | 内容 |
|---|---|
| [`docs/PRODUCT.md`](docs/PRODUCT.md) | 产品结构、隔离规则、共享决策、里程碑 |
| [`docs/design.md`](docs/design.md) / [`design.html`](docs/design.html) | UI 设计规范与设计师样张 |
| [`modes/01-number-stroke/docs/GDD.md`](modes/01-number-stroke/docs/GDD.md) | 玩法一规格:规则、交互、反馈、关卡语言、求解器、竖直切面、验收 |
| [`modes/01-number-stroke/docs/HANDOFF.md`](modes/01-number-stroke/docs/HANDOFF.md) | 玩法一交接:实现细节、与 GDD 的偏差、已知问题、Cocos 迁移步骤 |
| [`modes/03-hex-walls/docs/GDD.md`](modes/03-hex-walls/docs/GDD.md) | 玩法三规格,附录 A 为转墙规则 |
| [`modes/03-hex-walls/docs/HANDOFF.md`](modes/03-hex-walls/docs/HANDOFF.md) | 玩法三交接 |
| [`shared/README.md`](shared/README.md) | 壳的边界:能放什么、不能放什么 |
---
## 状态与路线
| 阶段 | 状态 |
|---|---|
| 各玩法 M1/M2:规则库 + 求解器 + 可玩原型 + 存档 / 提示 / 音效 / 振动 | 两个玩法均已达成 |
| 真人试玩调校:手势死区、教学梯度、关卡难度手感 | 待做,需要 3~5 个没玩过的人 |
| 壳:选玩法首页、设置、存档索引 | 未开始(两个玩法原型都已可玩,可以开工) |
| M4:迁 Cocos Creator 3.x,各玩法独立场景,资源放 `assets/modes/<id>/` | 未开始,迁移顺序写在各 HANDOFF |
已知的规格与实现偏差(各 HANDOFF §3 有全表):两份 GDD 的教学关数与内容计划(玩法一 12 关 / 44 关,玩法三 8 关 / 32 关)仍是早期目标值,实际为 10 关 / 26 关与 10 关。
在“记录本关体验”填口述推理,导出本关JSON。观察者用 `reports/playtest-template.csv` 补充第一次错误、回退、提示、思考时间和边界可读性。尤其比较墙与门是否产生不同决策,以及六边融合是否仍主要靠顺手试画。