《ShelfMatch》(暂定名)柜子三消 · 系统设计案 v1.1
作者:叶明轩 | 日期:2026-07 | 状态:v1.1 核心验证版(与可玩 Demo 实物一致)
配套材料:《GoodsMatch 产品拆解案》(同品类拆解)、可玩 Demo(Godot)
更新记录
- v1.0(2026-07-22):初版,八章结构
- v1.1(2026-07-23):道具系统从"v2 预留"转为实装(重排/加时);新增暂停系统;主界面实装;关卡生成器已按反向生成法(3.7)在 Demo 中实现
1. 设计背景与目标
1.1 项目定位
单人独立开发的求职作品集 Demo,品类为 Sort Match / 柜子三消(海外休闲游戏热门品类)。玩家在多个人造柜子之间挪动物品,凑齐三个相同物品消除,在倒计时内清空全部物品。
1.2 设计目标
- 玩法目标:验证"空间管理 + 时间压力"这一核心循环的乐趣是否成立
- 作品集目标:展示系统设计、数值设计、引擎落地三项能力,与既有《GoodsMatch 拆解案》形成"拆解 → 复刻 → 原创设计"的完整证据链
1.3 品类参考与差异化论证
直接参考对象为 GoodsMatch 等海外头部 Sort Match 产品。该品类主流做法为步数制或无压模式,本 Demo 选择限时挑战制作为主模式,差异化论证如下:
- 同类产品深层物品多为完全遮挡,核心挑战是"记忆";本作深层物品半透明剪影可见,全部信息对玩家开放,核心挑战从"记忆"转移为"单位时间内的规划质量"
- 正因为信息全可见,时间压力不会制造"不公平感"——玩家失败的原因是"规划得慢/错",而非"运气差没翻到",挫败感可控
- 时间压力把空间管理的策略深度转化为即时紧张感,符合休闲玩家"短局高频刺激"的体验诉求
- 配套"消除返还时间"机制作为压力缓冲阀(见 3.6),给玩家"操作好就能续命"的掌控感
2. 系统概述与核心循环
一句话概述:在多个三格柜子之间挪动物品,凑齐三个相同即消除,倒计时内清空全部物品即胜利。
核心循环:
观察全局(含深层剪影,信息全开放)
→ 规划挪动序列(先消谁、腾哪个柜)
→ 执行挪动(点击-放置)
→ 凑齐三同,触发消除(+分数 +返还时间)
→ 深层物品显露,棋盘信息更新
→ 基于新信息重新规划
→ 循环,直至清空(胜利)或超时(失败)
体验支柱:
- 策略感:每一步挪动都在"凑对"与"腾空间"之间做权衡
- 紧张感:倒计时持续施压,消除续命制造"救回来"的爽点
- 掌控感:信息全可见,胜负归因于玩家自身决策质量
3. 详细规则
3.1 棋盘构成
- 棋盘由 C 个柜子组成(v1 范围 4~7 个),每个柜子 3 个槽位
- 槽位分表层/中层/深层三层;物品自上而下堆叠,只有最表层物品可操作
- 物品具有"种类"属性(v1 共 6 种,如:苹果、橙子、葡萄、西瓜、草莓、柠檬),每种物品在单关中数量恒为 3 的倍数
3.2 操作规则
| 规则编号 |
规则内容 |
| R-01 |
点击某柜子的最表层物品 → 该物品进入"选中态"(高亮上浮) |
| R-02 |
选中态下点击有空位的目标柜子 → 物品移动至该柜最浅空位 |
| R-03 |
只能选中各柜最表层物品;中层/深层物品不可选(置灰) |
| R-04 |
目标柜子已满(3 件)时不可放入,点击无效并给出轻震反馈 |
| R-05 |
选中态下点击空白处或再次点击该物品 → 取消选中 |
| R-06 |
每次移动计为 1 步,步数记录用于结算展示与数据分析 |
3.3 消除规则
| 规则编号 |
规则内容 |
| R-07 |
同一柜子内 3 个物品种类相同 → 立即触发消除 |
| R-08 |
消除结算:+100 分,并按 3.6 返还时间 |
| R-09 |
消除后该柜子变为空柜,可作为周转空间使用 |
| R-10 |
消除判定在物品落位动画完成后触发,同一时间最多触发 1 组消除(本作无连锁消除设计,理由见 3.10 设计说明①) |
3.4 深层显露规则
| 规则编号 |
规则内容 |
| R-11 |
表层物品被移走或随消除移除后,下一层物品立即显露 |
| R-12 |
未显露物品以 30% 透明度 + 去色剪影呈现,种类可辨认,不可交互 |
| R-13 |
显露过程播放 0.2s 上浮动画,作为信息更新的视觉提示 |
3.5 胜负判定
| 规则编号 |
规则内容 |
| R-14 |
棋盘上所有物品被清空 → 立即胜利,进入结算(按剩余时间评星) |
| R-15 |
倒计时归零且仍有物品未清空 → 失败,弹出重试界面 |
| R-16 |
星级评定:剩余时间 ≥ 初始时间 40% → ★★★;≥ 15% → ★★;> 0 → ★ |
3.6 时间规则
| 规则编号 |
规则内容 |
| R-17 |
每关初始时间 T 由关卡配置决定(见第 4 章数值表) |
| R-18 |
每次成功消除返还 +5 秒(不超过初始时间上限,防止时间无限膨胀) |
| R-19 |
倒计时 ≤10 秒进入警戒态:数字变红、每秒滴答音效 |
| R-20 |
失败无额外惩罚,可立即重开本关 |
3.7 关卡生成规则(可解性保证)
| 规则编号 |
规则内容 |
| R-21 |
采用反向生成法:先构造"已完成状态"(所有物品三三成组放在柜中),再按合法移动规则倒推随机打乱 K 步,得到初始布局 |
| R-22 |
由于打乱过程只使用合法移动,生成的布局必然存在至少一条解法路径(即倒推路径本身),从算法上保证无死局 |
| R-23 |
打乱步数 K 与分散度参数挂钩:K 越大,同类物品越分散,难度越高 |
| R-24 |
生成后校验:任一种类物品数量非 3 的倍数 → 判定非法布局,丢弃重新生成 |
3.8 道具系统(v1.1 实装)
| 规则编号 |
规则内容 |
| R-25 |
「重排」道具:将当前棋盘所有剩余物品重新随机分配(种类与数量不变);重排后不允许出现已成组的柜子;每关限用 2 次 |
| R-26 |
「加时」道具:倒计时 +10 秒;与消除返还共用同一上限(封顶 = 初始时间 T,见 R-18);每关限用 2 次 |
| R-27 |
两个道具的使用次数在每关开始时重置为 2 次;次数用尽后按钮置灰不可点 |
| R-28 |
道具通过关卡内底部道具栏使用,按钮实时显示剩余次数 |
设计说明:反向生成法(3.7)已从算法上保证关卡必可解,因此「重排」的定位不是防死局的兜底,而是给"思路绕晕了"的玩家一次重新整理棋盘的机会;「加时」则是限时模式下的压力调节阀,给"差一口气"的玩家容错。两者共同构成本作的"挫败感保险",且通过次数限制防止依赖。
3.9 暂停系统(v1.1 实装)
| 规则编号 |
规则内容 |
| R-29 |
点击暂停按钮 → 游戏暂停:倒计时停止、棋盘锁定输入,弹出暂停菜单 |
| R-30 |
暂停菜单三选项:①继续游戏(恢复原局面)②重新开始(重置本关:倒计时、道具次数回满,布局按 3.7 重新生成,与上一局不同)③返回主界面 |
| R-31 |
暂停期间唯一可交互对象为暂停菜单;玩家切出/最小化游戏时自动进入暂停态(衔接 E-07) |
3.10 设计说明(面试备答)
① 为什么不做连锁消除:本作策略点是"规划挪动序列",连锁消除会把乐趣稀释成"碰运气看连锁",与空间管理的核心定位冲突,主动舍弃。
② 为什么空柜不限制使用:空柜周转是本品类策略的本质(类似汉诺塔的辅助柱),限制周转等于砍掉策略深度;时间制已经提供了全局约束,无需再限制步数。
③ 为什么剪影可见而非全遮挡:见 1.3 差异化论证——把挑战从记忆转移到规划质量。
④ 为什么加时道具与消除返还共用上限:v1.1 曾考虑让道具突破上限以强化"破局感",最终选择统一封顶——保持"初始时间 T 就是本关资源总量"这一数值直觉的唯一性,避免玩家对时间预算产生两套认知;道具的价值体现在"容错机会"而非"额外资源"。
4. 数值模型
4.1 难度变量定义
| 变量 |
符号 |
对难度的影响 |
| 柜子数量 |
C |
越多周转空间越大,难度越低;但物品总量也越多 |
| 物品种类数 |
K |
种类越多,凑对路径越长,难度越高 |
| 堆叠层数 |
L |
层数越深,可操作物品比例越低,规划链越长 |
| 分散度 |
D |
由打乱步数控制,同类越分散,所需挪动步数越多 |
4.2 时间预算公式
初始时间 T = 基础操作时间 + 物品总数 N × 单件决策时间 s − 分散度修正
实测校准:v1 按 s = 3 秒/件估算,上线后按第 8 章实测数据回归修正
消除返还 b = 5 秒/次(返还上限 = T)
4.3 关卡数值表(v1 共 5 关)
| 关卡 |
柜子 C |
种类 K |
层数 L |
物品总数 |
初始时间 T |
设计目的 |
目标通过率 |
| L1 |
4 |
3 |
1 |
12 |
90s |
教学关:学会挪动与三消 |
≥90% |
| L2 |
5 |
4 |
2 |
24 |
100s |
引入堆叠与剪影信息 |
≥80% |
| L3 |
6 |
5 |
2 |
30 |
110s |
规划链变长,学会腾柜 |
≥65% |
| L4 |
6 |
6 |
3 |
36(+空柜) |
120s |
深堆叠,多层规划 |
≥50% |
| L5 |
7 |
6 |
3 |
36(高分散) |
130s |
综合考验,满星挑战 |
40~60% |
注:L4/L5 配置 1 个初始空柜作为周转空间,柜数与物品数解耦——这是难度微调的关键手段。
4.4 计分规则
单次消除 +100 分;通关结算分 = 消除分 + 剩余时间 × 10。分数仅用于自我挑战与展示,不与解锁挂钩(v1 无外围经济)。
4.5 数值验证方法
- 开发者自测:每关连续通关 10 次,记录剩余时间分布,中位数应落在 ★★ 区间
- 小范围试玩:3~5 名朋友,记录第 8 章埋点数据,按目标通过率调 T 与分散度
- 迭代方向:失败时剩余物品 >30% → 时间不足或分散度过高;大量玩家卡同一点 → 检查该关布局生成参数
4.6 道具数值(v1.1 新增)
| 道具 |
效果 |
使用次数 |
共享上限 |
| 重排 |
剩余物品重新随机分配 |
2 次/关,过关重置 |
— |
| 加时 |
倒计时 +10 秒 |
2 次/关,过关重置 |
与消除返还共用,封顶 = T |
调参观察点(衔接第 8 章):道具使用率过低(<20% 玩家使用)说明数值感知弱或 UI 引导不足;重排使用率显著高于加时 → 关卡布局过绕;加时使用率显著高于重排 → 时间预算偏紧。
5. 交互与 UI 说明
5.1 界面结构
- 主界面(v1.1 实装):游戏标题 + 开始游戏按钮
- 关卡内:顶部 = 倒计时条(总宽=初始时间,随时间缩短变色)+ 关卡号 + 目标提示"清空全部物品";中部 = 柜子区(横向排布,每柜 3 槽位纵向堆叠);底部 = 道具栏(重排 / 加时,显示剩余次数)+ 暂停按钮
- 暂停菜单(v1.1 实装):继续游戏 / 重新开始 / 返回主界面
- 结算弹窗:胜利 = 星级 + 得分 + 用时 + [重玩 / 下一关];失败 = [重试 / 返回主界面]
5.2 关键交互反馈
| 场景 |
反馈 |
| 选中物品 |
上浮 10px + 高亮描边 |
| 可放置柜子 |
槽位虚线框亮起 |
| 已满柜子 |
置灰,点击时轻震 + 红闪 |
| 三同消除 |
物品缩放消失动画 + 飘分"+100" + 飘时间"+5s" |
| 深层显露 |
0.2s 上浮 + 剪影转实体渐变 |
| ≤10 秒警戒 |
倒计时变红 + 滴答音 |
| 使用加时道具 |
倒计时数字跳变 + 飘字"+10s"(v1.1) |
| 使用重排道具 |
剩余物品播放重新落位动画(v1.1) |
| 道具次数用尽 |
按钮置灰,点击无效(v1.1) |
6. 边界情况处理
| 编号 |
边界场景 |
处理方案 |
| E-01 |
消除动画播放期间玩家继续点击 |
锁输入 0.3s,防止连点导致状态错乱 |
| E-02 |
选中态下点击自己所在柜子 |
视为取消选中 |
| E-03 |
玩家反复横跳"绕圈"不消除 |
不限制,时间压力自然约束;属合法策略行为 |
| E-04 |
生成布局含非 3 倍数种类 |
生成器校验丢弃(R-24),玩家不可见 |
| E-05 |
最后一次消除与倒计时归零同帧 |
消除优先,判定胜利(对玩家有利原则) |
| E-06 |
返还时间使倒计时超过初始上限 |
封顶 = 初始时间 T(R-18) |
| E-07 |
玩家中途切出/最小化 |
自动进入暂停态,回来时呈现暂停菜单(衔接 R-31) |
| E-08 |
奇数层柜子(如只放1件的柜) |
允许存在,三消判定照常(凑满3件才触发) |
| E-09 |
暂停菜单弹出瞬间有动画在播 |
动画照常播完但不结算新输入,恢复后状态一致(v1.1) |
| E-10 |
暂停中点"重新开始" |
倒计时与道具次数回满,布局重新生成(反向生成重跑,与上局不同)(v1.1) |
| E-11 |
重排后剩余物品无法避免成组 |
重排逻辑内置校验:出现已成组柜子则重新随机,直到满足(与 R-25 一致)(v1.1) |
7. 配置表结构
7.1 关卡配置表 level_config
| 字段 |
类型 |
含义 |
示例 |
| level_id |
int |
关卡 ID |
1 |
| cabinet_count |
int |
柜子总数(含空柜) |
5 |
| item_types |
array |
本关启用物品种类 |
[apple, orange, grape, melon] |
| layer_depth |
int |
最大堆叠层数 |
2 |
| shuffle_steps |
int |
反向生成打乱步数(分散度) |
40 |
| empty_cabinets |
int |
初始空柜数 |
1 |
| init_time |
float |
初始时间(秒) |
100 |
| bonus_time |
float |
单次消除返还(秒) |
5 |
| star_thresholds |
array |
星级剩余时间比例 |
[0.4, 0.15] |
| items_enabled |
bool |
道具开关(v1.1 已开启) |
true |
| prop_reshuffle_count |
int |
重排道具每关次数(v1.1) |
2 |
| prop_addtime_count |
int |
加时道具每关次数(v1.1) |
2 |
| prop_addtime_value |
float |
加时道具秒数(v1.1) |
10 |
7.2 物品配置表 item_config
| 字段 |
类型 |
含义 |
| item_id |
string |
物品 ID |
| name |
string |
显示名 |
| sprite |
string |
贴图资源路径 |
| silhouette_tint |
color |
剪影颜色(默认同贴图去色) |
设计要点:新增一个关卡 = 在 level_config 加一行配置 + 零代码改动。这正是系统策划"配置驱动"思想的落地证明。
8. 埋点与验证指标
8.1 本地数据记录(v1 用本地文件实现)
| 事件 |
记录字段 |
用途 |
| 关卡开始 |
level_id, 时间戳 |
计算尝试次数 |
| 每次移动 |
level_id, 步序号, 耗时 |
玩家决策速度分布 |
| 消除触发 |
level_id, 剩余时间 |
消除节奏分析 |
| 胜利 |
level_id, 剩余时间, 总步数 |
通过率与星级分布 |
| 失败 |
level_id, 剩余物品数, 已用步数 |
定位卡点:时间不足 or 布局过难 |
| 道具使用(v1.1) |
level_id, 道具类型, 使用时剩余时间 |
道具使用率与使用时机分析 |
8.2 验证指标与调参决策
| 指标 |
目标值 |
不达标时的动作 |
| L1 首通率 |
≥90% |
降分散度 / 加 T |
| L5 通过率 |
40~60% |
偏离则调 shuffle_steps |
| 失败时平均剩余物品 |
≤30% |
>30% 说明时间预算不足 |
| 平均每步耗时 |
1.5~3s |
>3s 说明剪影信息不清或布局太绕 |
9. 开发计划(附录)
- 引擎:Godot 4.x / GDScript,v1 共 5 关,预计 1~2 周
- 里程碑:M1 核心挪动+三消+显露(3天)→ M2 倒计时+胜负+结算(2天)→ M3 反向生成器+5关配置(3天)→ M4 数值调优+埋点(2天)→ M5 录演示视频+打磨(2天)
- 演示产出:1 分钟玩法视频(配设计思路字幕)+ 本文档 + 试玩包
本文档遵循"程序看完不用问就能开发"的标准撰写,所有规则均标注编号,供实现与面试答辩引用。