From 942bb1580d94b912b5df1496b81304f2f5add529 Mon Sep 17 00:00:00 2001 From: ydy0615 Date: Sun, 28 Dec 2025 09:35:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(map):=20add=20side=E2=80=91aware=20closest?= =?UTF-8?q?=5Fin=5Frange=20and=20refine=20enemy=20marking=20logic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Removed leftover debug `print` statement. - Updated enemy marking to consider team side, preventing marking of opponents on the opposite side. - Introduced `closest_in_range` method to find the nearest position while respecting map side boundaries. - Integrated the new method into `plan_next_actions` to select destinations based on distance thresholds for flag carriers and assigned players. - Added handling for `my_targets` via a dedicated `targets_list`. --- CTF/backend/mypolicy.py | 46 ++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/CTF/backend/mypolicy.py b/CTF/backend/mypolicy.py index 9cc5a00..f740faf 100644 --- a/CTF/backend/mypolicy.py +++ b/CTF/backend/mypolicy.py @@ -36,7 +36,6 @@ class Map: self.in_safe_zone = world.is_on_left((posx+1,posy)) == my_side_is_left else: self.in_safe_zone = world.is_on_left((posx-1,posy)) == my_side_is_left - print(my_side_is_left) enemy_players = world.list_players(mine=False, inPrison=False, hasFlag=None) ally_players = world.list_players(mine=True, inPrison=False, hasFlag=None) my_pos = self.convert_pos_to_index(posx, posy) @@ -47,10 +46,18 @@ class Map: for enemy in enemy_players: x, y = enemy["posX"], enemy["posY"] idx = self.convert_pos_to_index(x, y) - self.grid[idx] = 2 - for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]: - nx, ny = x + dx, y + dy - self.grid[self.convert_pos_to_index(nx,ny)] = 2 + if my_side_is_left: + if not world.is_on_left((x+1,y)): + self.grid[idx] = 2 + for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]: + nx, ny = x + dx, y + dy + self.grid[self.convert_pos_to_index(nx,ny)] = 2 + else: + if world.is_on_left((x-1,y)): + self.grid[idx] = 2 + for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]: + nx, ny = x + dx, y + dy + self.grid[self.convert_pos_to_index(nx,ny)] = 2 for y in range(self.height): for x in range(self.width): idx = self.convert_pos_to_index(x, y) @@ -135,6 +142,21 @@ class Map: min_length = temp closest_pos = pos return closest_pos + def closest_in_range(self, posx_start, posy_start, positions): + closest_pos = None + min_length = float('inf') + for pos in positions: + if my_side_is_left: + if pos[0] >= self.width // 2: + continue + else: + if pos[0] < self.width // 2: + continue + temp = self.length(posx_start, posy_start, pos[0], pos[1]) + if temp != -1 and temp < min_length: + min_length = temp + closest_pos = pos + return closest_pos,min_length myMap = Map() def start_game(req): global player_to_flag_assign,my_side_is_left @@ -160,6 +182,7 @@ def plan_next_actions(req): regard_list = [] pretend_list = [] protect_list = [] + targets_list = [] for flags in enemy_flags: flags_list.append((flags["posX"],flags["posY"])) for p in enemy_players_flags: @@ -168,6 +191,8 @@ def plan_next_actions(req): pretend_list.append((p["posX"],p["posY"])) for flags in my_flags: protect_list.append((flags["posX"],flags["posY"])) + for t in my_targets: + targets_list.append((t[0],t[1])) player_to_flag_assign = { name: pos for name, pos in player_to_flag_assign.items() if name in active_player_names @@ -188,11 +213,17 @@ def plan_next_actions(req): for p in my_players: if p["hasFlag"]: - dest = my_targets[0] + dest,temp = myMap.closest_in_range(p["posX"],p["posY"],my_targets) + f,lentime = myMap.closest_in_range(p["posX"],p["posY"],regard_list) + if (f is not None) and (lentime<=5): + dest = (f[0],f[1]) elif p["name"] in player_to_flag_assign: dest = player_to_flag_assign[p["name"]] + f,lentime = myMap.closest_in_range(p["posX"],p["posY"],regard_list) + if f is not None and lentime<=10: + dest = (f[0],f[1]) else: - f = myMap.closest(p["posX"],p["posY"],regard_list) + f,temp = myMap.closest_in_range(p["posX"],p["posY"],regard_list) if f is not None: dest = (f[0],f[1]) else: @@ -206,7 +237,6 @@ def plan_next_actions(req): else: continue player_moves[p["name"]] = myMap.guideance(p["posX"],p["posY"],dest[0],dest[1]) - return player_moves def game_over(req):