iter56-卡2:封印动作改版(迭代56卡2·受理即揭示): 规则核心(target_sealed挖封印格拒/清图口径=挖开∪封印/能清图的封最优先/notify_cleared清图收轮/sealed_identity撤出→BoardData.cell_identity——上限20用户裁)+结算面dug_under_seal删净+破封一击退役+呈现层(地板+身份字形+印记不依赖揭示态+文案四件)+探针V8-V10+sim域(标空封印剔除约束增强+错触直挖补偿注入0.10)+golden三图换代; MC同批重锚50/档=100局(2026-11-08用户批准)三方对照无结构性恶化; 高档审计通过(17行全量·审计后勘误2项闭环)

This commit is contained in:
DKChan committed 2026-11-08 03:47:33 +08:00
1 parent 908e518306
commit 5ec4a311bb
34 files changed
+589 -164

No files matched your search

+4 -1
View File
@@ -174,7 +174,10 @@ static func _constraints(minesweeper, board, mines: Dictionary) -> Array:
var known := 0
for n in board.neighbors8(c):
if minesweeper.has_seal(n):
known += 1
# 封印受理即揭示:封印格身份当场可查(测量侧镜像玩家可读信息——cell_identity 板事实单点)。
# 标中(雷)计已知雷;标空(安全格)=已完成格,剔除出约束(旧口径一律计已知雷=失真)。
if String(board.cell_identity(n).get("kind", "")) == "mine":
known += 1
elif not minesweeper.is_revealed(n):
if mines.has(n):
known += 1
+10 -7
View File
@@ -25,7 +25,8 @@ const BattleDriver := preload("res://sim/battle_driver.gd") # 庚案收敛:
# ── 普通档 v3 失误注入参数(踩雷期望=完美+2/板、每板少挖几个正确格)──
# 标雷→误挖转化率:主踩雷源=卡死赌挖(不确定性概率命中),误挖只作偶发真手滑——
# 真人几乎不挖自己封印的格(p 过高会让首轮已证封印变保底命中,非失误形态)
const NORMAL_MINE_SLIP_P := 0.10
const NORMAL_MISDIG_P := 0.10 # 错触直挖率(补偿注入——用户 2026-11-07 裁③:初值承旧注入 0.10,
# 标定目标=改前锚普通档踩雷读数量级;同批同码态锚只采一次,偏差记实现决定)
# 安全挖跳过率:每板安全格 ~70-90 × p ≈ 3-5 次漏挖(信息与推进双损失)
const NORMAL_SKIP_DIG_P := 0.05
# 空闲提前赌挖率:已证安全格在手时小概率先赌一格——完美系把不确定性攒到残局
@@ -471,7 +472,7 @@ static func _autoplay_battle(runner, settlement, st: Dictionary, logger) -> void
# 普通策略档 v3:完美策略 + 受控失误注入(标定依据=真人实证:
# 零加成真人首通三关踩 23 雷)。
# v3 语义 = 会玩的普通玩家:推理与完美档同源(subset 解算/封印/卡死刷新),失误只注入两手——
# 标雷误挖(NORMAL_MINE_SLIP_P)+ 安全挖跳过(NORMAL_SKIP_DIG_P)。连续拒绝 ≥3 = 编排违约防御。
# 错触直挖(NORMAL_MISDIG_P——标雷误挖换代名)+ 安全挖跳过(NORMAL_SKIP_DIG_P)。连续拒绝 ≥3 = 编排违约防御。
# 完美策略档:单步决策循环——move/dig/seal 经 排雷玩法 settle_batch 提交,
# refresh 经 settlement.player_request_refresh(战斗结算 核心编排:行动经济 扣 RAP + 退役 + 当场换新板),
# stop 出内环走统一停手提交。连续拒绝 ≥3 = 编排违约防御(fail-fast 语义,停手防死循环)。
@@ -503,9 +504,11 @@ static func _action_logger(st: Dictionary, logger) -> Callable:
st.refreshes = int(st.refreshes) + 1
elif ok and kind == "seal_place":
st.seal_placed = int(st.get("seal_placed", 0)) + 1 # 封印数(η 分母=全部封印数〔Q5〕;失误注入转化封印不计数=转化后实为挖)
# 普通档 v3 失误注入:三类——
# ①标雷误挖:把「封印已证雷」动作直接转成「挖该格」(真人手滑原型:知道是雷、位置点错,
# 踩雷吃伤且该雷奖励报废);期望踩雷增量 ≈ 每板已证雷数 × NORMAL_MINE_SLIP_P(目标完美+2/板)
# 普通档 v3 失误注入:三类(封印受理即揭示改版换代——①标雷误挖退役,等价补偿注入=错触直挖,
# 用户 2026-11-07 裁③)——
# ①错触直挖:把「封印已证雷」动作按概率转成「挖该格」(真人错触原型:判雷正确、手指落点成挖;
# 目标格当时未封未揭——新规则下挖未封格合法可执行,踩雷吃伤吃挖掘惩罚);期望踩雷增量 ≈
# 每板已证雷数 × NORMAL_MISDIG_P(初值承旧注入 0.10——标定目标=改前锚普通档踩雷读数量级)
# ②安全挖跳过:把「挖已证安全格」动作转成本轮停手(少挖几个正确的雷——信息与推进双损失)
# ③卡死赌挖:完美档无已证动作时刷新/停手拖轮次吃敌方垫刀(实证=完美档 41% 冒险成功;全败于慢玩
# 垫刀非踩雷)——真人会按概率赌一个边界格(用户实证口径「有些地方因为我看不到数字,也是盲挖
@@ -516,8 +519,8 @@ static func _apply_normal_slips(act: Dictionary, settlement, st: Dictionary) ->
if prng == null:
return act
var kind := String(act.get("kind", "stop"))
if kind == "seal" and prng.randf() < NORMAL_MINE_SLIP_P:
st.mine_slips = int(st.get("mine_slips", 0)) + 1
if kind == "seal" and prng.randf() < NORMAL_MISDIG_P:
st.mine_slips = int(st.get("mine_slips", 0)) + 1 # 计数字段沿用 mine_slips(锚对比列对齐)
return {"kind": "dig", "cell": act.get("cell")}
if kind == "dig":
var roll := prng.randf()