feat(map): add side‑aware closest_in_range and refine enemy marking logic
- 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`.
This commit is contained in:
+34
-4
@@ -36,7 +36,6 @@ class Map:
|
|||||||
self.in_safe_zone = world.is_on_left((posx+1,posy)) == my_side_is_left
|
self.in_safe_zone = world.is_on_left((posx+1,posy)) == my_side_is_left
|
||||||
else:
|
else:
|
||||||
self.in_safe_zone = world.is_on_left((posx-1,posy)) == my_side_is_left
|
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)
|
enemy_players = world.list_players(mine=False, inPrison=False, hasFlag=None)
|
||||||
ally_players = world.list_players(mine=True, inPrison=False, hasFlag=None)
|
ally_players = world.list_players(mine=True, inPrison=False, hasFlag=None)
|
||||||
my_pos = self.convert_pos_to_index(posx, posy)
|
my_pos = self.convert_pos_to_index(posx, posy)
|
||||||
@@ -47,6 +46,14 @@ class Map:
|
|||||||
for enemy in enemy_players:
|
for enemy in enemy_players:
|
||||||
x, y = enemy["posX"], enemy["posY"]
|
x, y = enemy["posX"], enemy["posY"]
|
||||||
idx = self.convert_pos_to_index(x, y)
|
idx = self.convert_pos_to_index(x, y)
|
||||||
|
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
|
self.grid[idx] = 2
|
||||||
for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
|
for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
|
||||||
nx, ny = x + dx, y + dy
|
nx, ny = x + dx, y + dy
|
||||||
@@ -135,6 +142,21 @@ class Map:
|
|||||||
min_length = temp
|
min_length = temp
|
||||||
closest_pos = pos
|
closest_pos = pos
|
||||||
return closest_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()
|
myMap = Map()
|
||||||
def start_game(req):
|
def start_game(req):
|
||||||
global player_to_flag_assign,my_side_is_left
|
global player_to_flag_assign,my_side_is_left
|
||||||
@@ -160,6 +182,7 @@ def plan_next_actions(req):
|
|||||||
regard_list = []
|
regard_list = []
|
||||||
pretend_list = []
|
pretend_list = []
|
||||||
protect_list = []
|
protect_list = []
|
||||||
|
targets_list = []
|
||||||
for flags in enemy_flags:
|
for flags in enemy_flags:
|
||||||
flags_list.append((flags["posX"],flags["posY"]))
|
flags_list.append((flags["posX"],flags["posY"]))
|
||||||
for p in enemy_players_flags:
|
for p in enemy_players_flags:
|
||||||
@@ -168,6 +191,8 @@ def plan_next_actions(req):
|
|||||||
pretend_list.append((p["posX"],p["posY"]))
|
pretend_list.append((p["posX"],p["posY"]))
|
||||||
for flags in my_flags:
|
for flags in my_flags:
|
||||||
protect_list.append((flags["posX"],flags["posY"]))
|
protect_list.append((flags["posX"],flags["posY"]))
|
||||||
|
for t in my_targets:
|
||||||
|
targets_list.append((t[0],t[1]))
|
||||||
player_to_flag_assign = {
|
player_to_flag_assign = {
|
||||||
name: pos for name, pos in player_to_flag_assign.items()
|
name: pos for name, pos in player_to_flag_assign.items()
|
||||||
if name in active_player_names
|
if name in active_player_names
|
||||||
@@ -188,11 +213,17 @@ def plan_next_actions(req):
|
|||||||
|
|
||||||
for p in my_players:
|
for p in my_players:
|
||||||
if p["hasFlag"]:
|
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:
|
elif p["name"] in player_to_flag_assign:
|
||||||
dest = player_to_flag_assign[p["name"]]
|
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:
|
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:
|
if f is not None:
|
||||||
dest = (f[0],f[1])
|
dest = (f[0],f[1])
|
||||||
else:
|
else:
|
||||||
@@ -206,7 +237,6 @@ def plan_next_actions(req):
|
|||||||
else:
|
else:
|
||||||
continue
|
continue
|
||||||
player_moves[p["name"]] = myMap.guideance(p["posX"],p["posY"],dest[0],dest[1])
|
player_moves[p["name"]] = myMap.guideance(p["posX"],p["posY"],dest[0],dest[1])
|
||||||
|
|
||||||
return player_moves
|
return player_moves
|
||||||
|
|
||||||
def game_over(req):
|
def game_over(req):
|
||||||
|
|||||||
Reference in New Issue
Block a user