初始展开收窄批T0-T4(迭代14①):甲=剃雷域收窄(切比雪夫≤1+r 参数化 shave_ring_radius,r=1→5×5=25格,全域flood剃雷退役——零RNG消费变化同种子布雷逐位一致)+乙=R₀重掷闸(合法性闸序列 r0_cap_exceeded+同流重试+耗尽走三分出口accept_worst诚实降级+metrics r0_cap_rejected)+参数面(schema两列域校验[0,2]/[9,半板]加载期致命+19行投值)+calibrate扩r0方差/分位/闸触发列+参数透传;S1停机呈报已裁(用户方案A:10×10 cap 30→45——r=1自然R₀均值39>30锚结构性倒挂94%拒绝常态非法板,P1预案字面上调;12×12/13×13 43/51健康侧维持);断言面=+12(R₀≤cap结构/r0_cap_rejected在位/ring_removed≤剃雷域候选/cap压线9诚实降级/确定性两遍逐位)+夹具复核3处(relic候选身份kind|tier|relic_id按TP0 v2.2、商店购买笔数推导防GP流漂移);闸=冒烟767/0(755+12)

This commit is contained in:
DKChan committed 2026-10-05 08:19:41 +08:00
1 parent 3e2c564b59
commit 30cabbdf52
5 files changed
+160 -32

No files matched your search

+27 -7
View File
@@ -30,6 +30,10 @@ func generate(L: int, D: int, rng_stream: RandomNumberGenerator, db) -> BoardDat
"min_safe": int(row.min_safe_count),
"max_attempts": int(row.max_gen_attempts),
"board_type": String(row.board_type),
# 初始展开收窄批(迭代14① T1——两新参数;.get 缺省=legacy 调用方防御口径:shave_r=1 现行投值、
# r0_cap=0 闸关。正式表行全行投值,加载期校验在 BoardGenTable.validate)
"shave_r": int(row.get("shave_ring_radius", 1)),
"r0_cap": int(row.get("r0_max_cap", 0)),
}
var best_legal: BoardData = null
var best_legal_score := -1.0
@@ -38,6 +42,7 @@ func generate(L: int, D: int, rng_stream: RandomNumberGenerator, db) -> BoardDat
var attempts_used := 0
var accepted: BoardData = null
var accept_mode := ""
var r0_cap_rejected := 0
for k in range(1, params.max_attempts + 1):
attempts_used = k
var b := _attempt(params, rng_stream, db)
@@ -45,6 +50,9 @@ func generate(L: int, D: int, rng_stream: RandomNumberGenerator, db) -> BoardDat
if best_bad == null or _lex_less(badness, best_badness):
best_bad = b
best_badness = badness
# R₀≤cap 重掷闸触发计数(迭代14① T3——尝试事实,与合法性判定独立记录;占比=T5 闸触发率读数)
if int(params.r0_cap) > 0 and b.compute_r0().size() > int(params.r0_cap):
r0_cap_rejected += 1
if legality(b, params, db):
var m: Dictionary = measure_inferability(b) # 求解器每合法板恰一次(O3 收口——此前重复调用两次)
var inf: float = m["inferability"]
@@ -66,7 +74,7 @@ func generate(L: int, D: int, rng_stream: RandomNumberGenerator, db) -> BoardDat
accept_mode = "accept_worst"
accepted.illegal_product = true
push_error("[棋盘生成] attempts 耗尽零合法——接受最不坏出图 + 非法产物标记(玩家永不卡死)")
_finalize(accepted, params, attempts_used, accept_mode, db)
_finalize(accepted, params, attempts_used, accept_mode, db, r0_cap_rejected)
return accepted
@@ -99,12 +107,16 @@ func _attempt(params: Dictionary, rng_stream: RandomNumberGenerator, db) -> Boar
for i in range(0, mini(n_mines, domain.size())):
b.mines[domain[i]] = true
_compute_digits(b)
# 先布后删:0 格闭包(布后基准)外扩 1 环内的雷移除(只减不增、无迭代)
# 先布后删:剃雷域 = 距 spawn_center 切比雪夫距离 ≤1+r 的格(迭代14①收窄批 T2——原「R₀ flood 域∪
# 外扩 1 环」全域剃雷=开局开阔地巨大根因〔10×10 板 R₀ 均值 68.6=板面 68.6%〕;收窄后开阔地=
# 出生邻域外的自然 flood。r 读表 shave_ring_radius(r=1 → 5×5=25 格;r=0 即只剃出生 3×3)。
# 只减不增、无迭代语义不变;ring_removed 指标语义不变(现值变小=预期);零 RNG 消费变化——
# 同种子布雷序列逐位一致,仅移除域收窄。
var shave_r: int = int(params.get("shave_r", 1))
var ring := {}
for c in b.compute_r0():
for n in b.neighbors8(c):
if not ring.has(n):
ring[n] = true
for c in b.all_cells():
if maxi(absi(c.x - b.spawn_center.x), absi(c.y - b.spawn_center.y)) <= 1 + shave_r:
ring[c] = true
var removed := 0
for c in ring.keys():
if b.mines.has(c):
@@ -300,6 +312,12 @@ func _legality_faults(b: BoardData, params: Dictionary) -> Array:
var min_safe: int = int(params.get("min_safe", params.get("min_safe_count", 0)))
if b.safe_cells().size() < min_safe:
faults.append("min_safe_short")
# ⑤ R₀≤cap 重掷闸(迭代14①收窄批 T3——合法性先于质量评分,同 inv4 白给板先例;超阈整板作废
# 同流重试〔重试共用 board_gen 流,attempt 边界非 scope 事件〕;全部尝试超阈 → 既有三分出口
# accept_worst 诚实降级+非法产物标记(玩家永不卡死)。cap=0 = 闸关(legacy 调用方防御口径)
var r0_cap: int = int(params.get("r0_cap", 0))
if r0_cap > 0 and r0.size() > r0_cap:
faults.append("r0_cap_exceeded")
return faults
@@ -313,7 +331,7 @@ func _neighbor_mine_count(b: BoardData, c: Vector2i) -> int:
# ==================== 产出上报(生成期指标集) ====================
func _finalize(b: BoardData, params: Dictionary, attempts_used: int, accept_mode: String, _db) -> void:
func _finalize(b: BoardData, params: Dictionary, attempts_used: int, accept_mode: String, _db, r0_cap_rejected: int = 0) -> void:
var m := measure_inferability(b)
# 产物断言(棋盘生成 出生区安全与反退化布雷):实际雷数 ≤ 目标雷数 N——先布后删只减不增,失败即致命
var n_target: int = int(round(float(params.density) * float(params.w * params.h - BoardData.SPAWN_AREA_CELLS)))
@@ -332,6 +350,8 @@ func _finalize(b: BoardData, params: Dictionary, attempts_used: int, accept_mode
"illegal_product": accept_mode == "accept_worst",
"ring_removed": attempt_facts.get("ring_removed", 0),
"r0_count": m["r0"],
# R₀≤cap 重掷闸尝试事实(迭代14① T3——占比=T5 闸触发率读数,过高=甲乙配比失衡信号)
"r0_cap_rejected": r0_cap_rejected,
}
b.illegal_product = accept_mode == "accept_worst"
b.degraded_product = accept_mode == "accept_best"