def next_to_home(self, current_pos: Position, base: Position): if base == Position( current_pos.x, current_pos.y + 1) or base == Position( current_pos.x, current_pos.y - 1) or base == Position( current_pos.x + 1, current_pos.y) or base == Position( current_pos.x - 1, current_pos.y): return True return []
def cart_is_next_to_miner(self, curret_pos: Position): for miner in miner_positions: if miner == Position( curret_pos.x, curret_pos.y + 1) or miner == Position( curret_pos.x, curret_pos.y - 1) or miner == Position( curret_pos.x + 1, curret_pos.y) or miner == Position( curret_pos.x - 1, curret_pos.y): return miner return []
def is_next_to_enemy_outlaw(self, game_message: GameMessage, my_crew: Crew, my_outlaw: Unit): for crew in game_message.crews: if crew.id != my_crew.id: for enemy in crew.units: if enemy.type == UnitType.OUTLAW: if Position(my_outlaw.position.x + 1, my_outlaw.position.y) == enemy.position \ or Position(my_outlaw.position.x - 1, my_outlaw.position.y) == enemy.position \ or Position(my_outlaw.position.x, my_outlaw.position.y + 1) == enemy.position \ or Position(my_outlaw.position.x, my_outlaw.position.y - 1) == enemy.position: return enemy.position return False
def is_next_to_mine(self, game_message: GameMessage, pos: Position): directions = [[0, 1], [1, 0], [-1, 0], [0, -1]] for x, y in directions: if game_message.map.tiles[pos.x + x][pos.y + y] == "MINE": if pos not in miner_positions: miner_positions.append(pos) return Position(pos.x + x, pos.y + y) return []
def get_mine_list_sorted(self, game_message: GameMessage, base: Position): global mine_list temp = [] if game_message.tick == 0: for i, row in enumerate(game_message.map.tiles): for j, column in enumerate(row): if column == "MINE": temp.append(Position(i, j)) # sort by distance from base mine_list = self.sorted_list_based_on_distance(base, temp) return mine_list
def get_free_tile_around_mine(self, game_message: GameMessage, base: Position): # hide from people global available_spaces temp = [] directions = [[0, 1], [1, 0], [-1, 0], [0, -1]] for pos in mine_list: for x, y in directions: if game_message.map.tiles[pos.x + x][pos.y + y] == "EMPTY": temp.append(Position(pos.x + x, pos.y + y)) temp = self.sorted_list_based_on_distance(base, temp) available_spaces = self.list_filter_remove_people_tiles( temp, game_message)
def find_empty_positions(self, pos: Position, game_message: GameMessage, base: Position, my_crew: Crew, unit: Unit): directions = [[0, 1], [1, 0], [-1, 0], [0, -1]] y_length = len(game_message.map.tiles) x_length = len(game_message.map.tiles[0]) list_of_options = [] for x, y in directions: if game_message.map.tiles[(pos.x + x) % x_length][(pos.y + y) % y_length] == "EMPTY": list_of_options.append(Position(pos.x + x, pos.y + y)) if not list_of_options: return False temp = self.sorted_list_based_on_distance(base, list_of_options) el_list = self.list_filter_remove_people_tiles(temp, game_message) if not el_list: return None for error in my_crew.errors: if unit.id in error and unit.type == UnitType.CART and 'No path to' in error: return el_list[random.randint(0, len(el_list) - 1)] return el_list[0]
def get_random_position(self, map_size: int) -> Position: return Position(random.randint(0, map_size - 1), random.randint(0, map_size - 1))