Files
gplan-2/design/gdd/a2-minesweeper-rules.md
T
2026-09-14 18:18:49 +08:00

68 KiB
Raw Blame History

A2 排雷玩法规则(Minesweeper Rules)

状态:Approved · 版本:v2.0 · 2026-09-14 一句话:持有 A1 棋盘、执行全部棋盘面规则,把事实以恰好三种事件外发——全项目事件源头。 推演件:design/gdd/analysis/a2-minesweeper-rules.md(本文件只收结论,理由在那里) 承载支柱:P1 主 · P4 · P3 · P2(机制承诺论证见推演件) 层级:Layer 2 Core · Milestone MVP · 设计顺序第 6 位(上游 A1/A3/A4/D2 均 Approved)

设计目的

A2 是扫雷层的玩法规则引擎与全项目事件源头:接收玩家动作意图(挖/插旗/拔旗/移动/停手),执行全部棋盘面规则,把发生的事实以恰好三种事件外发;没有 A2,A1 的板、A3 的预算、B1 的结算都失去发生地。

  1. P1"我算对了":数字恒真透传(雾格只是不显示,数据层永不说谎)、连锁传播与生成端度量同构、每个拒绝携带可辨原因——系统回应的每一格都与玩家推演一致。
  2. P4"走过的伤疤":小人从出生安全区向雷图边缘探索,点击已探明区瞬移穿行、在未开边界挖掘,已引爆雷格可通行——雷不是探索终点,是走过的伤疤。
  3. P3"赌与算都可见":挖开雷格是事实上报而非死亡,旗是零信息收益的纯粹承诺(雾内旗恒不中也被诚实判定)——A2 不裁决得失,只保证事实流真实。
  4. P2"结算可归因":结算明细每行归因(安全格增益/标中旗削弱/雷→伏击/清图奖励)都溯源到 A2 事件流——reward_eligible / channel / hit 是归因的字段落点。

反向护栏:任何"规则层说谎"形态——数字失真、连锁静默变异分支、拒绝原因含混——默认砍掉;呈现层的隐藏(雾格无字)必须以数据层恒真为前提。

系统范围

负责:

  • 全部棋盘面规则:小人控制 · 8 向相邻判定 · 连锁展开 flood fill · 数字提示 · 旗子棋盘状态 · 清图判定
  • 三事件发射面(cell_revealed / flag_judged / round_end 棋盘路径)与"先旗后结束"事件序契约
  • 批次结算入口 settle_batch 与语义序仲裁;install 四条结构不变式校验与初始展开执行
  • F1–F4 四条行为契约(清图谓词 / 连锁闭包 / 初始展开域 / 批次仲裁)

不负责:

  • 资源账本(A3——判棋盘面后调 try_spend,禁自行扣减)· 轮次编排(B1——轮次节拍权威在 A3/B1,A2 以 A3 相位观测量为闸、不自持轮次状态)
  • 奖励内容(B4)· 棋盘生成(A1)· 变异规则(A4——只透传生成期快照标记)· 呈现(D1)
  • 数值字面量 / 表读取 / RNG / UI 与输入设备依赖(规则 1 四零禁令)

核心循环

装板与挖掘期事件发射主链:

install_board(board)                  受理域 = Idle/Waiting + Active·仅弃图刷新路径
  │ ① 持有产物快照(生成期变异快照,非活引用——抗表重载)
  │ ② 校验结构不变式 ①–④ ── 违例 → 拒绝 + board_invalid + error 诊断(fail-fast)
  │ ③ 初始展开 O₀ = R₀ → cell_revealed ×|R₀|,channel=initial,规范序
  │ ④ 小人落位 B3 中心格
  ▼
Installed·Active ── 挖掘期:玩家意图经 D1 → settle_batch(intents)(A2 唯一结算入口)
  │ dig    棋盘面判定 → A3 try_spend → 开格 + 连锁 → cell_revealed ×(1+chain_size)
  │ flag   try_spend → 棋盘旗标记(插/拔零事件外发,反馈经调用返回值命令式驱动)
  │ move   免费瞬移(不经账本,零事件;compute_move_path 供 D1 路径预览)
  │ stop   先发 flag_judged ×N → 委托 A3.request_stop()
  ▼
轮次结束事务(A3 仲裁:cleared > stopped > ap_exhausted——首次为真处定胜者,余意图 voided)
  │ flag_judged ×N(判定基线 = 事务开始旗位,行主序;先于 round_end——事件序契约)
  │ 棋盘路径:A2 读 last_round_end 恰一次 → round_end{ap_exhausted/cleared} 外发
  │ stopped 路径:A3 直发 round_end{stopped}(双发射源——A2 禁双发)
  ▼
Installed·Frozen ── Waiting:全态冻结;编排边界受理 install_board(换新图)/ retire_board
出口 触发 动作 RAP
cleared dig 胜 ∧ 结算时点 clears_map=true A2 外发 (cleared, new_board) 恰一条(棋盘路径) +0(剩余 AP 清零不入 RAP——A3 Rule 5)
stopped C_stop 胜 先发 flag_judged ×N → 委托 A3.request_stop() → round_end(stopped, same_board) 由 A3 直发 += remaining_ap(1:1)
ap_exhausted 耗尽 AP 的 C_other A2 外发 (ap_exhausted, same_board) 恰一条 +0(不变式 remaining=0)
继续 不结束轮次 无 round_end,继续下一意图 —

事件面与枚举

术语表(白话首定义集中于此;已登记 registry 术语条目)

术语 白话定义
双包含回验 A1 与 A2 互检两条包含关系——臂① A2 实际初始展开域 ⊆ A1 生成期排除域(开局不触雷不触变异);臂② A1 求解器初始可见态 ⊆ A2 实际初始展开域(A1 度量不吃亏)。恰等 = 两集合逐格相等
零特判 A2 代码不为变异写任何 if 分支——变异只是随格携带的只读标记透传,行为差异全部由生成端约束保证
规范序 事件发射的固定顺序(触发格 BFS、8 邻行主序)——同输入必得同顺序,禁实现自选遍历序
语义序仲裁 批次内不按玩家提交顺序、而按"清图挖 > 停手 > 其余"的固定类别顺序结算
双发射源 round_end 有两个合法发射者——棋盘路径(ap_exhausted/cleared)由 A2 发、停手路径(stopped)由 A3 直发,payload 同构
三源拒绝 拒绝原因来自三个互异来源——棋盘面(board_face)/ 资源面(resource_face,AP 不足)/ 相位(phase,非 Active)
单意图批 / 便捷形 settle_batch 只装一个意图时 ≡ 直接调 try_dig 等便捷 API,行为逐项相同
voided 轮次结束后未获执行的批次意图——零棋盘效果、零扣费、零事件,区别于非法拒绝

发言面规则

规则:

  1. (规则 1)A2 引擎吃两样输入——A1 产出的棋盘、玩家提交的意图序列,吐一样输出——三种事件组成的事实流;同棋盘同意图序列必得逐位相同的事件流,为此守四零禁令:零随机(不掷骰子、不自建随机源)、零数值字面量(价格读账本、板面读生成产物、变异随格快照携带)、零表读取(参数全经上游)、零界面与输入设备依赖(唯一通道是意图对象,--headless --script 完整可驱动)。
  2. (规则 2)A2 对外只报三种事实——每挖开一格报一次 cell_revealed,轮次结束事务开始时对每面在场旗报一条 flag_judged(判中/判空),轮次结束报一次 round_end(停手路径由 A3 直发,A2 禁双发);多一个事件、少一个事件都是接口漂移;同一次收轮先把旗判定全部报完再报轮次结束,所有收轮路径统一(停手路径一样:先报旗判定、再委托收轮,停手不改旗位)。

举证:确定性、零字面量与 headless 可驱动依据 D2 Rule 5/1/7;静态扫描 AC-22、回放断言 AC-19/AC-20;payload 验收 AC-4/6/7/8/9,事件序契约 AC-9/AC-10;下游结算触发不依赖事件到达序(B1 强制项①)。

三事件回边(发射面封闭——增删事件 = 接口漂移修订)

事件 字段 发射点 语义要点
cell_revealed cell · kind ∈ {safe, mine} · digit · variant_ids · channel ∈ {initial, chain, dig} · reward_eligible 开格事实 digit 恒真透传(仅 kind=safe 携带;雾格携带真实数字、呈现隐藏归 D1、判定数据源 = variant_ids);reward_eligible:initial 恒 false / chain·dig ∧ safe 恒 true(含链开雾格)/ kind=mine 恒 false;发射序 = 规范序(初始/连锁 = 触发格 BFS、8 邻行主序固定序)
flag_judged cell · hit 轮末统一判定批 每轮次结束事务开始时对判定基线旗位逐旗一条(基线 = 轮次结束事务开始时的旗位;枚举序 = 行主序扫描,确定性)
round_end path_tag ∈ {ap_exhausted, cleared, stopped} · continuation_hint ∈ {same_board, new_board} 棋盘路径由 A2 外发 核心字段逐字段取自 A3 last_round_end(读取权为接口契约),与 A3 stopped 路径 payload 同构;stopped 路径由 A3 直发、A2 禁双发

字段值封闭枚举

字段 值域 语义
kind safe · mine 开格种类;kind=mine 事件无 digit 字段
channel initial · chain · dig initial=初始展开(恒无奖励)· chain=连锁 · dig=单格
reward_eligible bool initial 恒 false;chain/dig ∧ kind=safe 恒 true(含链开雾格);kind=mine 恒 false
path_tag ap_exhausted · cleared · stopped 棋盘路径仅前两者由 A2 外发;stopped 由 A3 直发(双发射源)
continuation_hint same_board · new_board cleared → new_board;其余 same_board
hit bool [cell ∈ M];被拔的旗不判;雾内旗恒 false(零特判)
intent dig · flag_place · flag_pull · move · stop stop 执行 = 批事务内委托 A3.request_stop
reject_reason board_face · resource_face · phase · board_invalid 三源拒绝 + 装板违例

三源拒绝与 board_face 拒绝目录

源 判定 承载
board_face 挖:目标非 8 向相邻 / 目标已开 / 目标有旗(须先拔旗)· 插旗:非相邻 / 已开 / 已有旗 · 拔旗:非相邻 / 无旗 · 移动:目标未开 / 无 BFS 路径;目录外输入(越界坐标等)= out_of_catalog sub_reason 封闭枚举(见下表)
resource_face A3 try_spend 返回 false(AP 不足) reject_reason=resource_face
phase A3 非 Active 或无板态 reject_reason=phase

sub_reason(仅 board_face 携带,封闭枚举——"须先拔旗"与"非相邻"玩家语义截然不同,必须数据可分;批后修改 = 接口漂移)

值 语义 适用动作
not_adjacent 目标非 8 向相邻 挖 / 插旗 / 拔旗
target_revealed 目标已开 挖 / 插旗
target_concealed 目标未开 移动
flag_present 目标已有旗(挖 = 须先拔旗;插 = 已有旗) 挖 / 插旗
flag_absent 目标无旗 拔旗
no_path 经已开区无 BFS 路径 移动
out_of_catalog 目录外输入(越界坐标等)——debug 级诊断,不与玩家语义混桶、禁静默吞 全部

装板违例诊断类别(board_invalid 携带,封闭枚举)

值 对应不变式
inv1_mine_in_spawn ① B3 内无雷
inv2a_variant_in_spawn ② B3 内无变异格
inv2b_variant_in_r0 ② R₀ 内无变异格("R₀ 触雾"归此——②的 R₀ 子情形)
inv3_digit_invariant ③ 数字恒真
inv4_r0_equals_s ④ R₀ ≠ S

对外 API 面(provisional,封闭枚举——新增入口 = 接口漂移)

API 签名 语义
install_board install_board(board) 装板 + 校验四不变式 + 初始展开
settle_batch settle_batch(intents) A2 唯一结算入口(D1 唯一提交入口;单意图批 = 平凡形)
try_dig / try_flag_place / try_flag_pull / try_move try_*(cell) 便捷形 ≡ 对应单意图批,行为逐项相同
compute_move_path compute_move_path(cell) 只读——BFS 路径(8 邻行主序);不可达格返回空
retire_board retire_board() 板实例与变异快照消亡(NoBoard 下幂等受理)
ActionOutcome {accepted, outcome, reject_reason, sub_reason} outcome ∈ {executed, voided, rejected};sub_reason 仅 board_face 携带

棋盘状态·装板与初始展开

板态

板态 进入条件 行为/出口
NoBoard 冷启动 / retire_board() 后 全部动作 API 拒绝(phase 源);install_board 受理(Idle/Waiting);retire_board 幂等受理
Installed·Active 装板完成 ∧ A3 phase=Active 接受全部动作意图;dig/旗经 try_spend,移动免费直达;弃图刷新 = retire + install(B1 refresh_board 编排,装板后回本板态);轮次结束事务 → Installed·Frozen
Installed·Frozen A3 phase=Waiting(三路径任一收轮) 全部动作意图拒绝(phase 源);棋盘/旗/小人全态冻结;install_board(换新图)/retire_board 受理(编排边界)
Retired retire_board() 或战斗终结后编排调用 旗/小人/事件分段终结(事件捕获以 install 为段界)——板实例与变异快照一同消亡

输入 × 相位 × 板态矩阵(动作意图 ∈ {dig, flag_place, flag_pull, move, stop};编排调用 ∈ {install_board, retire_board})

输入 NoBoard Installed·Active Installed·Frozen
动作意图(含 stop) 拒绝(phase) 受理(经批次结算器) 拒绝(phase;A3 侧按同一致相位矩阵同判——两侧判定一致)
install_board 受理(Idle/Waiting) 受理(仅弃图刷新路径——B1 refresh_board 编排;非刷新路径仍拒绝——防轮内换板) 受理(换新图 = 全态重置 + 初始展开重放)
retire_board 幂等受理 拒绝(板态) 受理

装板与初始展开规则

规则:

  1. (规则 3)install_board 在 Idle/Waiting 相位受理,挖掘进行中只有"弃图刷新"这一条编排路径例外(以账本扣费成功为前提),其余在局内装板一律拒绝;受理后 A2 持有生成期变异快照(非数据表活引用,热重载改表不影响行为),当场验四条结构不变式,任一不过即拒绝装板并给出 board_invalid 错误级诊断,绝不带病运行;验过才执行初始展开、把小人放到出生 3×3 中心格。
  2. (规则 4)装板成功的那一次事务里,A2 免费翻开出生 3×3 加上与之连通的空地闭包(每次装板执行一次、跨轮不重放);这片初始展开域与 A1 生成器求解时的初始视野逐格相等——不多开不少开、不外扩一圈"安全边距";翻开守四条铁律:免费(不扣行动点、账本零写入)、计入清图进度(剩余安全格从这片开完后起算)、无奖励(这些格不发奖励、下游不得入库)、永不触雷触雾(出生区无雷 + 闭包只走安全格,在板上即可独立证明)。

举证:四条不变式与诊断类别见下表,受理域见上矩阵;"无奖励格不得入库"下游义务见 B1 强制项②;初始展开定义落点承接 A3 EC5 委派;恰等与双包含证明见 F3 与推演件;验收 AC-1/AC-1b/AC-2/AC-3/AC-16/AC-17。

install 四不变式(violation = 拒绝 + board_invalid + error 级诊断,fail-fast 不静默;AC-1b/AC-2 按枚举名断言)

# 不变式 违例诊断(封闭枚举)
① B3 内无雷 inv1_mine_in_spawn
② B3 ∪ R₀ 内无变异格(A4 Rule 7 消费侧兜底;"R₀ 触雾"归 R₀ 子情形) inv2a_variant_in_spawn / inv2b_variant_in_r0
③ 数字恒真——num(x) ≡ 8 邻雷数(A2 全部规则的地基) inv3_digit_invariant
④ R₀ ≠ S——清图退化板拒绝(防"初始展开即整图"使轮次棋盘路径出口结构性不可达;生产面由 A1 legality 闸保证,本条为纵深防御、非 A1 clearable 闸复验——不可达安全格板 A2 照常运行) inv4_r0_equals_s

补充不变式:板态仅上述四态;变体属性是格级只读快照(无独立运行期状态机分支于变异/雾——零特判);产物只能经程序构造或 A1 产生,运行期不存在该输入源;A2 以 A3 相位观测量为闸、不自持轮次状态。

动作规则

符号约定:U / M / S = 全格集 / 雷集 M ⊆ U / 安全格全集 S = U ∖ M;F / G / O = 雾格集 F ⊆ S / 旗集 G / 已开集 O ⊆ U;B3 = 出生 3×3;num(x) = x 的真实数字(8 邻雷数,数字恒真)∈ {0..8};N₈(x) = x 的 8 邻。

规则:

  1. (规则 5)挖/插旗/拔旗三个付费动作,A2 先查棋盘面(目标相不相邻、开没开过、旗位对不对),查过再请资源账本扣行动点;任一边说不行,整个动作被拒绝——棋盘不变、不扣费、不发事件;每次拒绝携带三源之一的可辨原因码(棋盘面/资源面/相位,玩家面文案归呈现层);A2 自己绝不直接扣资源;挖成之后连锁规模与清图事实(chain_size, clears_map)由 A2 上报账本。
  2. (规则 6)挖开数字为 0 的格时,它周围 8 向相邻的未插旗安全格免费连锁全开,一路递推到没有新的 0 格为止;连锁格只花首格挖掘价、照常计入清图进度、奖励资格照常;旗格不入链也不当传播源——旗是玩家可用的"链阻断器"(花 1 AP 插旗保护一格不被误链);雾格可被链开但永不传播(生成端保证雾格数字恒非 0),代码里没有为变异写的分支。
  3. (规则 7)点击任何已开格,小人经已开区一次瞬移到位——逐格走的动画是呈现层的事,规则层一次事务完成落位;合法条件两条:目标格已开、且能只经过已开格 8 向连通走过去("已探明区"含已引爆雷格——走过的雷可以穿行站立);移动免费、不经账本、不发事件;只读查询 compute_move_path 返回同一条寻路路径(固定 8 邻行主序,确定性),既是合法性判定载体、也是呈现层路径预览的数据源。
  4. (规则 8)旗是棋盘状态的一部分:插上的旗跨轮保留、随图存续,换图/刷新/战斗结束随之消失;没有"口袋旗"库存、数量无上限、只能插在未开格上;轮次结束时 A2 对当时在场的每面旗报一条判定——旗下是雷判中、不是雷判空,雾里的旗恒判空(雾区无雷,判定零特判);旗留在雷上就每轮诚实重复报判中,去重是结算侧的事,A2 只报事实;插拔旗本身不发事件,界面反馈走调用返回值。
  5. (规则 11)挖开雷格报一条 kind=mine 开格事件,轮次不结束、格子算已开——从此可以通行:小人能站上去、能穿过它继续挖;雷格不计清图进度、不能再挖、不能再插旗;同一轮可连续挖开多颗雷,每颗都是独立事实;雷格通行是有价捷径:挖已知雷 = 花 1 AP + 给敌方送优势,是玩家主动抄近路的权衡与降级板上的兜底通路,不是免费通道。
  6. (规则 12)本作没有双击快开/数字和弦:点击已开数字格的唯一含义就是移动小人;对外接口是封闭枚举、里面没有快开入口,将来谁想加就是接口漂移修订。

举证:

  • 规则 5 依据 A3 Rule 9(禁自行扣减),验收 AC-4/AC-11/AC-21;规则 6 算子见 F2,遇旗逐格行为见 EC17,验收 AC-5/AC-6;规则 7 边界见 EC14,呈现归属归 D1,验收 AC-14。
  • 规则 8 价目见下表,判定字段见三事件回边,兑付去重归 A3 Rule 8/OQ5,挪旗价目见 A3 EC3/EC7,验收 AC-11/12/13;规则 11 验收 AC-15、边界 EC10;规则 12 负空间验收 = API 封闭枚举"无对应入口",chord 首遇提示归 D1 强制项③,行为验收 AC-4。
旗动作 花费 发生什么
插旗 1 AP 未开格上立一面旗
拔旗 1 AP 旗从棋盘移除
挪旗 2 AP(拔 + 插) 旗换个位置
挖有旗的格 拒绝 须先拔旗(1 AP)再挖

批次结算与收轮

settle_batch(intents) ── 单一结算事务(到达序 ⟨I₁,…,Iₙ⟩,n ≥ 1)
  │ ① 分类 class(I)(批次初态求值):C_dig(执行后 clears_map=true 的 dig)
  │    · C_stop(stop)· C_other(非清 dig / flag×2 / move)——真模拟 F2,禁计数器捷径
  │ ② 语义序 ≺:C_dig ≺ C_stop ≺ C_other;同类内按到达序(稳定序)
  │ ③ 逐意图执行;轮次结束首次为真处定胜者 ω
  │    其后意图全部 voided——零棋盘效果 · 零 AP 扣减 · 零事件(区别于非法拒绝)
  ▼
胜者 ω → 出口分发(见核心循环节出口分发表)
类别 成员 结算次序
C_dig dig 且执行后 clears_map = true(真模拟 F2——禁"rem=1 则任意 dig 必清"计数器捷径,反例 = 挖雷不入 S) 最先
C_stop stop 次之
C_other 非清 dig / flag ×2 / move 其余(同类内按到达序——稳定序,多 cleared-dig 时最先者执行胜出)

四组合真值表(≡ A3 Rule 3 优先级 cleared > stopped > ap_exhausted):

# 批次(到达序) 结果 RAP
1 [dig清, stop] (cleared, new_board),stop voided +0(voided)
2 [stop, dig清] 语义序重排 → 同 #1 +0
3 [stop, dig耗] (stopped, same_board),dig voided += remaining
4 [dig耗, stop] 语义序重排 → 同 #3 += remaining

规则:

  1. (规则 9)一帧多个指令全部经批次入口 settle_batch 提交——A2 唯一结算入口,单意图批等价于逐个调便捷接口;批次是整体事务:先按固定类别顺序重排(能清图的挖最优先、停手次之、其余殿后,同类内按提交顺序),再逐个执行,轮次结束条件第一次成立处定出胜者,其后意图全部 voided——零棋盘效果、零扣费、零事件;voided 不等于被拒绝——拒绝是"本来就不合法",voided 是"来不及了";停手指令经批次入口转交资源系统,停手轮的结束事件仍由资源系统直发。
  2. (规则 10)一次挖掘结算让资源系统仲裁出轮次结束(行动点耗尽或清图胜出)时,A2 读取资源系统的轮次结束记录、组装恰一条轮次结束事件外发,外发之前先把本轮旗判定全部报完;行动点归零的瞬间轮次即结束——不存在"0 行动点还能操作"的窗口。

举证:

  • 规则 9:优先级口径与 A3 Rule 3 逐项一致,承接 A3 EC4 deferral;RAP 记账随胜者(键 = 胜者意图类型 × 结算时点 clears_map 真值);stop 经 settle_batch 提交、不直调 A3 的接线义务见 D1 强制项①;验收 AC-9/AC-10,边界 EC6/EC13/EC15。
  • 规则 10:组包即字段转抄——核心字段逐字段取自 A3 last_round_end;验收 AC-7/AC-8;清图轮剩余 AP 清零不入 RAP 见 A3 Rule 5。

行为契约(F1–F4 数值结论)

口径总纲:F1 定终局判定谓词(状态轴)、F2 定连锁展开算子(执行轴)、F3 定初始展开域(对偶轴——A1 度量与 A2 行为的接缝)、F4 定批次仲裁(事务轴)——四条均为行为契约,禁互相折算;本节零平衡公式、零随机、零字面量、零 UI 依赖。变量域、验算数据与全部推导论证见推演件「数值锚定与验算记录」及各问题节。

F1 清图判定谓词(clear_predicate)

结论:cleared ⇔ 已开集覆盖全部安全格(等价形:剩余安全格计数 rem = 0 ⟺ cleared);求值点穷举两处——install 初始展开事务尾(不变式④保证恒 false)与每次 dig 执行完成点;插旗/拔旗/移动不改已开集 → 结构上不可能触发 cleared;A3 clears_map ≡ 本谓词在该动作事务尾求值——单一谓词两个名字,禁第二套实现。

cleared(σ) :⇔ O(σ) ∩ S(B) = S(B)        等价形:|S(B) ∖ O(σ)| = 0
rem(σ) = |S(B) ∖ O(σ)|                   ——剩余安全格计数;rem = 0 ⟺ cleared
项 判定处理
雷格 恒 ∉ S(已引爆雷格入 O 作 BFS 通道但不入判定)
旗 不入 O 不入 S(带旗未开格照常计入 rem——"全图标旗不挖"永不 cleared)
雾格 照常计入(A4 Rule 4)
求值点 1 install 初始展开事务尾——不变式④保证此处恒 false
求值点 2 每次 dig 执行完成点(连锁完成后)——批次内逐 dig 求值,与 A3 request_dig 按次上报契约一致

F2 连锁展开闭包(chain_closure)+ chain_size / clears_map 上报参数

结论:连锁闭包 = 单调最小不动点,与 A1 F1 算子①在 G=∅ 域逐字同构;chain_size = 附加格数(不含首格);clears_map ≡ F1 本事务尾求值(禁第二套实现);连锁不越旗(旗格不入链、不作传播源——集合减法非分支);含链开雾格、雾格永不传播(零特判定理非分支);Cl 单调幂等 ⇒ 逐动作增量求值 ≡ 一次全量闭包。

Chain(O, c) = μX.[ O ∪ {c} ⊆ X ∧ ∀x ∈ X:( x ∈ S ∧ num(x) = 0 ⇒ N₈(x) ∩ S ∖ G ⊆ X ) ]
dig(c) 的棋盘效果:O′ = Chain(O, c);事件:cell_revealed × |O′ ∖ O|(BFS 规范序)
chain_size(dig(c)) = |O′ ∖ (O ∪ {c})|        ——附加格数,不含首格(A3 AC-2/AC-6b 期望依赖)
clears_map(dig(c)) = [ S ⊆ O′ ]              ——≡ F1 本事务尾求值

F3 初始展开域(initial_expansion_domain)+双包含回验

结论:O₀ = R₀ = B3 ∪ flood 闭包,与 A1 F1 求解器初始态恰等(同算子同板 ⇒ 同值),显式不含外扩 1 环;恒不开雷 R₀ ∩ M = ∅ 为 A2 侧独立可证定理;双包含两臂构造性成立 ⇒ A1 回退口径(出生 3×3 最小态)不触发、度量保真零降级;退化守卫 R₀ ≠ S——install 拒绝清图退化板(不变式④纵深防御,非 A1 clearable 闸复验)。|R₀| ∈ [9, |S|−1],域非空前提 |S| ≥ 10。

O₀ = R₀(B) = μX.[ B3 ⊆ X ∧ ∀x ∈ X:( x ∈ S ∧ num(x) = 0 ⇒ N₈(x) ∩ S ⊆ X ) ]
  ≡ A1 F1 "出生 3×3 ∪ flood 闭包" 逐字(同算子同板 ⇒ 同值);显式不含外扩 1 环。
性质 1(恒不开雷,定理):R₀ ∩ M = ∅(B3 无雷 + 闭包只收安全格)。
双包含回验:臂① R₀ ⊆ 排除域(以最终产物板计:出生 3×3 ∪ 闭包 ∪ 外扩 1 环)——构造性成立;
  臂② A1 求解器初始态 = R₀ ⊆ O₀ = R₀ ——恰等。
退化守卫(不变式④):R₀ ≠ S——install 拒绝清图退化板(EC1;非 A1 clearable 闸复验)。

F4 批次仲裁(settle_batch)

结论:语义序 C_dig ≺ C_stop ≺ C_other(同类内按到达序稳定);轮次结束首次为真处定胜者、其后意图全部 voided;(path_tag, continuation_hint, AP/RAP 终值) 对任意到达序不变(全批域)——执行/voided 划分的无关性仅对异类竞争成立;同类多成员批内划分由类内稳定序决定(不同到达序 = 不同输入,均为合法确定行为);RAP 记账随胜者。

类别函数(排序用,批次初始态求值):
  class(I) = C_dig   若 I = dig(c) 且执行后 clears_map = true(真模拟 F2——禁计数器捷径:
                     "rem=1 则任意 dig 必清"为假,反例 = 挖雷不入 S)
           = C_stop  若 I = stop
           = C_other 其余(非清 dig / flag ×2 / move)
语义序 ≺:C_dig ≺ C_stop ≺ C_other;同类内按到达序(稳定序——多 cleared-dig 时最先者执行胜出,
  其余 voided;未钉死类内序会使事件流与奖励格归属漂移——规范性义务)。
结算循环:按 ≺ 逐意图执行;轮次结束首次为真处定胜者 ω,其后意图全部 voided
  (false + voided:零棋盘效果、零 AP 扣减、零事件——区别于非法拒绝)。
胜者 → 出口映射见核心循环节出口分发表;棋盘路径 round_end 由 A2 恰一次外发;
  stopped 由 A3 直发(双发射源纪律,A2 禁双发)。

显式排除声明(归属表)

对象 归属
平衡公式 本 GDD 无——全部数值归位如下
价目、ap_per_round、RAP 规则 A3(F4 只消费 try_spend/request_stop/last_round_end 行为契约,零数值所有权)
雷布/尺寸/密度/可推理率/R₀ 与排除域定义版权 A1(F3 是其运行期镜像;A1 侧定义修订 = 接口漂移 + metric_version 联动,A2 禁独立改动)
变异约束 A4(F2 只消费"雾格恒非 0"生成保证)
奖励档位/标中旗判定/结算编排 B 系(A2 只输出事件流)
曲线 C3
A2 拥有 四条行为契约(F1–F4)
概率/期望公式 零(零随机——确定性由 AC-19 行为断言承载:同板同意图序列 ⇒ 事件流逐位相同)

实现期红线(与 A1 度量的漂移风险清单)

# 红线
1 0 格判定必须读真实数字 num(x),禁读显示值
2 初始展开禁加外扩环(破臂①)、禁只开 3×3(破臂②)
3 clears_map 与 cleared 同一实现
4 chain_size 不含首格、链不开雷、含链开雾格
5 A1 R₀/算子修订 = metric_version 跳变 + 本 GDD 同步修订
6 双包含臂①排除域以最终产物板计(先布后删无迭代,placed 基准可小于最终 R₀——A1 Rule 4 措辞修订义务,EC1)

边界情况

条件 行为 依据
EC1 初始展开即整图(R₀ = S,清图退化板) install 拒绝——不变式④ fail-fast(board_invalid + error 诊断),非合同内行为;生产面由 A1 legality 闸拦截;A2 侧不变式④为纵深防御,双包含两臂不受影响(跨 GDD 阻断缺口反例 B 与 A1 修订义务见依赖节登记义务表与推演件) 不变式④ / systems-index 门禁块 / AC-1b
EC2 install 产物违例(B3 内雷 / B3∪R₀ 内变异 / 数字不恒真 / R₀=S) 拒绝 + 状态不变 + error 恰一类别(不变式①–④)——信任边界 fail-fast;违例板只能由程序构造错误产生(A1 产物经生成期合法性闸),运行期不存在该输入源 规则 3 / AC-2
EC3 挖已插旗格 拒绝(board_face,sub_reason=flag_present)——须先拔旗(1 AP)再挖;旗是"别挖这里"的承诺标记 A3 EC11 棋盘面判定落点 / AC-11
EC4 连锁传播开到雾格 雾格被免费开出(channel=chain)、digit 恒真透传 + variant_ids 非空(呈现隐藏归 D1)、级联自然停止(雾格非 0 不传播)、计入清图、reward_eligible=true 奖励照常入库——零特判的自然结果,代码零变异分支 A2×4① / A4 EC4 / AC-6
EC5 玩家在雾格插旗 合法、耗 1 AP、旗立在未开雾格上;轮末判定恒 hit=false(雾区无雷——判定逻辑零特判自然覆盖);标错惩罚上线后的一致性推论:雾内旗按"非雷格上的旗"恒受罚——无 A4/A2 特判;D5 教学须警示"雾内插旗纯损" A2×4② / OQ1 前瞻登记 / AC-12
EC6 同批次多结束路径竞争 F4 语义序仲裁,四组合与 A3 Rule 3 逐项一致(真值表)、RAP 记账随胜者、voided 意图零副作用(零棋盘写/零扣减/零事件——被 voided 的旗动作不进轮末判定,无幽灵旗);胜出后余意图 voided,棋盘只读查询逐格不变。联合清图让位条款:批内个体非清的 dig 联合可清图时,stop 仍先执行并胜出(C_stop ≺ C_other)——联合清图高光被停手让位,为语义序的显式设计后果(单意图帧提交下生产面不可构造——D1 强制项⑥;F4 语义保留为防御性兜底,AC-10 义务不豁免) F4 / AC-10
EC7 最后 1 AP 挖开最后安全格 cleared 与 ap_exhausted 同时成立 → A3 事务内 cleared 胜出 → A2 外发 (cleared, new_board) 恰一条、剩余 AP 清零不入 RAP——防"耗尽优先"实现把清图高光结算为最差结局 A3 EC10 / AC-7 用例 1
EC8 战斗中热重载修改 VariationTable 板持生成期变异快照(非活引用)——行为零变化;A2 零表读取使抗重载为构造性;行为级代理 = 换根重放事件流逐位相同 A2×4④ / A4 EC8 / AC-18
EC9 拒绝目录外溢 目录外输入(越界坐标等)按 board_face 拒绝 + sub_reason=out_of_catalog(debug 级诊断,不与玩家语义混桶)+ debug 诊断禁静默吞;三源(board_face/resource_face/phase)互异可判定——玩家面文案归 D1(映射源 = sub_reason 枚举) 规则 5 / AC-21 目录外用例
EC10 挖开雷格 kind=mine 事件(无 digit)、轮次不结束、reward_eligible=false、格子可通行(工程债)可经其 BFS 续挖;同轮连续挖多雷 = 每雷独立事实事件;rem 不变(雷 ∉ S) 工程债(systems-index 门禁修正记录)/ AC-15
EC11 换图/刷新/战斗结束 install_board(新板)= 旗/小人/已开集全量重置 + 初始展开重放;retire_board = 板实例与变异快照消亡——旗随图存续语义(A3 Rule 8)的 A2 侧终点 A3 Rule 8 / AC-13/17
EC12 非 Active 相位动作请求 拒绝(phase 源)、零事件、全态不变——A2 与 A3 两侧按同一相位矩阵各自判定、结论一致;不存在 0-AP 窗口(A3 Rule 3 的对侧消费) 状态矩阵 / AC-16
EC13 批次内旗动作与终局意图竞争 旗动作 ∈ C_other → 被 cleared-dig/stop 压成 voided;判定基线 = 轮次结束事务开始时旗位(voided 旗动作不留痕)——语义序使基线与到达序无关 F4 / AC-10c/d
EC14 移动边界 目标未开 / 无 BFS 路径 → board_face 拒绝;目标即当前格定义为零移动,幂等受理;compute_move_path 对不可达格返回空——预览与执行同源 规则 7 / AC-14
EC15 同批次多个 cleared-dig 类内稳定序——到达序最先者执行并胜出,其余 voided;(path_tag, RAP) 天然唯一,稳定序规范的是事件流与奖励格归属 F4 / AC-10e
EC16 install 与 A3 相位组合非法(如非刷新路径的 Active 装板〔刷新路径已受理〕/ NoBoard 动作) 编排面拒绝(板态/相位源)——B1 编排错误 fail-fast 暴露,禁静默(A3"拒绝 + debug 诊断"口径同族,进程致命保留给数据通道) 状态矩阵 / AC-16
EC17 连锁前沿遇旗(连锁不越旗) 旗格不入链、不作传播源——被旗挡的格保持未开 + 带旗,仅经该格可达的后续格本轮不被链开(经其他路径可达者照常开出);chain_size 只计实开格;旗格轮末判定照常(hit 按其是否为雷——误标安全格留待玩家自拔,自己的承诺自己付 1 AP 撤回,与 OQ1 惩罚逻辑自洽);零特判合规:传播集 ∖ G 是集合减法非分支(F2 注) 规则 6 / F2 注 / AC-5 分支 2

依赖与输出

A2 不依赖任何下游——systems-index TD-SYSTEM-BOUNDARY 唯一回边:A2 只外发事件,B4/B1 订阅后回调;A2 为瓶颈系统(B4/D1/D5 挂其事件),规则一次定稳。

方向 系统 性质 接口要点
上游 A1 hard(产物消费) 棋盘产物 = 格状态 + 变异标记 + 出生区(Board class_name 数据契约);双包含回验两臂落点在 F3(臂① 展开域 ⊆ 排除域、臂② 求解器初始态 ⊆ 展开域,恰等——A1 回退口径不触发,门禁缺项即 blocking);install 不变式①–④为消费侧信任边界(fail-fast);A1 修订义务 ×2 见跨 GDD 登记义务表
上游 A3 hard(账本) try_spend(action_kind) 唯一扣减入口(A2 禁自行扣减);request_dig(chain_size, clears_map) 参数上报(A2 计算);stop 意图委托 request_stop()(A3 直发 stopped round_end);轮末读 last_round_end 组包棋盘路径 round_end(读取权 = 接口契约);相位观测量(Idle/Active/Waiting)= A2 动作闸的对侧来源;A3 API 面零改动(settle_batch 是 A2 侧入口)
上游 A4 soft(快照透传) 变异属性经 A1 产物快照只读携带、随 cell_revealed.variant_ids 透传——A2 执行逻辑零变异分支(零特判原则,义务是"不加分支");A2×4 清单缺项即 blocking
上游 D2 无直接依赖(登记事实) A2 零表读取、零 ConfigDB 引用——参数经 A3 账本、板面经 A1 产物;D2 Interactions 表"A2 无直接依赖"由本 GDD 证实
下游 B1 hard(编排,未设计——provisional 登记) 消费 round_end(棋盘路径)与全事件流结算;换图编排 = install_board/retire_board 的调用方(接线归 B1 GDD);B1 强制项 ×3 见下表(缺项即 blocking)
下游 B4 soft(订阅,未设计) 清图奖励触发(cleared 路径)与安全格奖励内容归 B4——A2 只上报棋盘面资格事实(reward_eligible/channel),内容与折算不经 A2;连锁批量授予的溢出吸收设计待 B1/B4 条目化(13 格链 × B3 max_stack=2 ⇒ 大量"溢出未生效"行进结算明细,P2 画面反向伤害连锁幻想——溢出转一次性资源/治疗或显式接受,裁决归 B1/B4)
下游 D1 hard(呈现,未设计) 棋盘/小人/旗/数字渲染;数字显示判定消费 variant_ids(雾格无字——digit 恒真透传是前提);三源拒绝呈现(映射源 = reject_reason + sub_reason);D1 强制项 ×6 见下表(缺项即 blocking),数据面义务见呈现与数据供给契约表
下游 D5 soft(Alpha) 教学口径来源:小人三动作 + 连锁/旗/收轮以本 GDD 规则为准;教学条目:雾内旗纯损、雷格可通行、旗挡链(连锁止于旗属正常)、挖到雷 = 敌方优势而非死亡(经典扫雷玩家最大预期违背)、已开雾格无字属正常——挂 OQ1/EC5/EC17
下游 D4 soft(Alpha) 挖掘/连锁/雷格/收轮音效挂三事件流;旗/移动反馈经调用返回值命令式驱动(两动作零事件外发——发射面封闭的已声明代价;systems-index 依赖分层 D4 ← A2,B1)
下游 A5 soft(垂直切片预留) 探测类道具的显影面可能挂 A2 查询接口(未开格数字显影)——接口归 A5 GDD 定稿,本 GDD 不预写(OQ4)

B1 强制项(缺项即 blocking,systems-index 门禁块登记)

# 义务
1 结算触发 = Waiting 相位编排点、不依赖事件到达序(stopped 轮 A3 直发 round_end 与 A2 旗判定批的到达序不承载语义)
2 reward_eligible=false(initial 通道)的格不得进入奖励入库(A3 EC5 委派闭环)
3 诚实重复上报的去重义务(资格以雷格实例为键)

D1 强制项(缺项即 blocking,systems-index 门禁块登记)

# 义务
1 stop 意图经 settle_batch 提交、不直调 A3(单一结算序保证)
2 四种格态一眼可辨(已开 0 格地板 / 已开雾格无字 / 未开格 / 未开雾格——左键"已开=移动/未开=挖"消歧的感知前提;后果不对称:误挖 = 1 AP + 可能触雷且不可逆)
3 悬停预承诺(光标区分移动/挖/旗目标语义)+ 可挖域(8 向相邻)常驻指示 + 怀旧扫雷玩家 chord 肌肉记忆首遇提示("点击数字格 = 移动小人"——非模态、每 run 一次,A4 先例)
4 已引爆雷格"可通行可读"呈现
5 compute_move_path 呈现语义定稿(合法性指示 vs 穿行动画轨道——P4 氛围载体;BFS 行主序路径可能视觉绕路,形态归 D1 裁决)
6 单意图帧输入收集(stop 点击终结当帧收集;F4 语义序退为防御性兜底)+ 批次 voided 呈现义务(至少 stop 被 voided 须可感知——防 [dig清, stop] 静默改判清图、剩余 AP 清零不入 RAP)+ 每次拒绝玩家可感知(文案归 D1,映射源 = reject_reason + sub_reason)

呈现与数据供给契约(A2 无自有渲染面与 UI——数据供给规格 + D1 呈现义务登记)

# 数据面义务 归属
1 数字可读性的数据前提:digit 恒真透传(含雾格)是"数字是主角"(视觉锚 1)的逻辑地基——呈现层任何隐藏/遮罩都不改数据层真值;已开雾格 = 地板无字(负空间,防误读为 bug) D1
2 绘制优先级固定(视觉锚 3):数字 > 小人 > 旗 > 变异纹理 > 底色——小人所在格用边框高亮而非覆盖文本;A2 的事件流是 D1 分层绘制的输入 D1
3 三 channel 驱动动效语义(D1/B5 消费):initial(开局整片亮起——"地牢初醒")· chain(连锁撕开——P1 高光时刻的动效载体;连锁止于旗的呈现已登记 D1/教学)· dig(单格回应) D1/B5
4 kind=mine 事件 = 已引爆雷格视觉态:已开底 + 雷图标 + 可通行可读——玩家必须看得出"这是走过的雷、能走"(D1 强制项④) D1
5 变异标记保真:variant_ids 透传错误即呈现欺骗(雾格显影/隐藏全链路的数据源) D1
6 无 MVP 音频:挖掘/连锁/旗/雷格/收轮音效挂 D4(Alpha,依赖分层 D4 ← A2,B1);事件流已含全部触发点 D4
7 输入模型:鼠标驱动(PC 主输入)——左键已开格 = 移动 / 未开相邻格 = 挖、右键 = 插/拔旗、停手按钮 = settle_batch([stop]);全部意图经 settle_batch 提交(D1 强制项①)——单帧多意图时 A2 语义序仲裁兜底(F4);触屏/Gamepad 非 MVP 门禁(意图对象架构使后续接入零数据层障碍) D1
8 单意图帧输入收集(D1 强制项⑥):stop 点击终结当帧收集——F4 语义序退为防御性兜底 D1
9 输入消歧感知前提(D1 强制项②③):四种格态(已开 0 格地板/已开雾格无字/未开格/未开雾格)一眼可辨、悬停光标区分移动/挖/旗目标语义、可挖域(8 向相邻)常驻指示——硬前提(后果不对称:误挖 = 1 AP + 可能触雷且不可逆) D1
10 三源拒绝呈现:board_face(sub_reason 封闭枚举)/ resource_face(AP 不足)/ phase(收轮中)——每次拒绝玩家可感知(AC-21 为数据源验收) D1
11 voided 呈现义务(D1 强制项⑥):被 voided 的意图(至少 stop)须玩家可感知——防 [dig清, stop] 静默改判清图、剩余 AP 清零不入 RAP 的读感欺骗 D1
12 移动路径预览:compute_move_path 返回 BFS 路径,呈现语义(合法性指示 vs 穿行动画轨道)归 D1 GDD 裁决定稿(D1 强制项⑤——systems-index 门禁登记项,悬案的数据面已备) D1
13 输入摩擦护栏观测:每轮原始输入动作数(含被拒/voided)∶ 当轮 AP 消耗 ≤ 2(A3 P4 载体;"点击"以设备中立"输入动作数"计)——归 D1 遥测(A2 只收意图对象、不收原始输入),≤2 为 playtest 待验证假设(挂 A3 OQ3);远距目标两击摩擦的复合意图(点击远格 = 自动 move+dig)登记为 D1 评估项(MVP 可裁决不做、留痕) D1 遥测
14 结算明细无 A2 附加项:效果归因全部经事件流字段由 B1 呈现(P2) B1

跨 GDD 新登记义务汇总(本 GDD 出具,随 systems-index 门禁块登记)

编号 内容 对侧 状态
A1-1 F5 legality 增 R₀ ≠ S(违例 = 该次尝试废弃重试,clearable 同款)——"初始展开即 cleared"反例 B 与 N=1 行整行退化阻断缺口 A1 待回写
A1-2 F4 批量断言严格零 + Rule 4 排除域基准措辞(最终产物板计) A1 待回写
B1×3 结算触发相位编排点 · initial 格不入奖励库 · 兑付去重(明细见 B1 强制项表) B1 已登记(缺项即 blocking)
D1×6 stop 经 settle_batch · 格态可辨 · 悬停预承诺+可挖域+chord 首遇提示 · 雷格可通行可读 · 路径呈现语义定稿 · 单意图帧收集+voided 呈现+拒绝可感知(明细见 D1 强制项表) D1 已登记(缺项即 blocking)
B1/B4-1 高光兑现节点条目化(含 chord 缺席的标中旗即时兑现补偿候选——清单外散文登记会丢失,B3 先例) B1/B4 待条目化
B1/B4-2 连锁批量授予溢出吸收设计(见依赖 B4 行) B1/B4 待条目化

P0 最小闭环

  1. A1 产板 → install_board 受理:持有生成期快照 + 校验四不变式(违例 fail-fast)。
  2. 初始展开 R₀ 免费翻开(cell_revealed ×|R₀|,channel=initial,规范序),小人落位 B3 中心格。
  3. 玩家意图经 D1 → settle_batch(A2 唯一结算入口)。
  4. dig:棋盘面判定 → A3 try_spend → 开格 + 连锁(cell_revealed ×(1+chain_size)),A2 上报 request_dig(chain_size, clears_map)。
  5. flag/move:旗入棋盘(1 AP)/ 免费瞬移——零事件,反馈经调用返回值命令式驱动。
  6. 批次内轮次结束首次成立 → 定胜者,其后意图 voided(零效果、零扣费、零事件)。
  7. 收轮:flag_judged ×N 先于 round_end——棋盘路径 A2 读 last_round_end 组包外发,stopped 路径 A3 直发。
  8. 三事件流被 B4/B1/D1/D4/D5 消费(结算归因、呈现、音效)→ Waiting 相位编排受理 install_board 换新图,回到步骤 1。

P1 / P2 后置

后置以对侧登记为生效条件;复活任何一行 = 修订本 GDD,不许静默加回。

优先级 内容 后置原因
P1 B1 轮次编排接线(Waiting 出口/next_round_mode/request_refresh 代理)· 结算兑付与 P2 来源标注 · 兑付去重(诚实重复上报的对侧,A3 Rule 8/OQ5)· EC8 末轮判定次序 · 双发射源消费序 B1 未设计——systems-index B1×8 义务清单 + 本 GDD B1×3,生效条件成立
P1 B4 奖励内容与差异化插槽 · debuff 档位 B4 未设计——A4 三条定价硬约束
P1 D1 数字显示消费 variant_ids · 三源呈现 · 路径预览表现 · 点击摩擦观测 D1 未设计——A4 D1×2 + 本 GDD D1 强制项 ×6
P2 A5 显影接口 接口归 A5 GDD 定稿(OQ4)
P1 A1×A2 双包含端到端集成用例——"A1 真生成器产物 → A2 install"全链路回验 两系统实现后集成冒烟承载(本 GDD 冒烟用程序构造板)
P1 标错惩罚落地 OQ1 登记——实测义务保留,不阻塞设计;惩罚前 AC-12 只断言 hit=false

调参表

A2 零专属 knob——结构冻结项修订走本 GDD 修订流程非调参;禁止在 A2 侧复制任何参数(D2 Rule 1 单一事实源)。已锁数值以 design/registry 为准,本表只登记字段与归属,不复述锁值。

字段 域 默认 owner 说明
ap_per_round · dig_ap_cost · flag_place_ap_cost · flag_pull_ap_cost · rap_refresh_cost 见 registry action_economy 以 registry 为准 A3 节奏与价目——A2 只消费 try_spend 行为契约
BoardGenTable 九字段 见 registry board_gen_table 以 registry 为准 A1 板面与推理保障
unlock_level 见 registry 以 registry 为准 A4 变异资格
flag_pull_ap_cost 联动观测(引用不拥有) — — A3 挪旗成本与 OQ1 标错惩罚的双重定价位(A3 OQ2 复核落点——若实测推翻拔旗 1 AP,A2 行为零改动、仅价目表值变化)
ap_per_round 联动观测(引用不拥有) — — A3 决定每轮可兑现的确定动作供给(A3 OQ3 供给指标)
A2 侧可观测指标(非 knob,遥测域) — — A2 每消耗 1 AP 输入动作数(≤ 2 护栏,P4 点击摩擦——D1 观测,provisional 待 playtest 验证)· 连锁规模分布 · 批次数/轮

结构冻结清单(非 knob):三事件面封闭 · 初始展开 = R₀ 恰等 · 连锁免费 · 移动/初始展开不经账本 · 无 chord · 批次语义序 · 四条 install 不变式 · 瞬移移动语义。

验收标准

测试口径

口径 要点
测试载体 godot --headless --script(承 D2 冒烟框架;脚本 extends SceneTree、autoload 显式实例化);A2 冒烟 = Core-Core 集成:被测面 = A2 规则引擎 + 真 A3 实例(资源全经真账本 try_spend 驱动——A2 不可自行扣减);冒烟另以 B1 编排角色最小形驱动 notify_round_start()/notify_settlement_done()(仅开轮/收轮;B1 就绪后改走真实调用方,断言口径不变)
棋盘输入 Board class_name 直引程序构造(不经生成器、不经 load()/preload()——A4 AC-5/A1 夹具先例;板规格即 A1 产物 schema 的坐标级实例化,A1 未实现不阻塞本冒烟)
API 面 provisional 封闭枚举,见枚举节(install_board · settle_batch——D1 唯一提交入口,单意图批 = 平凡形 · try_* 便捷形 · compute_move_path 只读 · retire_board);无 chord 负空间:封闭枚举即"无对应 API"的验收形态,新增快开入口 = 接口漂移
事件捕获断言面 B1/D1 未设计 → 以事件捕获列表断言,分订两发射面:A2 面(cell_revealed / round_end 棋盘路径 / flag_judged)+ A3 直发面(stopped round_end);payload 口径钉死:① digit 恒真透传(仅 kind=safe 携带;雾格携带真值——呈现隐藏归 D1,判定源 = variant_ids);② reward_eligible:initial 恒 false、chain/dig ∧ safe 恒 true(含链开雾格)、kind=mine 恒 false;③ round_end 核心字段 ≡ A3.last_round_end 逐字段(同构)
只读观测量 A2 侧 = 已开集/旗集/小人位/事件捕获;A3 侧 = ap/rap/phase/last_round_end;多步 GIVEN 均给出构造序列
夹具策略 程序构造小板、每用例先 reset_diagnostics();行为夹具根 = 零(A2 无数据表、无加载期校验类别——--data-root 通道在本域无消费者;资源面非默认价目分支经 D2 R3 debug override 构造,A3 AC-7 同款);登记常数协议(A1 黄金向量同源):每板登记 (R₀ 成员集, |R₀|, |S|, 关键格 digit, 级联集) + 逐格手工推导记录入版本库;失效处置 = 先复核推导、推导无误即实现缺陷
期望值推导纪律 行为类 THEN 数值 = ConfigDB A3 表读值推导(ap_per_round/各价目经测试通道读取)⊕ 板登记常数;不写死玩法数值,唯一例外 = 登记常数;默认价目全 1 AP 下"AP 不足"分支不可构造(A3 EC2 同款)——资源面分支显式承载于 debug override 非默认表值(AC-21)
致命类协议 零行 manifest(显式声明)——D2 AC-2b 协议适用前提 = 加载期数据通道致命;A2 无加载期校验,install 违例 = board_invalid 拒绝 + error 诊断(进程致命保留给数据通道;实现期 ADR 若裁决升格,回本节补 manifest 行)
out-of-scope deferral 以对侧登记为生效条件——见 P1 / P2 后置表

夹具板清单(程序构造小板)

spawn = 出生 3×3 中心格坐标,逐板显式登记:b_spawn / b_flag / b_batch / b_mine_walk / b_degenerate = (3,3),b_chain / b_fog = (3,2)——按默认"板中心"读法该两板 B3 = {2..4}² 会含 y=4 雷墙雷、违反不变式①、板不可安装(已修正并纳入 OQ3 复核范围)。

板 规格(坐标级要点) 服务
b_spawn M = {(1,y): y∈[0,6]∖{3}} 竖墙 6 雷留缺口;R₀=35、|S|=43、未开 8 格;(1,3) digit=2 安装五属性/双包含/挖掘/移动/相位
b_chain spawn=(3,2);M = y=4 横墙 6 雷留 (3,4) 缺口;R₀=28(y∈[0,3] 全安全格);墙下封闭区 14 格;(3,6) 为 0 格、级联集 |C|=13 连锁/双包含/链不越旗
b_fog spawn=(3,2);b_chain 几何 + M += {(5,0),(6,1)};雾 F = {(0,5),(1,5)}(链可达)∪ {(6,0)}(链不可达);雾格 digit 2/3/2、厚度≤2 ✓;R₀ 常数随 M 变化按板重算((6,2)/(6,3) 退出 R₀) 雾链两态/雾旗/快照/零特判/回放
b_fog_bare b_fog 同 M 同几何、variant 标记剥离 AC-20 同构对板
b_flag b_spawn 同几何复用;(1,2)/(1,4) 雷 = hit 旗靶、(0,3) 安全 = miss 旗靶 旗生命周期/轮末判定/三源拒绝
b_batch b_spawn 同几何复用(未开恰 8 格支持构造) 批次四组合/两收轮路径
b_mine_walk M = {(3,5)} 单雷;(3,4) digit=1 ∈ R₀ 雷格挖开/已引爆可通行
b_degenerate 8×8、M = {(7,7)} 单雷角——R₀ = S(全 0 格连通,构造性退化) 不变式④ install 拒绝
b_invalid_* ① mine_spawn:b_spawn+M+=(3,3) ② fog_spawn:b_fog+F+=(3,2) ③ fog_flood:b_fog+F+=(5,1)(R₀ 成员)④ digit:b_spawn+数字篡改 不变式①②③④ 各一(AC-2)

AC 清单(Given-When-Then,编号不变,23 条)

AC Given When Then 覆盖
AC-1 真 A3 实例(phase=Idle)与 b_spawn install_board(b_spawn),随后 notify_round_start() → Active accepted=true 且事件捕获仅含 cell_revealed 批,逐事件断言:① 免费——A3 ap 仍=表读值(零 try_spend)且诊断零新增;② 计入清图——构造序列挖尽未开 8 格(登记常数)时恰在第 8 次触发 round_end{cleared, new_board}(无超前/滞后);③ 无奖励——全部 reward_eligible=false(channel=initial);④ 永不触雷触雾——全部 kind=safe;⑤ 恰等 R₀(有序断言)——事件有序列表 ≡ 测试侧朴素 BFS 重算 R₀ 的行主序枚举,逐格逐序相等(规范序钉死——DFS/列主序等"错误但确定"的实现不可通过;登记常数 |R₀|=35 为独立锚) 规则 4 / A3 EC5 委派
AC-1b b_degenerate(R₀=S 构造板) install_board;随后 install_board(b_spawn) accepted=false、reject_reason=board_invalid、error 诊断恰一条类别=inv4_r0_equals_s(枚举见状态节);随后重装 accepted=true(拒绝原子性) EC1 / 不变式④
AC-2 b_invalid_mine_spawn / b_invalid_fog_spawn / b_invalid_fog_flood / b_invalid_digit 各板(每用例先 reset_diagnostics) 各 install_board 均 accepted=false、board_invalid、error 恰一对应类别(inv1_mine_in_spawn / inv2a_variant_in_spawn / inv2b_variant_in_r0〔"R₀ 触雾"归此——②的 R₀ 子情形〕/ inv3_digit_invariant,封闭枚举见状态节) 规则 3 / EC2
AC-3 b_chain 与 b_fog 各 install 后捕获的初始域格集 E(B);测试侧按 A1 F1/Rule 4 公开定义朴素重算 R₀(B) 与排除域 X(B)=R₀∪外扩 1 环(X(B) 以最终产物板计——先布后删后基准,A1 Rule 4 措辞修订义务 EC1) 逐板比对 臂① E(B) ⊆ X(B);臂② E(B) ≡ R₀(B) 逐格恰等(不欠展开也不过度展开——A1 回退口径不触发的行为面);两板全用例通过 规则 4 / F3 / registry a2_dual_containment(门禁缺项即 blocking)
AC-4 b_spawn Active、小人于 R₀ 内 try_dig(c)(相邻未开)→ try_dig(非相邻 / 已开格 / 有旗格)→ 等价护栏:同构造态分别驱动 try_dig(c) 与 settle_batch([dig c])(各新轮) 第一次 executed、A3 ap −dig_ap_cost(表读值,真 try_spend)、事件恰一条 {cell=c, kind=safe, channel=dig, reward_eligible=true, digit ≡ 测试侧重算 8 邻雷数};拒绝分支 rejected+board_face(sub_reason 分别 = not_adjacent / target_revealed / flag_present)、零事件、ap 不变;等价护栏:事件流/ap/棋盘只读观测量/诊断逐项相同(单意图批 ≡ 便捷形) 规则 5 / 规则 9 / A3 Rule 2
AC-5 b_chain;构造序列挖 (3,4)→移→挖 (3,5)→移→try_dig((3,6))(0 格);分支 2:构造至小人立于 (3,5) 后 try_flag_place((2,5))(未开相邻,1 AP)→ 再 try_dig((3,6)) 第三次挖掘(分支 1);插旗后再挖(分支 2) 分支 1:executed 且 ap 总耗 = 3×dig_ap_cost(级联免费——非 3+13 格);事件 channel=chain 批恰 |C|=13 条(登记常数)且序 ≡ 测试侧 BFS 行主序枚举、全 reward_eligible=true、digit 恒真透传、事件数 = chain_size + 1(一致性恒等式);级联止于非 0 格(链只经 0 格扩);链格计入清图(挖尽封闭区后余格清图即 cleared)。分支 2:(2,5) 保持未开+带旗(零 cell_revealed)、chain_size=12(级联集减 1——(1,5)/(1,6) 经 (2,6) 照常开出,仅旗格本身被挡)、旗格轮末判定照常 规则 6 / F2 / EC17
AC-6 b_fog;同 AC-5 构造至 (3,6) 级联;另一用例:小人移至 (5,1) 后 try_dig((6,0)) 级联(链可达雾);全价挖链不可达雾 四项逐验:① 链可达雾 (0,5),(1,5) 免费开出(channel=chain、ap 无雾附加扣减);② variant_ids 含 "fog" 且 digit=2/3 恒真透传(呈现判定数据源——A2×4③ 同板证);③ 级联停止(级联集与 b_chain 同构板逐格同形——雾格只作叶);④ reward_eligible=true 且计入 cleared 判定。另一用例(链不可达全价):executed、channel=dig、耗 1 AP 全价、variant_ids 非空、digit=2 透传 A2×4①③ / A4 EC4 / fog_ap_note 两态执行侧
AC-7 用例 1(同帧竞争):b_batch 构造至"未开恰 1、ap=1"(cleared 与 ap_exhausted 同事务成立——"耗尽优先"缺陷仅在此构造可检出);用例 2:同构造 ap=k≥2 try_dig(末格) 用例 1:executed、A2 面 round_end{cleared, new_board} 恰一条(ap_exhausted 不触发)、其字段 ≡ A3 last_round_end 同帧读值(组包数据源行为面)、与 stopped 路径 payload 同构(字段集/类型一致)、rap 不变(剩余 AP 清零);用例 2(剩余清零非平凡分支):cleared 恰一条、rap 不变(k−1 > 0 清零非平凡) 规则 10 / EC7 / A3 Rule 5/6/9/EC10
AC-8 b_batch 未开 ≥2、ap=1 try_dig(非末格);紧接任意 try_* executed、round_end{ap_exhausted, same_board} 恰一条、A3 remaining_ap=0 不变式;紧接动作全部 rejected+phase、零事件 规则 10 / A3 Rule 3/EC1/EC14
AC-9 b_batch Active 未开完、ap=k≥1 settle_batch([stop]) A3 直发面捕获 round_end{stopped, same_board} 恰一条(A2 面零 round_end——双发射源行为面)、rap = 前值 + k(1:1,表读值推导)、事件序 = flag_judged ×N 先于 round_end(事件序契约) 规则 9 / A3 Rule 4/9
AC-10 b_batch(每用例新轮新构造)六场景:a〔dig清→stop〕· b〔stop→dig清〕· c〔dig→stop,ap=1 耗尽型构造:新轮 7 次非清挖〕· d〔stop→dig,同 ap=1 构造〕· e〔dig清₁→dig清₂ 同批〕· f〔非清 dig₁→非清 dig₂ 联合清图;多步 GIVEN:前轮挖雷 (1,2) 开道(雷格可通行的构造性利用)→ 挖尽 x=0 列余格 → 停手收轮;新轮未开恰 {(0,3),(1,3)}、ap=8〕 提交各批次 a:cleared 胜出、rap 不变(stop 清零不入 RAP);b:与 a 同结果(同 path_tag/同 rap 终态/同事件数——异类序无关性);c:语义序救援用例——stopped 胜出(朴素到达序将产出 (ap_exhausted, RAP+0)——语义序校正为 (stopped, RAP+1))、rap += 1(表读值推导)、被弃 dig 格仍未开(续轮同图可证);d:与 c 同结果;e:类内稳定序——到达序最先者执行胜出、恰一条 cleared、第二 dig voided 零副作用;f:dig₁ 执行不清图(rem 2→1)、dig₂ 结算时点 clears_map=true 胜出 → cleared、两意图均执行、rap 不变(出口映射按结算时点真值键控——F4)。全用例断言:voided 意图零棋盘写/零扣减/零事件(棋盘只读查询逐格不变)、round_end 恰一条;c/d 断言 flag_judged ×N 先于 round_end(事件序契约) 规则 9 / F4 / EC6/EC13/EC15 / A3 EC4 deferral 兑现(A3 冒烟不可构造用例在本节兑现,deferral 生效)
AC-11 b_flag、小人于 (2,3) 依次插 (1,4)、插 (1,2) 后拔 (1,2)(挪旗)→ try_dig((1,4))(有旗)→ 插非相邻/插已开/插已有旗/拔无旗/拔非相邻 全 executed、ap 合计 −(place+pull)×2(表读值)、旗集随动、零事件外发;挖旗格 rejected+board_face(EC11 落点);各拒绝分支 rejected+board_face 规则 5/8 / A3 EC3/EC7/EC11
AC-12 分支 1:b_flag 插 (1,4)(雷)与 (0,3)(安全,经挖 (1,3) 后站立可达),前置断言验"被拔的不判"(插 (1,2) 后拔,轮末无该条目);分支 2(雾旗):b_fog 小人相邻未开雾格插旗;分支 3(重复上报):分支 1 收轮后 notify_settlement_done(same_board)+notify_round_start 续轮旗仍在 settle_batch([stop])(分支 1/3);轮末(分支 2);再停手(分支 3) 分支 1:flag_judged 恰 2 条集合断言:{(1,4),true}、{(0,3),false}(行主序枚举);分支 2:{cell,hit=false} 恒(雾区无雷零特判;标错惩罚上线后"恒受罚"推论 = OQ1,惩罚前不可判定);分支 3:再次 {(1,4),true}——A2 逐轮诚实重复上报,去重归 B1/B4(out-of-scope) A2×4② / A4 EC5 / A3 Rule 8/OQ5 上报半
AC-13 b_flag 已插 2 旗 stopped 收轮 续轮(same_board);随后 retire_board() + install_board(b_fog) 旗集不变且事件捕获零新增 cell_revealed(初始展开板级一次、跨轮不重放——每轮重放的违例实现在此用例现形);重装后旗集 = 空、初始展开照常(按新板) 规则 8 / EC11 / A3 Rule 8/EC9
AC-14 b_spawn 小人于 (3,3) compute_move_path((2,3)) 两次 → try_move((2,3)) → 拒绝/幂等四对:① move 未开格 ② move 已开但 BFS 不可达格 ③ move 目标 = 当前格 ④ 正常移动分支 路径两次逐格相同(确定性)且全格 ∈ 已开集、相邻步 8 向合法;try_move executed、位置更新、ap 不变(不经账本)、零事件;① rejected+board_face(sub_reason=target_concealed);② rejected+board_face(sub_reason=no_path)且 compute_move_path 对同格返回空(预览与执行同源,一用例双断言);③ executed 幂等(零移动:位置不变、零事件、ap 不变——EC14);④ 保持 规则 7 / EC14 / A3 Rule 2 移动行/P4
AC-15 b_mine_walk、小人于 (3,4) try_dig((3,5)) → try_move((3,5)) → 经雷格续挖 (3,6) executed、ap −1、事件恰一条 {kind=mine, channel=dig, 无 digit 字段, reward_eligible=false}、轮次不结束(两面零 round_end);try_move executed(可通行——工程债验收落点)、位置=(3,5);续挖正常受理 规则 11 / EC10 / 工程债登记
AC-16 NoBoard 或 Installed·Frozen(Idle/Waiting 两分支);另 GIVEN Active 依次 dig/flag×2/move/settle_batch([stop]);Active 下 install_board/retire_board 全部 rejected+phase、棋盘只读查询与事件面逐字不变;Active 下装板/退板拒绝(板态——EC16) 状态矩阵 / EC12/EC16 / A3 输入×相位矩阵对侧
AC-17 b_spawn 已装且部分挖掘 retire_board();随后 install_board(b_flag) 全动作拒绝(phase;无板态)、事件分段边界确立(跨段断言禁止——防前图泄漏);重装后初始展开按新板重算、无前板残留(旗/小人位/已开集) 规则 3 / EC11
AC-18 b_fog 基线事件流 E₀ 已捕获 测试通道换根加载变异表(B3 AC-15 换根模式)后重放同一意图序列(新 A3 实例+新 install) 事件流与 E₀ 逐位相同(含 variant_ids)——生成期快照非活引用;A2 零表读取(AC-22③)使抗重载为构造性,本用例为行为级代理 A2×4④ / A4 EC8
AC-19 同坐标规格独立构造的 b_fog ×2(各配全新 A3 实例) 同一定长意图序列驱动两遍(含挖/链/雾链/插拔旗/移动/多意图批/停手收轮——覆盖三 channel、flag_judged 与批次仲裁) 两遍事件捕获列表逐位相同(数、序、全字段) 规则 1 / D2 Rule 5 的 A2 层
AC-20 (b_fog, b_fog_bare) 同构对(同雷布同 digit、仅 variant 标记差异) 同一意图序列各驱动一遍 两事件流除 variant_ids 外逐位相同(差分容许域 = 该字段且仅该字段)——连锁/清图/旗判定/价目/收轮全不感知变异 A4 Rule 4 零特判 / 规则 1 / A2×4③ 反向证成
AC-21 b_flag + debug override action_economy.flag_place_ap_cost=2(D2 R3 域内值;承载声明:默认价目下资源面分支不可构造,同 A3 AC-7)构造 ap=1 try_flag_place(棋盘面合法)→ try_dig(非相邻)→ try_dig((1,4))(有旗格)→ Waiting 相位任意动作 → try_dig((-1,-1))(越界,目录外用例) rejected+resource_face、全态不变;board_face + sub_reason=not_adjacent;board_face + sub_reason=flag_present("须先拔旗"与"非相邻"数据可分);phase——三源互异可判定;目录外:rejected+board_face + sub_reason=out_of_catalog + 诊断收集器恰一条 debug(非静默吞) 规则 5 / EC9 / A3 EC2 对侧
AC-22 A2 文件集(规则引擎/事件载荷/冒烟脚本/夹具规格) 静态扫描 ① 零 randomize()、零自建 RNG 构造(tests/ 豁免不启用——A2 确定性回放不需种子,严于 A1 先例);② 零 ConfigDB 外 data 表加载(Board class_name 直引豁免);③ 零 ConfigDB.* 属性读取(A2 全部输入经 A3 账本与 A1 产物——设计决策;实现期 ADR 若裁决需读表,走接口漂移修订本条);④ 零 extends Control/Node2D、零 .tscn preload;⑤ AC-1 在 godot --headless --script 实跑通过(退出码 0 + 断言收集器零失败)作为本项判定(Rule 7);⑥ 纳入 D2 AC-14 项目级人工三要素字面量扫描(warning 级 + 人工复核,成员清单随实现建立并入——B3 AC-19 同款) 规则 1 / D2 Rule 1/2/5/7

覆盖矩阵(验收评审用)

类别 映射
规则 1→AC-19/20/22 · 2→AC-4/6/7/8/9(payload 前言钉死)· 3→AC-1b/2/17/18 · 4→AC-1/3(A3 EC5 委派 + 双包含)· 5→AC-4/11/21 · 6→AC-5/AC-6 · 7→AC-14 · 8→AC-11/12/13 · 9→AC-4 等价护栏/AC-9/10 · 10→AC-7/8 · 11→AC-15 · 12(无 chord 负空间)→API 封闭枚举
Formulas F1→AC-1②/5/7 · F2→AC-5/AC-6 · F3→AC-1⑤/3 · F4→AC-10
EC EC1→AC-1b · EC2→AC-2 · EC3→AC-11 · EC4→AC-6 · EC5→AC-12 · EC6→AC-10 · EC7→AC-7 用例 1 · EC8→AC-18 · EC9→AC-21 目录外用例 · EC10→AC-15 · EC11→AC-13/17 · EC12→AC-16 · EC13→AC-10c/d · EC14→AC-14 四对 · EC15→AC-10e · EC16→AC-16 · EC17→AC-5 分支 2
义务 A2×4①→AC-6 · ②→AC-12 · ③→AC-6/AC-18/AC-20 · ④→AC-18 · 双包含①→AC-3 · ②→AC-3 · A3 EC4 deferral→AC-10 · 工程债→AC-15 · OQ1 在位→推演件开放问题区
规模 23 条 = AC-1…AC-22 + AC-1b(原"EC4 腿"编号为 AC-6,EC17 由 AC-5 分支 2 承载)

版本历史

版本 日期 改动
v2.0 2026-09-14 两件套迁移:按模板 v2 重排为 design 结论件(设计目的/系统范围/核心循环/领域章节×6/依赖与输出/P0 闭环/P1·P2 后置/调参表/验收标准),公式推导论证、候选取舍、体验锚点论证、已裁决争议、义务审计台账与全部 OQ 移至推演件 design/gdd/analysis/a2-minesweeper-rules.md;规则、数值、AC/EC/F/OQ 编号与内容零变更
v1.0-lean 2026-09-13 格式迁移:legacy 原稿按 lean 样例(docs/lean-gdd-sample-b1.md)重排——正文修订注记剥离收敛至本表;速览/体验锚点/枚举/边界情况/AC/义务台账/覆盖矩阵/开放悬案转表格,流程转字符画;F1–F4 公式本体、Variables 与验算数据全保留;术语统一以 voided 行文;语义与 2026-09-09 定稿及 2026-09-12 D4 修订对齐,零规则变更
D4 修订 2026-09-12 install_board 受理域扩 Active·仅弃图刷新路径:B1 refresh_board 编排内、A3 扣费成功为前提;其余 Active 装板仍拒绝(防轮内换板原则对非刷新路径不变),EC16 随之收窄
v1 2026-09-09 full /design-review 定稿 Approved:game-designer/systems-designer/qa-lead/ux-designer 四专员 + CD 终审六 blocking 同日修订核销、用户拍板放行(A3/A4/A1/B3 先例);systems-designer 起草 F1–F4 + 反例 B 阻断缺口(登记 A1 修订义务)、qa-lead 起草 23 条 AC(AC-1…22 + AC-1b + 覆盖矩阵 + 夹具坐标规格);本次定稿含:初始展开 R₀ 恰等 / 批次语义序仲裁 / 移动瞬移语义 / install 四不变式 / sub_reason 封闭枚举(UX-1)/ 连锁不越旗(GD-1)/ 雷格通行有价捷径(GD-2)/ 到达序无关性收窄 / 联合清图让位条款 / D1 强制项 ×1→×6 / B1 强制项 ×3 / spawn 坐标修正(b_chain、b_fog=(3,2))/ 已引爆雷格可通行(工程债);评审日志 design/gdd/reviews/a2-minesweeper-rules-review-log.md