Parcourir la source

fix bresenham and improve shooting

olinox14 il y a 3 ans
Parent
commit
e8f41f0bd7
1 fichiers modifiés avec 15 ajouts et 16 suppressions
  1. 15 16
      cultist_war/main.py

+ 15 - 16
cultist_war/main.py

@@ -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}")