# A1 扫雷棋盘生成(Board Generation) > **状态**:In Revision · 待 delta 复核放行 · **版本**:v2 · 2026-09-14 > **一句话**:从 (level_index, node_depth) 出发确定性生成完整扫雷棋盘,并在生成时刻承诺可推理率门槛。 > **推演件**:`design/gdd/analysis/a1-board-generation.md`(本文件只收结论,理由在那里) ## 设计目的 扫雷图的唯一生产者:五阶段确定性生成管线,为 A2/B1 提供自洽棋盘与生成期指标,为 P1"每一步都算数"提供生成端保障。缺位则游戏没有难度轴、A4 变异无布置载体、C3 曲线无落点。 1. 每张图在生成时刻承诺:从初始安全区出发、不靠赌能挖开的格子占比不低于该行及格线——玩家输给自选的赌(雾区/终局盲猜),不输给不可解的局。 2. 落点安全:出生 3×3 与其生成期可达域恒无雷、恒无变异。 3. 难度物质随 (level_index, node_depth) 上行——雷密、尺寸、雾占比由参数行直接雕刻。 4. 同种子同参数必产同图——回放、测试、复盘精确复现。 5. 参数组合退化时玩家永不卡死——降级出图并告警暴露,而非死锁。 ## 系统范围 负责: - 五阶段生成算法与生成-验证验收算子 - BoardGenTable schema 与数值回填(首个进度键表) - 可推理率度量口径(F1)与双判据达标判定(F5) - 雾参数域/可行性/成本谓词(F2/F2b/F2c)与加载期校验 - 清图预算增量构成(F3)与批量统计断言口径(F4) - A4 变异约束的生成期强制执行(A4×15 清单唯一执行落点) - 八项生成期指标集的产出 不负责: - 挖掘执行(A2) - 换图编排与 attempt 边界的编排侧断言(B1——A1 仅被调用) - 难度曲线数值与调参(C3——仅类型依赖 schema,禁反向调用生成) - 变异约束声明与候选池谓词出具(A4——A1 只消费 variant_pool_gate 并执行) - dig_ap_cost 价目(A3——只读引用) - "够不够"的判:清图总预算可用量与全量校验判据(A1/A3 契约与 C3);挖掘风险不等式与弃图支配性的闭合对账(B1 单一 owner——A1 只供给 actuals 分布锚值,非 target 参数) - 推理器/布置算法实现选型(实现期 ADR——本 GDD 只冻结行为契约) - 战斗侧/奖励定价/biome 词表(B1/B2/B3/B4/C1/D1——board_biome 仅为非空 StringSet 数据字段) - 呈现(D1/A2/B5) ## 核心循环 ``` generate(level_index, node_depth, rng) -> Board + 生成期指标集 │ ① 参数解析 ── BoardGenTable 行(D2 R1 floor 解析;域/跨字段谓词加载期已校验) ▼ ② 布雷 ──────── N = round(mine_density × (W×H − 9)) (先定数,9 = 出生 3×3 恒排除) │ 在"全格 − 出生 3×3"域经 board_gen 流均匀布雷 │ → 计算 0 格 flood 闭包及外扩 1 环 → 落在环内的雷移除 │ 【先布后删:只减不增、不重投、无迭代、确定性终止】 │ 实际雷数 |M| ≤ N;初始 3×3 及可达域内恒无雷;N ≥ 1 由加载期谓词保证 ▼ ③ 变异布置 ──── 先布雷后布雾(雾的 cell_constraint = safe_nonzero 要求雷先就位) │ 候选池门控 → cell_constraint 生成期强制 → 出生区及可达域排除 │ → 雾形硬边界(厚度≤2【任意 3×3 窗口非全雾】 / f≤8×mine_density) │ → 区域参数读行参数(region_count / target_ratio) ▼ ④ 生成-验证循环 ─ 布雾完成后测可推理率(F1) │ 实测 < target → 图内重试(同图种子实例内继续取数,不重开 scope) │ 上限 max_gen_attempts 次 → 三分支出口(见出口分发表) ▼ ⑤ 产出与上报 ── 棋盘 + 八项生成期指标集 ``` | 出口 | 触发 | 行为 | 埋点 | |---|---|---|---| | 达标即出 | 存在合法尝试满足两项判据(inferability ≥ target ∧ inferability_core ≥ target) | 出最早达标尝试 k*(非全局 argmax) | attempts_used 记录 | | 接受最优 | attempts 用尽、无达标但有合法尝试 | 出合法集内 inferability 最高者(tie 取最早、零额外取数)+ 降级标记 | 强告警埋点——运行期不死锁、开发期暴露参数问题 | | 接受最不坏 | attempts 用尽且零合法尝试 | 确定性劣度字典序(不可达安全格数, min_safe 缺口, 序号)最小者出图 + 非法产物标记 | 最高级告警——玩家永不卡死,红线由 F4 断言 A′ 批量守 | ## 生成管线与随机流纪律 规则: 1. 生成器在每次被调用时按固定五步跑完——读参数、布雷、布雾布变异、自检重试、交货;顺序冻结,不调换、不跳步。 2. 布雷时先按密度定死雷数 N = round(mine_density × (W×H−9)),再在"全格 − 出生 3×3"域均匀落位;0 格 flood 闭包外扩 1 环内的雷落完后移除——只减不增、不重投、无迭代;实际雷数 |M| ≤ N,漂移量入指标集观测;加载期拒绝 N < 1 的零雷板。 3. 生成一张图期间的每一次随机取数——布雷、雾形、选变异、重试——都从同一条 board_gen 流按顺序取;一张图只 open_stream 一次、用到底;流之外零随机,randomize() 禁用(静态扫描 AC-18);不重开 scope,attempt 边界 = 生成函数完整返回。 4. 行参数在生成开始时单次读取快照,生成期内不重读;生成期间表热重载不影响进行中的生成(EC7)。 5. 推理器/生成器内部异常(crash/不变式违例)一律 fatal 中止 + 告警——实现缺陷 fail-fast,不降级(EC10,与参数性降级区分)。 6. 同帧两次生成请求顺序串行、各自 open_stream 取号,不引入锁(EC14)。 五阶段失败语义: | 阶段 | 失败条件 | 语义 | |---|---|---| | 参数解析 | 行缺失 / 参数域违例 | 加载期校验已拦(D2);运行期不失败 | | 布雷 | N = 0 | 运行期不失败(域内 N ≥ 1 恒可布,零雷板加载期已拒) | | 变异布置 | cell_constraint 无解 | 静默降级:跳过变异、产物合法、shortfall 上报 | | 验证循环 | 三分支(F5) | 达标即出 / 接受最优 + 强告警 / 接受最不坏 + 最高级告警 + 非法产物标记 | | 产出 | —— | 棋盘 + 八项指标集 | 不变式:管线无状态、五阶段顺序冻结、生成期表值单次读取、attempt 边界 = scope 事件边界(重试不产生新取号);B1 编排不得把 attempt 边界当 scope 事件。 设计意图:无状态函数 + 单流取号是"同种子同参数必产同图"的根基。 ## 出生区与可达域 规则: 1. 开局站立的 3×3 出生区保证无雷;从出生区顺 0 格连锁能走到的地方再外扩一圈,构成生成期"可达域"(R₀ = 出生 3×3 ∪ 0 格 flood 闭包,外扩 1 环为保守上界),由生成器按固定定义确定性算出,不依赖挖掘系统运行时行为。 2. 可达域内永远不放变异;外扩环内可有雷、只禁变异(验收口径 AC-6(a));雾区邻接出生 3×3 合法——约束谓词只管出生 3×3 格集及可达域内无变异格,邻接不构成违反(EC3)。 3. 挖掘系统实际能展开的范围只会比可达域小、不会比它大——双包含回验登记 A2 GDD:① A2 实际展开域 ⊆ A1 排除域;② A1 求解器初始态 ⊆ A2 实际初始展开域(F1 注记④度量保真对偶;若 A2 定稿展开更小,A1 回退口径 = 出生 3×3 最小态)。 设计意图:可达域是"落点安全"与"变异不堵路"的保守几何保证,A4 Rule 7 的执行落点。 ## 变异布置与雾形边界 规则: 1. 生成器按固定顺序布置变异:先查候选池门控(消费 A4 variant_pool_gate),再把雾格放到允许的位置,最后守雾形硬边界。 2. 候选池为空(雾未解锁或 biome_tag 全不匹配)时,这张图静默布置为无变异图——空池合法非错误(EC1)。 3. 雾格只落在"8 邻含雷的非 0 安全格"(cell_constraint = safe_nonzero);出生区与可达域排除在外。 4. 雾形硬边界:任何 3×3 窗口不许全雾(雾皮厚度 ≤2);雾总量 ≤ 雷数 × 8(f ≤ 8×mine_density);摆几个雾区、每区目标多大读行参数(region_count / target_ratio)。 5. 布置无解(cell_constraint 连通分量不足)时静默降级:跳过变异、产物为合法无变异图;要求 N 区而实际达成 k Board`(+ 指标集);测试种子经 `derive_at("board_gen", σ)` 纯函数取号;夹具规格、黄金图回归向量协议、out-of-scope deferral 明细见推演件附录(本表沿用原 AC 编号,逐条完整判定口径同原文)。 | AC | Given | When | Then | |---|---|---|---| | AC-1 | 干净检出(默认根 = MVP 参考行) | 冒烟加载 Core Rules-3 表清单 | ConfigDB Ready:BoardGenTable 含 (1,0)/(2,0) 锚行(不断言行总数);九字段类型域断言;solver_rules = single_subset 唯一值断言;其余八 knob 字段仅域断言(期望由表读值推导);诊断收集器零 error 零 warning | | AC-2 | BoardGenTable schema class_name 直引程序构造行实例(每腿先 reset_diagnostics()) | validate() 作用于违例集(f>8d · count≥1∧f=0 · f≥1 · count=0∧f=正值 · f=0.30∧d=0.15 超 0.25 上限 · round 后布雷数=0 · attempts×W×H>16384 · F2b 违例 10×10/d=0.10/min_safe=92 · board_biome=∅)与合法集(count=0∧f=0 · f=8×d 恰界 · min_safe 恰界 · biome 占位词非空) | 违例集各含对应致命类别;合法集零诊断 | | AC-3 | 夹具根 a1_fog_domain / a1_min_safe / a1_biome_empty | 各以独立 headless 进程跑游戏通道 load_tables(root, collect_only=false) | 三进程均非 0 退出且错误清单完整;runner manifest 登记三项 →≠0 | | AC-4 | 默认根 L2 行与登记种子 σ₀ | generate(2, 0, rng) 以 derive_at("board_gen", σ₀) 播种流执行两遍;再以 σ₁≠σ₀ 同行生成 | 两遍产物格状态逐格相同 + 八项指标集全等(含 attempts_used);σ₁ 产物与 σ₀ 不全同 | | AC-5 | set_master_seed(42) 后 RngService 全真路径;夹具根 a1_high_target@2 | 以第 1、2 次 open_stream("board_gen") 实例分别驱动 generate;前后读只读计数器;同帧连续两次 generate(EC14) | 产物与 derive_at("board_gen", 0/1) 播种产物逐格相同;计数器差恰 1(重试不重开取号);同帧计数器差 2、各产物与各自 σ 播种一致(串行无锁) | | AC-6 | 缩样产物集(默认根 L1·D0/L2·D0 各 N=8;σᵢ = F4 公式缩样版 i∈[0,8)) | 对每板断言 | 全板全腿通过:(a) 出生 3×3 与 R₀ 芯(0 格 flood 闭包,测试侧朴素 BFS 重算)内零雷零变异;外扩 1 环内零变异、环内可有雷(禁断言环内零雷)(b) R₀ 芯内零变异(初始展开不触雾)(c) 雾格 ⊆ cell_constraint 合法集——非雷、非 0、8 邻含雷 (d) 任意 3×3 窗口非全雾 (e) 雾格数 ≤ 8×雷数 (f) \|S\| ≥ min_safe_count 表读值 (g) 非雷格数字 ≡ 8 邻雷数 (h) 全板零非法产物标记 | | AC-7 | Board class_name 直引程序构造板 | 合法性谓词作用于:雷墙包围孤立安全格板;\|S\|0 搜索种子,协议同 AC-12) | (a) 检查指标集;(b) generate | (a) 指标集含实际达成区数(shortfall)字段且 ≤ fog_region_count 表读值;(b) 降级标记=雾布置降级、shortfall < count 表读值、产物仍过 AC-6 全腿、error 级诊断零新增(静默降级——warning/埋点级不算违静默) | | AC-16 | 任意冒烟产物(AC-6/10/14/15 批次复用) | 指标完备性检查 + F1/F3 重算 | 八项指标字段完备(实际 inferability 含 metric_version=1 / inferability_core / 实际雾占比 = \|F\|÷(W×H) / 实际雷数与实际 \|S\| 并断言 \|M\| ≤ round(d×(W×H−9)) 表读值 / fog_burden_ratio / Δbudget_fog / attempts_used / 降级标记含非法产物标记+shortfall);inferability_core = \|R∞∖F\|÷max(1, \|S∖F\|) 重算一致;从产物重算 Chain₀/U → Δbudget_fog = \|U\|×dig_ap_cost(A3 表读值)、fog_burden_ratio 以整数对 (\|U\|, max(1, \|S∖Chain₀\|)) 比对;fog_region_count=0 行雾相关四值恒 0 且 core = inferability | | AC-17 | ConfigDB 加载完成(registry board_gen_table 条目与本 AC 同批回填——条目缺位即失败,非条件豁免) | 脚本解析 design/registry/entities.yaml 的 board_gen_table 条目 | 与 BoardGenTable 九字段定义(字段名/类型/域/knob 标记)逐一相等;值对账仅限非 knob 字段(solver_rules=single_subset);八 knob 字段值不对账(C3 调参豁免) | | AC-18 | A1 文件集(生成器/度量入口/谓词/schema/冒烟脚本) | 按 D2 AC-9 模式静态扫描 | 玩法代码文件集零 randomize()、零自建 RandomNumberGenerator 构造(tests/ 路径豁免,玩法文件集不豁免);零 ConfigDB 外 data 表加载(schema class_name 直引豁免);零 Control/场景类 import;AC-1 headless 实跑通过合成判定 | | AC-19 | A1 文件集 | 纳入 D2 AC-14 项目级人工三要素字面量扫描 | 人工三要素口径——无未登记字面量 | ## 版本历史 | 版本 | 日期 | 改动 | |---|---|---| | v2 | 2026-09-14 | 两件套迁移:按模板 v2 重排为 design(只收结论)+ analysis(`design/gdd/analysis/a1-board-generation.md`,收全部推演)——规则/枚举/公式结论/AC/EC/依赖/义务台账全部保留原编号与原值;推导论证、候选取舍、体验锚点论证、测试口径详表与覆盖矩阵移入 analysis;零规则变更、零数值变更 | | v1.1-lean | 2026-09-13 | 格式迁移:legacy 原稿按 lean 样例(docs/lean-gdd-sample-b1.md)重排——正文修订注记剥离收敛至本表;速览/体验锚点/枚举/边界情况/义务台账/覆盖矩阵/AC 转表格;生成管线转字符画 + 出口分发表;F1–F5 公式本体、Variables 与验算数据全保留;语义与 2026-09-09 修订批对齐,零规则变更 | | 2026-09-09 修订批 | 2026-09-09 | full /design-review 判 MAJOR REVISION NEEDED,8 条 blocking 同日修订:两项达标判据 + inferability_target 收窄 [0.85,1] 绝对锚;AC-6(a) 改写(环内可有雷);雷数取整钉死 + 布雷语义(先布后删)+ N≥1 零雷护栏;F2 ≡ Schema 跨字段校验合流(count=0 ⇒ f=0 腿);AC-11 前提腿(Lm(1)≠∅);断言 B 收紧为达成区占比;第三轴登记约定 + elite_/boss_ 后门;F2c 成本闸 16384 + 禁墙钟。cheap-now 包:σ 打包修复(10^9 + 2^20·L + 2^12·D)、F1 注记③改口(雾格入分子两通道)、\|U\|÷\|F\| 删承诺、monotone_in_depth + 断言 E、EC5 玩家侧语义登记。覆盖矩阵"无洞"自称修正为 5 处标注问题(已修 4 处,差分两项登记待核销)。日志:design/gdd/reviews/a1-board-generation-review-log.md | | v1 定稿 | 2026-09-08/09 | 一次会话定稿:五阶段管线 + F1–F5 + 三轴分离口径 + 19 条 AC + A4×15 逐项映射;四结构决策(生成-验证循环 / 接受最优 + 零合法接受最不坏 / 推理域 single_subset 冻结 / 密度浮点)与 F4 严格零红线为用户拍板;lean 门禁 CD-GDD-ALIGN 跳过,生产前人工复核体验锚点情绪定位 |