Files
NumberSwipe_New/README.md
T
cabinw 56ac6f317f 移除玩法二(连连气球),产品收敛为两个玩法
- 删除 modes/02-connect-1234 全部内容(历史见首个提交 8026e46)
- 重写根 README:共同规则、两玩法差异、仓库结构、快速开始、关卡、工程约定、文档索引、路线
- PRODUCT.md / design.md / shared/README / 两份 GDD / 玩法一 README 去掉玩法二引用
- 保留 01 / 03 目录编号并注明原因(存档桶名、Cocos 资源路径)
2026-09-16 14:47:04 +08:00

169 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# number-swipe
多玩法休闲 puzzle(工作名,上架名未定)。目前两个玩法,都属于「顺序一笔画」路径推理:用一次滑动走遍盘面上每一格,预先写好的数字必须刚好在那一步踩到。两者几何与障碍不同,共用一个壳,规则代码彼此独立。
手机竖屏、单机、离线可玩;无计时、无体力、无分数。先做 Web 触摸原型验证玩法,再迁 Cocos Creator。
| 玩法 | 目录 | 一句话 | 状态 |
|---|---|---|---|
| 一 · 数字一笔 | [`modes/01-number-stroke`](modes/01-number-stroke) | 矩形拼板一笔画,大格只计一步,数字 / 奇偶线索必须踩对 | Web 竖屏原型可玩,26 关(入门 10 + 进阶 10 + 奇与偶 6),有单文件试玩版 |
| 三 · 六边一笔 | [`modes/03-hex-walls`](modes/03-hex-walls) | 六边形一笔画,墙贴在边上挡住那一条邻接 | Web 竖屏原型可玩,10 关 + 转墙实验包 9 关 |
目录编号保留 `01` / `03`:曾有玩法二(连连气球),2026-09-16 放弃并移出仓库(历史在首个提交里)。编号同时是存档桶名和 Cocos 资源路径,不要重排。
---
## 两个玩法的共同规则
- **哈密顿路径**:每格恰好经过一次,只能走到相邻且未走过的格,第 `k` 步的格子显示数字 `k`。
- **线索**:部分格预写数字 `c`,走到时步号必须等于 `c`。线索可在中段;可以没有 `1`(起点未知)。
- **允许画错,不允许锁死**:踩错线索的格变红,不打断手势;随时沿原路撤销或一键重开;没有失败弹窗。
- **解唯一**:每一关发布前由求解器断言恰好 1 条满足全部线索的路径。
- **提示不带错**:无路径时指起点;路径是解的前缀时给下一步;已偏离时高亮分叉点让玩家退回,不继续往错路上填。
- **过关**:所有格走过且所有线索正确 → 短动效后自动下一关。
## 两个玩法的差异
| | 一 · 数字一笔 | 三 · 六边一笔 |
|---|---|---|
| 格子 | 轴对齐矩形(`1×1` 到 `3×3`)和俄罗斯方块式异形块,**整块只计 1 步** | 正六边形,一格一步,无大格 |
| 邻接 | 四向共边 | 六向共边(轴坐标 `q, r`) |
| 障碍 | 空洞 | 空洞 + **边墙**(有墙的两格视为不相邻);实验:随步数旋转的转墙 |
| 额外线索 | 奇 / 偶(该格步号的奇偶性) | – |
| 难度主旋钮 | 大格出口多但只算 1 步;相邻线索的步号差 | 墙掐掉表面上的近路;墙贴在线索旁让第一步只剩一个方向 |
| 存档桶 | `mode:01-number-stroke` | `mode:03-hex-walls` |
玩法三不是玩法一的 DLC:几何、邻接、障碍都独立,两边各写一份规则代码,禁止互相 import。
---
## 仓库结构
```
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 玩法一单文件试玩版,离线可开
```
每个玩法目录都是一个独立的 npm 工程,有自己的 `package.json`、`tsconfig` 和 `node_modules`。
---
## 快速开始
需要 Node.js 20+。两个玩法的命令完全一致,只是目录和端口不同。
```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 关。