From c046cfab54f421ccb00ff16e7692bccba6deb371 Mon Sep 17 00:00:00 2001 From: ydy0615 Date: Sat, 27 Dec 2025 18:10:12 +0800 Subject: [PATCH] feat(backend): add Map class with BFS pathfinding and faster updates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Reduce `GameMap` update interval from 1000 ms to 10 ms for more responsive gameplay. - Introduce thread lock, update thresholds, and player‑to‑flag tracking variables for safer concurrent access. - Add `my_side_is_left` flag to determine team orientation. - Implement new `Map` class: * Builds a grid representation of the world, marking walls, enemy flag carriers, and allies. * Generates adjacency lists (`edge`) respecting safe‑zone rules. * Provides `guideance` method that runs a BFS (unit‑weight Dijkstra) to compute the shortest path and returns the first movement direction via `world.get_direction`. - Import `collections` for efficient deque usage. - Include compiled `.pyc` for the new module. These changes enable the policy to make quick, informed movement decisions based on real‑time map analysis. --- .../__pycache__/mypolicy.cpython-312.pyc | Bin 0 -> 9973 bytes CTF/backend/mypolicy.py | 129 +++++++++++++++--- 2 files changed, 111 insertions(+), 18 deletions(-) create mode 100644 CTF/backend/__pycache__/mypolicy.cpython-312.pyc diff --git a/CTF/backend/__pycache__/mypolicy.cpython-312.pyc b/CTF/backend/__pycache__/mypolicy.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..913dfd747d2c30ccc3d254b532b775cee317b9a8 GIT binary patch literal 9973 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 1: - move = world.get_direction(curr_pos, path[1]) - player_moves[p["name"]] = move + # path = world.route_to(curr_pos, dest, extra_obstacles=blockers) + + player_moves[p["name"]] = myMap.guideance(p["posX"],p["posY"],dest[0],dest[1]) return player_moves @@ -97,6 +191,5 @@ async def main(): print(f"Server Stopped: {e}") sys.exit(1) - if __name__ == "__main__": asyncio.run(main())