#!/usr/bin/env python3 """verify_all_maps.py — 8 张地图全量离线验证: 加载+BFS+A* 通用性证明。 每张图: 已知锚点(或自动扫可走格) → BFS 最远可达点 → A* 2格步长规划 → 逐腿穿墙检查 → 报告耗时/腿数/结果。 """ from __future__ import annotations import sys import time from collections import deque sys.path.insert(0, "src") from pbot.bot.pathfind import LearnedGrid, astar, load_walls_from_map DIRS = [(0, -1), (1, -1), (1, 0), (1, 1), (0, 1), (-1, 1), (-1, 0), (-1, -1)] MAPS = [ ("等待地图", "0139.map", (24, 30)), ("比奇大城", "0.map", (330, 330)), ("盟重土城", "3.map", (342, 338)), ("天然洞穴一层", "d011.map", None), ("比奇矿区", "d401.map", (83, 10)), ("地牢一层东(蜈蚣洞穴)", "d601.map", (198, 28)), ("沃玛寺庙一层", "d022.map", None), ("生死之间", "d613.map", None), ] def pick_start(walls: set, w: int, h: int) -> tuple[int, int] | None: for y in range(h // 4, h * 3 // 4, 3): for x in range(w // 4, w * 3 // 4, 3): if (x, y) not in walls: return (x, y) return None def bfs_farthest(start: tuple[int, int], walls: set, w: int, h: int ) -> tuple[tuple[int, int], int, int]: visited = {start} dq = deque([(start, 0)]) far, far_d = start, 0 while dq: (x, y), d = dq.popleft() if d > far_d: far, far_d = (x, y), d for dx, dy in DIRS: n = (x + dx, y + dy) if n in visited or not (0 <= n[0] < w and 0 <= n[1] < h): continue if n in walls: continue visited.add(n) dq.append((n, d + 1)) return far, far_d, len(visited) def main() -> int: print(f"{'地图':<20} {'尺寸':<12} {'起点':<12} {'BFS最远点':<14} " f"{'可达格':<8} {'A*腿数':<8} {'穿墙':<5} {'耗时'}") print("-" * 100) all_ok = True for name, fname, anchor in MAPS: t0 = time.time() import struct with open(f"assets/maps/{fname}", "rb") as f: head = f.read(4) w, h = struct.unpack("