Files
wechat-minigame/docs/02-game-design.md
manpengan 4d3da38102 fix: 修复 Codex review 的 5 项问题 + 3 项 open questions
01-charter: 去金币矛盾、JSON→JS module、更新下一步
02-game-design: 道具状态机重设计(仅操作槽位)、去金币改道具奖励、
  MVP 跳过洲选择页直入城市、物件数统一为3倍数、新增存档模型
03-content-pipeline: 猫猫路径统一 cat_{city_id}.png、
  新增难度生成器系统设计(overlap graph/seed/solver/死局检测)、
  新增元素配比规则(5 类目各 ≥2)、piecesPerElement 约束强化

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 22:48:57 +08:00

308 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.
# 02 Game Design — 城市抓猫猫
## 1. 核心玩法规则
### 1.1 基础机制
抓大鹅式堆叠三消:
- 场景中多层堆叠物件(城市特色元素:冰箱贴、美食、建筑、动物等)
- 上层物件遮挡下层,只有**未被完全遮挡**的物件可点击拾取
- 底部 **7 格暂存槽**
- 点击物件 → 飞入暂存槽 → 3 个同类物件自动消除
- 暂存槽满 7 格且无法消除 → 游戏失败
### 1.2 胜利/失败条件
| 条件 | 规则 |
|------|------|
| 胜利 | 清除场景中所有物件 |
| 失败 | 暂存槽满 7 格无法消除 |
| 时间 | 无时间限制MVP 阶段),靠物件数量控制局时 2-4 分钟 |
### 1.3 道具系统MVP
道具只操作暂存槽,不操作场景物件,避免恢复堆叠遮挡的复杂度。
| 道具 | 效果 | 免费额度 | 额外使用 |
|------|------|---------|---------|
| 撤回 Undo | 将暂存槽最后放入的 1 个物件移回场景顶层(不恢复原位,放到顶层空闲位置) | 每局 3 次 | 激励视频 |
| 移出 Remove | 将暂存槽中 3 个物件移到旁路寄存区1 格),下次有任意消除发生时自动回归暂存槽 | 每局 1 次 | 激励视频 |
| 洗牌 Shuffle | 重新随机排列场景中所有剩余物件的位置和层级 | 每局 1 次 | 激励视频 |
**道具状态转移表:**
```
暂存槽状态:[A][B][C][D][E][F][G] 7 格)
旁路寄存区:[X][Y][Z] 3 格,仅 Remove 道具使用)
── Undo ──
前置:暂存槽非空
操作:取暂存槽末位 1 个物件 → 放回场景顶层可见位置
后置:暂存槽空出 1 格
特殊:如果暂存槽为空则道具不可用(置灰)
── Remove ──
前置:暂存槽已用 ≥ 3 格 且 旁路寄存区为空
操作:取暂存槽中 3 个不同类型的物件 → 移入旁路寄存区
后置:暂存槽空出 3 格
回归条件:场景中发生任意一次三消 → 旁路寄存区物件自动回归暂存槽
回归溢出:如果回归时暂存槽已满 7 格 → 先回归再判定失败(即回归物件 + 当前槽位 > 7 则游戏失败)
限制:旁路寄存区非空时不可再次使用 Remove
── Shuffle ──
前置:场景中剩余物件 > 0
操作:所有场景物件重新随机分配位置和层级
后置:物件总数和种类不变,堆叠关系重新生成
特殊Shuffle 后需保证至少 30% 物件可点击(同关卡生成约束)
```
**道具交互约束:**
- Undo 和 Remove 互斥使用:旁路寄存区非空时 Undo 不可用(避免回归顺序混乱)
- Shuffle 与其他道具无冲突
- 复活(激励视频):清空暂存槽 + 清空旁路寄存区,场景状态不变,继续游戏
### 1.4 操作交互
| 交互 | 规格 |
|------|------|
| 拾取方式 | 单点点击(不用拖拽) |
| 飞入动画 | 贝塞尔曲线路径0.2s |
| 消除动画 | 闪光 + 缩放消失0.3s |
| 通关动画 | 撒花 + 城市特色猫猫出现1s |
---
## 2. 地图结构
### 2.1 导航层级MVP 简化为二级)
```
MVP 首版:直接进入亚洲城市页(跳过洲选择页)
城市选择3x3 棋盘) → 城市关卡(单局游戏)
V1.1 扩展第二个洲后:
洲选择3x3 棋盘) → 城市选择3x3 棋盘) → 城市关卡
```
预留洲选择页的代码入口但 MVP 不显示。
### 2.2 主页面设计
- MVP 直接显示亚洲城市 3x3 棋盘,顶部标题"亚洲"
- V1.1 扩展第二个洲后再开启洲选择页
### 2.3 洲内页面设计
- 3x3 棋盘布局,每格代表一个城市
- 城市封面:特色猫猫头像 + 城市名
- 已通关城市:猫猫头像点亮 + 通关星级
- 未解锁城市:灰色剪影 + 锁图标
- 解锁规则:顺序解锁(通关前一个解锁下一个),第 1 个城市默认解锁
### 2.4 城市关卡结构
每个城市包含 **6 个基础关卡**,全部通关才算"通关该城市"。
- 每关使用该城市 12-15 个特色元素中的 8-12 个
- 难度递增:关 1 用 6 种元素各 3 个,关 6 用 10 种元素,各 3 或 6 个(混合配置) + 更深堆叠
- 通关后获得该城市的猫猫收集卡
---
## 3. 城市猫猫系统
### 3.1 猫猫收集
- 每个城市对应 1 只特色猫猫
- 通关该城市所有 6 关 → 获得猫猫收集卡
- 猫猫头像作为城市封面显示在地图上
### 3.2 猫猫设计规则
每只猫猫的差异化维度:
| 维度 | 说明 |
|------|------|
| 品种暗示 | 不写实,用颜色和花纹暗示 |
| 城市穿戴 | 城市特色装饰(东京猫戴招财猫面具、北京猫戴虎头帽) |
| 视觉风格 | 统一扁平冰箱贴风格,确保一致性 |
### 3.3 猫猫展示
| 场景 | 表现 |
|------|------|
| 通关城市 | 猫猫出场动画(从屏幕外跳入 + 特效) |
| 图鉴页面 | 已收集猫猫陈列展示 |
| 未收集 | 灰色剪影 + "???" |
---
## 4. 图鉴系统
### 4.1 城市图鉴
- 记录每个城市的通关状态、星级、特色元素收集进度
- 展示该城市文化小知识1-2 句话)
### 4.2 猫猫图鉴
- 已收集猫猫陈列(按洲分类)
- 每只猫猫有名字 + 1 句话介绍
- 收集进度X/Y 只
### 4.3 护照系统
- 每通关一个城市,护照盖一个章
- 护照页面可分享为"明信片"
- 护照进度是核心成就展示
---
## 5. 每日挑战
| 项目 | 规格 |
|------|------|
| 内容 | 每天 1 个随机城市的特殊关卡 |
| 难度 | 比普通关卡略高(更多物件种类、更深堆叠) |
| 奖励 | 道具补给Undo ×2+ 特殊明信片 |
| 生成方式 | 程序化生成(基于难度参数随机组合) |
---
## 6. 广告入口设计
| 广告类型 | 触发点 | 频次控制 |
|---------|--------|---------|
| 激励视频 | 失败后"复活"(清空暂存槽继续) | 每局最多 1 次 |
| 激励视频 | 使用额外道具(重排/撤回/移出) | 每种每局 1 次 |
| 激励视频 | 通关后"双倍奖励" | 每局可选 |
| 激励视频 | 每日签到奖励翻倍 | 每日 1 次 |
| 插屏广告 | 通关结算后(非失败后) | 每 3 局 1 次 |
原则:**失败后不弹插屏**(避免负面情绪叠加),激励视频全部可选不强制。
---
## 7. 分享入口设计
| 触发点 | 分享内容 | 奖励 |
|--------|---------|------|
| 通关城市 | 城市猫猫卡片 + "我解锁了XX猫" | 道具补给Undo ×1 |
| 护照盖章 | 护照截图 + 收集进度 | 道具补给Shuffle ×1 |
| 每日挑战通关 | 挑战结果卡片 | 道具补给Undo ×2 |
| 图鉴里程碑 | "已收集X只猫猫" | 特殊明信片 |
分享卡片设计:猫猫形象 + 城市背景色 + 进度信息 + 小程序入口按钮。
---
## 8. 难度设计思路
### 8.1 难度参数
| 参数 | 范围 | 说明 |
|------|------|------|
| 物件种类数 | 6-12 | 种类越多,匹配越难 |
| 每种物件数量 | 3 的倍数(通常 3 或 6 | 必须是 3 的倍数保证可消除 |
| 堆叠层数 | 2-5 层 | 层数越多,可见物件越少 |
| 遮挡密度 | 低/中/高 | 物件重叠面积占比 |
| 总物件数 | 18-60 | 局时控制核心参数 |
### 8.2 城市内难度曲线
```
关1: 6种 × 3个 = 18件, 2层, 低遮挡 → 新手教学
关2: 7种 × 3个 = 21件, 2层, 低遮挡 → 轻松熟悉
关3: 8种 × 3个 = 24件, 3层, 中遮挡 → 开始有策略
关4: 9种 × 3个 = 27件, 3层, 中遮挡 → 需要思考
关5: 10种 × 3个 = 30件, 4层, 中高遮挡 → 考验规划
关6: 10种 × 3-6个 = 36件, 4层, 高遮挡 → Boss关
```
### 8.3 跨城市难度递进
| 城市序号 | 定位 | 特点 |
|---------|------|------|
| 城市 1北京 | 教学城市 | 最简单,引导玩家熟悉机制 |
| 城市 2-3 | 平滑上升 | 物件种类增加,层级不变 |
| 城市 4-5 | 进阶挑战 | 引入更高层级 + 更多种类 |
| 城市 6 | 挑战级 | 最大物件数 + 最深堆叠 |
---
## 9. 玩家存档模型
所有玩家数据持久化到 `wx.Storage`key 为 `player_state`
### 9.1 存档 Schema
```javascript
const playerState = {
// 版本控制(存档迁移用)
saveVersion: 1,
// 城市进度
unlockedCities: ['beijing'], // 已解锁城市 id 列表
levelProgress: {
// city_id: { levelId: { stars: 0-3, completed: bool, bestMoves: number } }
beijing: {
1: { stars: 3, completed: true },
2: { stars: 2, completed: true },
// ...
},
},
// 收集
collectedCats: ['beijing'], // 已收集猫猫的城市 id
passportStamps: ['beijing'], // 已盖章城市 id
// 道具库存
inventory: {
undo: 3, // 撤回次数
remove: 1, // 移出次数
shuffle: 1, // 洗牌次数
},
// 每日挑战
dailyChallenge: {
date: '2026-03-28', // 上次挑战日期YYYY-MM-DD
completed: false,
cityId: 'tokyo', // 今日挑战城市
seed: 12345, // 关卡生成种子
},
// 广告冷却
adCooldowns: {
interstitialCount: 0, // 今日插屏已展示次数
lastInterstitialTime: 0, // 上次插屏时间戳
lastRewardDate: '2026-03-28', // 上次激励视频日期
},
// 设置
settings: {
soundEnabled: true,
musicEnabled: true,
vibrationEnabled: true,
},
// 统计
stats: {
totalGamesPlayed: 0,
totalGamesWon: 0,
totalShareCount: 0,
firstPlayDate: '2026-03-28',
},
}
```
### 9.2 存档读写规则
| 规则 | 说明 |
|------|------|
| 读取时机 | 游戏启动时读取一次,缓存在内存 |
| 写入时机 | 关卡通关/失败、道具使用、城市解锁、设置变更时写入 |
| 写入方式 | `wx.setStorageSync('player_state', state)` 同步写入 |
| 版本迁移 | 读取时检查 `saveVersion`,低于当前版本则执行迁移函数 |
| 数据上限 | wx.Storage 上限 10MB预估存档 < 50KB |