关于 puzzle
面向网格与棋盘解谜游戏的组合式技能指南,帮助开发者建模棋盘状态、处理规则结算和关卡进程。重点说明确定性结算与完整撤销,以减少谜题逻辑错误。
主要功能
- 01建立独立于画面的棋盘模型
- 02验证并应用玩家操作
- 03持续结算匹配、推块等规则
- 04处理连锁、目标与计分
- 05实现完整撤销和关卡推进
适用场景
- 01设计三消或滑块解谜玩法
- 02实现推箱子与规则棋盘
- 03加入连锁结算和撤销功能
- 04制作可解关卡及难度进程
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ gamedev-skills/ awesome-gamedev-agent-skills --skill puzzle安装后在 Claude Code 中输入/puzzle确认已加载。
附带文件references/board-and-resolution.md
详细介绍
谜题
网格/棋盘谜题游戏指南——棋盘模型、移动输入、规则结算 (匹配、推动、逻辑)、计分、撤销和关卡推进。这是一项组合式 技能:它对棋盘状态和规则进行建模,并通过 tilemap/UI 呈现。它不会 重新讲解 tilemap;它定义了结算循环和正确性规则(状态干净、 结算确定、可撤销),以确保谜题公平且没有漏洞。
适用场景
- 当游戏采用离散棋盘,玩家通过移动改变棋盘,且棋盘会按照规则结算时使用:三消/方块匹配、推箱子/推块、滑块谜题、逻辑网格。
- 设计匹配/连锁结算、撤销、关卡推进或可解性时使用。
不适用场景: 带永久死亡机制的实时网格动作游戏 → roguelike。卡牌区域/回合 →
card-game。基于物理的“解谜平台游戏” → platformer + physics-tuning。对于 tile
渲染,使用 godot-tilemap / unity-tilemap-2d。
核心循环
读取棋盘 → 规划移动 → 执行移动 → 棋盘按照规则结算(匹配、推动、 下落、填充、连锁)→ 查看目标进度 → 重复,直至解谜成功/失败。乐趣在于规划;引擎的职责是确定性地结算每次移动,并 清晰地呈现结果。
必备系统
- 棋盘模型 — 由存放棋子的格子组成;它是唯一事实来源(逻辑,而非视觉)。
- 移动输入 — 交换、推动、拖动、旋转或放置;应用前验证是否合法。
- 规则结算 — 检测并应用该类型游戏的规则(匹配、推动、逻辑),直到状态稳定。
- 连锁/连击 — 结算改变棋盘时,重复结算,直到不再有变化。
- 目标 + 计分 — 胜负条件(得分、清除全部、抵达目标);步数/时间限制。
- 撤销 — 精确还原上一步移动(及其结算);对需要思考的谜题至关重要。
- 关卡推进 +(通常还包括)生成 — 手工制作或生成可解的棋盘。
- 反馈(“爽感”) — 为匹配、下落和连锁提供清晰、令人满足的动画/音效。
设计参数
| 参数 | 效果 | 备注 |
|---|---|---|
| 网格大小/形状 | 复杂度 | 方形是标准形式;六边形/不规则形状会改变体验。 |
| 匹配/推动规则 | 游戏类型特征 | 三连、形状匹配、推入目标等。 |
| 连锁计分 | 奖励深度 | 连锁越长,回报呈指数级增长。 |
| 步数/时间限制 | 压迫感 | 步数限制偏解谜;时间限制偏街机。 |
| 难度曲线 | 学习过程 | 一次引入一种机制。 |
| 撤销深度 | 容错度 | 撤销一步还是保留完整历史。 |
| 可解性保证 | 公平性 | 生成的棋盘必须可解。 |
| 死锁处理 | 避免死局 | 检测是否无步可走;重新洗牌或结束(参见参考资料)。 |
模式
1. 棋盘模型 + 匹配检测(逻辑与视觉分离)
# Pseudocode. The board is the truth; rendering reads from it. (0,0) top-left, y grows down.
board = [[piece_or_empty for _ in range(W)] for _ in range(H)]
def find_matches(board):
matched = set()
for y in range(H): # horizontal runs of >= 3 equal pieces
run = 1
for x in range(1, W):
if board[y][x] and board[y][x] == board[y][x-1]: run += 1
else:
if run >= 3: matched |= {(y, k) for k in range(x-run, x)}
run = 1
if run >= 3: matched |= {(y, k) for k in range(W-run, W)}
# ... repeat the same scan vertically (columns) ...
return matched
2. 结算 → 下落 → 补充 → 连锁(重复直到稳定)
# Pseudocode. One player move can trigger a chain; loop until the board stops changing.
def resolve(board):
chain = 0
while True:
matches = find_matches(board)
if not matches: break # stable: resolution complete
chain += 1
score += score_for(matches, chain) # later chain steps score more (see refs)
clear(board, matches) # remove matched pieces
apply_gravity(board) # pieces fall into the gaps
refill(board, rng) # spawn new pieces at the top (seeded RNG)
return chain
3. 通过状态快照或命令实现撤销
# Pseudocode. Snapshot before each move; undo restores it exactly (board + score + counters).
def make_move(move):
history.append(snapshot(board, score, moves_left)) # push BEFORE applying
apply(move); resolve(board); moves_left -= 1
def undo():
if history:
board, score, moves_left = history.pop() # exact revert, including resolution
大型棋盘优先采用命令模式(存储移动及足以还原移动的信息),而不是完整 快照,以节省内存;小型棋盘使用快照最简单,也完全够用。
常见陷阱 / 失败模式
- 逻辑与视觉混杂 → 动画会与状态不同步,导致错误。棋盘模型是唯一真实来源;视图只负责渲染。
- 只解析一次 → 会遗漏连锁反应。循环解析,直到棋盘稳定(模式 2)。
- 撤销时未恢复所有内容 → 分数、步数和随机状态会出现偏差。对所有状态进行快照,或确保操作可完全逆转。
- 补充方块时使用未设种子的 RNG → 无法复现关卡,也无法实现确定性的撤销或每日谜题。请为其设定种子。
- 生成的棋盘无法解出 → 会造成不公平的死局。生成后验证,或从已知解法反向生成(参考资料)。
- 未检测死锁(match-3)→ 棋盘没有有效步数时会软锁。检测“无步可走”的情况,然后打乱棋盘或结束关卡(参考资料)。
- 难度陡增 → 一次加入太多机制。每关先讲解一种机制,再将机制组合起来。
- 动画进行中仍可解析并接受输入 → 可能导致重复移动或状态损坏。棋盘稳定前锁定输入。
组合(使用这些技能构建)
- 棋盘渲染: 使用
godot-tilemap/unity-tilemap-2d构建网格;使用godot-ui-control构建 HUD、分数和菜单。 - 关卡: 使用
level-design设计手工制作的谜题并控制难度节奏;使用procedural-gen生成可解棋盘。 - 持久化: 使用
save-systems保存关卡进度、高分和带种子的每日谜题。 - 爽快感: 使用
game-feel制作匹配 / 连锁消除的弹出效果、屏幕震动和连锁反馈;使用引擎动画 /Tween技能实现交换、下落和清除效果;使用audio-design制作匹配和连锁提示音。 - 脚本: 使用
godot-gdscript/unity-csharp-scripting编写解析循环和规则。
参考资料
- 关于 match-3 检测 / 重力 / 补充 / 连锁反应的细节、死锁检测与重新打乱、sokoban / 基于规则的谜题、撤销策略、可解关卡生成和计分,请阅读
references/board-and-resolution.md。
评论
支持 Markdown