# 产品结构 这是一个**多玩法**休闲 puzzle,不是单一机制的游戏。两个玩法共用一个壳,规则、盘面模型和关卡彼此独立。 工作名沿用目录 `number-swipe`。上架名未定。两个玩法各自有对外名称。 目录编号保留 `01` / `03`:曾有玩法二(连连气球),2026-09-16 放弃并移出仓库。编号同时是存档桶名和 Cocos 资源路径,不要重排。 ## 目录 ``` number-swipe/ docs/PRODUCT.md 本文件:壳、隔离规则、玩法清单 docs/design.md UI 设计规范:令牌、组件、动效(玩法一为参考实现) docs/design.html 同上的设计师版:色板、样张、可回放动效 modes/ 01-number-stroke/ 玩法一 · 数字一笔 docs/GDD.md levels/ 03-hex-walls/ 玩法三 · 六边一笔 docs/GDD.md levels/ shared/ 壳:选玩法、设置、存档索引、广告位 ``` ## 隔离规则 1. **玩法之间禁止互相引用。** `modes/*` 之间不得互相 import。 2. **规则、求解器、关卡、对局视图属于玩法。** 盘面模型不默认共用。玩法一是矩形格,玩法三是六边形 + 边墙,即使都是“顺序一笔画”也各写一份。 3. **`shared/` 只放壳。** 允许:玩法注册表、首页选玩法、设置、存档索引、广告位、安全区、通用按钮皮肤。禁止:过关判定、邻接、提示算法、关卡 JSON。 4. **存档按玩法分桶。** `mode:01-number-stroke` / `mode:03-hex-walls`。 5. **原型按玩法分开跑。** 各玩法的 Web 原型进自己的 `web/`。不要求绑在同一个 index.html。 6. **Cocos 按玩法切场景。** 资源与脚本放 `assets/modes//`。 壳看到的入口: ```ts interface PuzzleMode { id: string; title: string; mount(root: HTMLElement, ctx: ShellContext): void; unmount(): void; } ``` `ShellContext` 只提供存档读写、音效、振动、返回首页。 ## 玩法清单 | id | 目录 | 类型 | 状态 | 规格 | |---|---|---|---|---| | `01-number-stroke` | `modes/01-number-stroke` | 关卡逻辑:矩形一笔画 + 序号 | M1/M2:Web 原型可玩,26 关(教学 10 + 进阶 10 + 奇偶 6) | [GDD](../modes/01-number-stroke/docs/GDD.md) | | `03-hex-walls` | `modes/03-hex-walls` | 关卡逻辑:六边形一笔画 + 边墙 | M1/M2:Web 原型可玩,10 关 + 转墙实验包 9 关 | [GDD](../modes/03-hex-walls/docs/GDD.md) | 一和三同属路径推理,但几何和障碍不同,**不是 DLC 关系**。 新玩法开工顺序:写该玩法 GDD → 锁规则 → 再写该玩法的 `src/`。 ## 共享决策(全产品) - 手机竖屏,单机,离线可玩 - 默认无体力、无计时、无分数 - 竖直切面无广告;上线后的去广告 / 激励视频由壳统一接 - 先 Web 原型验证该玩法,再进 Cocos - 关卡、美术全部原创,不使用第三方题库和素材 ## 里程碑(产品级) | 阶段 | 内容 | |---|---| | 现在 | 两个玩法独立可运行,均为关卡原型(M1/M2),未进 Cocos | | 各玩法 M1 | 只在自己的 `modes/` 里做可玩原型,互不阻塞 | | 壳 | 两个玩法原型都已可玩,选玩法首页可以开工 | 任意一个玩法都可以单独推进,不必互相等待。