예제 #1
0
 def chase_player(self, player_tile):
     if self.counter != 0:
         if get_manhattan_distance(self.occupied_tile, player_tile) < 20:
             try:
                 tile_to_move = self.memory.pop()
             except (PathNotFound, IndexError):
                 tile_to_move = self.support_pathfinding(player_tile)
         else:
             adjacent_tiles = get_adjacent_reachable_tiles(
                 self.occupied_tile, self.world)
             if adjacent_tiles:
                 [tile_to_move] = random.sample(adjacent_tiles, 1)
             else:
                 tile_to_move = self.occupied_tile
     else:
         if get_manhattan_distance(self.occupied_tile, player_tile) < 20:
             self.memory = deque(self.find_best_tile_to_move(player_tile))
             if self.memory:
                 tile_to_move = self.memory.pop()
             else:
                 tile_to_move = self.support_pathfinding(player_tile)
         else:
             tile_to_move = self.support_pathfinding(player_tile)
     self.counter = (self.counter + 1) % 25
     self.move(tile_to_move.x, tile_to_move.y)
     self.attack()
예제 #2
0
 def support_pathfinding(self, target_tile):
     reachable_tiles = get_adjacent_reachable_tiles(self.occupied_tile,
                                                    self.world)
     if reachable_tiles:
         return min(
             reachable_tiles,
             key=lambda tile: get_manhattan_distance(tile, target_tile))
     else:
         return self.occupied_tile
예제 #3
0
 def find_best_tile_to_move(self, target_tile):
     reachable_tiles = get_adjacent_reachable_tiles(self.occupied_tile,
                                                    self.world)
     if reachable_tiles:
         return min(
             reachable_tiles,
             key=lambda tile: get_euclidean_distance(tile, target_tile))
     else:
         return self.occupied_tile
예제 #4
0
 def attack(self):
     neighbours = get_adjacent_reachable_tiles(self.occupied_tile,
                                               self.world)
     for neighbour in neighbours:
         if neighbour.occupied_by.__class__ == player.Player:
             neighbour.occupied_by.on_damage(self.base_attack)
             for neighbour in neighbours:
                 neighbour.mark_as_poisoned = 6
             self.hp = 0
             break
예제 #5
0
 def attack(self):
     neighbours = get_adjacent_reachable_tiles(self.occupied_tile,
                                               self.world)
     for neighbour in neighbours:
         if neighbour.occupied_by.__class__ == player.Player:
             neighbour.occupied_by.on_damage(self.base_attack)
             neighbour.mark_as_attacked_by_enemy = 2
             effect = pygame.mixer.Sound('sound/bite.ogg')
             effect.set_volume(0.1)
             effect.play()
             break
예제 #6
0
 def chase_player(self, player_tile):
     if get_manhattan_distance(self.occupied_tile, player_tile) < 35:
         best_tile = self.find_best_tile_to_move(player_tile)
         self.move(best_tile.x, best_tile.y)
     else:
         adjacent_tiles = get_adjacent_reachable_tiles(
             self.occupied_tile, self.world)
         if adjacent_tiles:
             [tile_to_move] = random.sample(adjacent_tiles, 1)
         else:
             tile_to_move = self.occupied_tile
         self.move(tile_to_move.x, tile_to_move.y)
     self.attack()
예제 #7
0
 def chase_player(self, player_tile):
     [tile_to_move] = random.sample(
         get_adjacent_reachable_tiles(self.occupied_tile, self.world), 1)
     self.move(tile_to_move.x, tile_to_move.y)
     self.attack()