def __init__(self, state): self.state = state self.mines = {} self.board = Board(state['game']['board']) self.heroes = [Hero(state['game']['heroes'][i]) for i in range(len(state['game']['heroes']))] self.hero = Hero(state['hero']) self.taverns = [] self.mines_locs = {} self.spawn_points_locs = {} self.taverns_locs = set([]) self.heroes_locs = {} self.walls_locs = [] self.url = None self.turn = None self.max_turns = None self.finished = None self.board_size = state['game']['board']['size'] self.turn = state['game']['turn'] self.max_turns = state['game']['maxTurns'] self.finished = state['game']['finished'] for row in range(len(self.board.tiles)): for col in range(len(self.board.tiles[row])): obj = self.board.tiles[row][col] if isinstance(obj, MineTile): self.mines_locs[(row, col)] = obj.heroId elif isinstance(obj, HeroTile): self.heroes_locs[(row, col)] = obj.id elif obj == vin.TAVERN: self.taverns_locs.add((row, col)) self.taverns.append(Tavern(row, col)) self.process_data(self.state)
class Game(object): """The game object that gather all game state informations""" def __init__(self, state): self.state = state self.mines = {} self.board = Board(state['game']['board']) self.heroes = [Hero(state['game']['heroes'][i]) for i in range(len(state['game']['heroes']))] self.hero = Hero(state['hero']) self.taverns = [] self.mines_locs = {} self.spawn_points_locs = {} self.taverns_locs = set([]) self.heroes_locs = {} self.walls_locs = [] self.url = None self.turn = None self.max_turns = None self.finished = None self.board_size = state['game']['board']['size'] self.turn = state['game']['turn'] self.max_turns = state['game']['maxTurns'] self.finished = state['game']['finished'] for row in range(len(self.board.tiles)): for col in range(len(self.board.tiles[row])): obj = self.board.tiles[row][col] if isinstance(obj, MineTile): self.mines_locs[(row, col)] = obj.heroId elif isinstance(obj, HeroTile): self.heroes_locs[(row, col)] = obj.id elif obj == vin.TAVERN: self.taverns_locs.add((row, col)) self.taverns.append(Tavern(row, col)) self.process_data(self.state) def update(self, state): size = state['game']['board']['size'] tiles = state['game']['board']['tiles'] heroes = state['game']['heroes'] self.turn = state['game']['turn'] for hero, hero_state in zip(self.heroes, heroes): hero.crashed = hero_state['crashed'] hero.mine_count = hero_state['mineCount'] hero.gold = hero_state['gold'] hero.life = hero_state['life'] hero.last_dir = hero_state.get('lastDir') hero.x = hero_state['pos']['y'] hero.y = hero_state['pos']['x'] for mine in self.mines: char = tiles[mine.x * 2 + mine.y * 2 * size + 1] mine.owner = None if char == '-' else int(char) def process_data(self, state): """Parse the game state""" self.set_url(state['viewUrl']) self.process_game(state['game']) def set_url(self, url): """Set the game object url var""" self.url = url def process_game(self, game): """Process the game data""" process = {'heroes': self.process_heroes} for key in game: if key in process: process[key](game[key]) def process_heroes(self, heroes): """Add heroes""" for hero in heroes: self.spawn_points_locs[(hero['spawnPos']['x'], hero['spawnPos']['y'])] = hero['id'] def has_enemy_pos(self, pos): enemy_heroes = filter(lambda x: x != self.hero.bot_id, self.heroes) for hero in enemy_heroes: if hero.pos == pos: return True return False def life_hero_at_pos(self, pos): enemy_heroes = filter(lambda x: x != self.hero.bot_id, self.heroes) for hero in enemy_heroes: if hero.pos == pos: return hero.life return 0 def cost(self, current, goal): if self.has_enemy_pos(goal): return 1 + self.life_hero_at_pos(goal) for x in self.board.neighbors(goal): if self.has_enemy_pos(x): return 1 + self.life_hero_at_pos(goal) // 2 else: return 1 def get_hero_by_pos(self, pos): return filter(lambda x: x.hero.pos == pos, self.heroes)