# VERTICAL SLICE - NOT FOR PRODUCTION # Date: 2026-09-19 # 棋盘板形统计探针(清图支配性对账重跑批取数工具——判式"实测板形"口径的数据源): # 对 board_gen.tres 每行 (L, D) 生成 N 张板,统计幸存雷数 |M| 与安全格数 |S| # 的均值 / 最小 / 最大("先布后删"后的落地值——名义值 density×(W×H−9) 不含删除段)。 # 只读诊断,零游戏代码改动;装载面与冒险扫描工具同源(config_db.load_tables)。 # 运行:Godot_console.exe --headless --path . --script res://smoke/board_stat_probe.gd -- [N] [seed0] extends SceneTree func _initialize() -> void: var args := OS.get_cmdline_user_args() var n := 200 if args.size() >= 1 and args[0].is_valid_int(): n = maxi(10, int(args[0])) var seed0 := 9000 if args.size() >= 2 and args[1].is_valid_int(): seed0 = int(args[1]) var db = load("res://core/config_db.gd").new() if not db.load_tables("res://data/tables", false): print("表加载失败") quit(1) return var gen = load("res://core/board_generator.gd").new() print("=== 板形统计:N=%d/行 · 种子基 %d ===" % [n, seed0]) print("%-4s %-4s %-8s %-8s %-10s %-10s %-10s %-10s %-10s %-10s" % ["L", "D", "宽x高", "类型", "|M|均", "|M|min", "|M|max", "|S|均", "雷密度实测", "达标率"]) for row in db.board_gen.rows: var L: int = int(row.get("level_index", 0)) var D: int = int(row.get("node_depth", -1)) var w: int = int(row.get("board_width", 0)) var h: int = int(row.get("board_height", 0)) var btype := String(row.get("board_type", "")) var mine_counts: Array = [] var accepts := 0 for i in range(n): var rng = load("res://core/rng_service.gd").new() rng.set_master_seed(seed0 + L * 1000 + D * 100 + i) var stream: RandomNumberGenerator = rng.open_stream("board_gen") var board = gen.generate(L, D, stream, db) if board == null: continue mine_counts.append(board.mines.size()) if not board.illegal_product: accepts += 1 if mine_counts.is_empty(): print("%-4d %-4d 生成全败" % [L, D]) continue mine_counts.sort() var total := 0 for m in mine_counts: total += int(m) var mean_m := float(total) / float(mine_counts.size()) var mean_s := float(w * h) - mean_m print("%-4d %-4d %-8s %-8s %-10.2f %-10d %-10d %-10.2f %-10.4f %-10.3f" % [ L, D, "%dx%d" % [w, h], btype, mean_m, int(mine_counts[0]), int(mine_counts[mine_counts.size() - 1]), mean_s, mean_m / float(w * h), float(accepts) / float(mine_counts.size())]) quit(0)