|
|
@@ -384,9 +384,10 @@ class Grid(BaseClass):
|
|
|
f'go convert {",".join([str(t.id) for t in targets])}')
|
|
|
actions.put(priority, action)
|
|
|
|
|
|
- # Shoot
|
|
|
+ # Shoot opponent units
|
|
|
k_shoot_opponent_cultist = 8
|
|
|
k_shoot_opponent_cult_leader = 4
|
|
|
+ k_shoot_movement_needed = 15
|
|
|
|
|
|
for a in self.allied_cultists:
|
|
|
for u in self.opponent_units:
|
|
|
@@ -400,7 +401,7 @@ class Grid(BaseClass):
|
|
|
|
|
|
priority = (k_shoot_opponent_cult_leader if type(
|
|
|
u) is CultLeader else k_shoot_opponent_cultist) * shooting_distance
|
|
|
-
|
|
|
+ log(self.line_of_sight(a.pos, u.pos))
|
|
|
actions.put(priority, action)
|
|
|
else:
|
|
|
# la cible est hors de portée, mais elle est plus faible et sans soutien
|
|
|
@@ -431,10 +432,9 @@ class Grid(BaseClass):
|
|
|
continue
|
|
|
|
|
|
path, target = nearest_frontline[0]
|
|
|
- if not path or len(path) == 1:
|
|
|
+ if path:
|
|
|
+ log(f"{a.id} - {path} - {target}")
|
|
|
# already in place
|
|
|
- continue
|
|
|
-
|
|
|
priority = k0_position
|
|
|
priority += k_position_distance * len(path)
|
|
|
priority += k_position_danger * sum(self.threat[p] for p in path)
|
|
|
@@ -443,6 +443,11 @@ class Grid(BaseClass):
|
|
|
action = ActionMove(a, path[0], f'go to frontline {target} by {path}')
|
|
|
actions.put(priority, action)
|
|
|
|
|
|
+ # TODO: action 'take cover' pour les unités aussi
|
|
|
+ # TODO: action 'peace-keeping': tirer sur les neutres qu'on ne pourra pas convertir avant l'ennemi
|
|
|
+ # TODO: action 'intercept': une unité se place entre un tireur ennemi et le leader; en dernier recours
|
|
|
+ # TODO: action 'do nothing' : parfois, c'est la meilleure chose à faire
|
|
|
+
|
|
|
return actions
|
|
|
|
|
|
def in_grid(self, pos):
|
|
|
@@ -494,6 +499,10 @@ class Grid(BaseClass):
|
|
|
x0, y0 = start
|
|
|
x1, y1 = target
|
|
|
|
|
|
+ if y0 > y1:
|
|
|
+ # on fait toujours de bas en haut, du coup on inverse au besoin
|
|
|
+ x0, y0, x1, y1 = x1, y1, x0, y0
|
|
|
+
|
|
|
dx = abs(x1 - x0)
|
|
|
dy = abs(y1 - y0)
|
|
|
|
|
|
@@ -707,16 +716,6 @@ GRID.obstacles = [(x, y) for y, row in enumerate(obstacles_input) for x, val in
|
|
|
GRID.pre_compute()
|
|
|
|
|
|
while 1:
|
|
|
- # TODO: le bresenham est à revoir pour les tirs...
|
|
|
- # TODO : en cas de choix entre plusieurs neutres à convertir, privilégier un neutre se trouvant entre un ennemi et le leader
|
|
|
- # TODO: Laisser l'algo de découverte des cibles à convertir passer outre les alliés, ajouter une action "dégager le passage" pour ces unités
|
|
|
- # (prévoir le cas où cet allié ne peut pas se dégager). Le fait de passer outre un allié doit augmenter le coût de mouvement de 1
|
|
|
- # TODO : Etre plus prudent dans le positionnement des unités; ne pas s'attaquer à plus fort que soi, et décourager plus fortement l'entrée dans une
|
|
|
- # zone de menace
|
|
|
- # TODO: donner un coup à l'action "ne rien faire", car c'est parfois la meilleure chose à faire...
|
|
|
- # TODO: ajouter une action "s'interposer" où une unité s'interpose entre le leader et un ennemi ; à mettre en balance avec le 'take cover'
|
|
|
- # TODO: remplacer le discover par un algo qui cherche le plus court chemin pour relier tous les neutres les uns après les autres
|
|
|
-
|
|
|
GRID.reinit_round()
|
|
|
for _ in range(int(input())):
|
|
|
GRID.update_unit(*[int(j) for j in input().split()])
|
|
|
@@ -726,7 +725,7 @@ while 1:
|
|
|
|
|
|
actions = GRID.build_actions()
|
|
|
|
|
|
- print("\n" + GRID.graph(), file=sys.stderr)
|
|
|
+ # print("\n" + GRID.graph(), file=sys.stderr)
|
|
|
|
|
|
for action in actions.items:
|
|
|
log(f"* {action}")
|