def __init__(self, game_state=GameState(), starting_armies=0): self.__state = game_state self.__starting_armies = starting_armies self.__attack_sampler = None self.__transfer_sampler = None self.__pick_starting_regions_sampler = None self.__deployment_sampler = None self.__place_logic = PlaceLogic(self.__state) # TODO remove self.__attack_logic = AttackLogic(self.__state) self.__transfer_logic = TransferLogic(self.__state)
class Game(object): def __init__(self, game_state=GameState(), starting_armies=0): self.__state = game_state self.__starting_armies = starting_armies self.__attack_sampler = None self.__transfer_sampler = None self.__pick_starting_regions_sampler = None self.__deployment_sampler = None self.__place_logic = PlaceLogic(self.__state) # TODO remove self.__attack_logic = AttackLogic(self.__state) self.__transfer_logic = TransferLogic(self.__state) def pick_starting_regions(self, pickable_regions): starting_regions = [] situation = self.__state.situation for i in range(0, 6): region, situation = self.__pick_starting_regions_sampler.best_sample(pickable_regions, situation) starting_regions.append(region) pickable_regions = [r for r in pickable_regions if r != region] return starting_regions def place_armies(self): return self.__place_logic.place_armies(self.__starting_armies) def make_moves(self): my_regions = self.__state.situation.get_player_regions(self.__state.player) moves = [] for region in my_regions: foreign_neighbors = self.__state.situation.foreign_neighbors(region, self.__state.player) if foreign_neighbors: moves += self.__attack_logic.attacks_for(region) else: moves += self.__transfer_logic.transfers_for(region) return moves def init_samplers(self): self.__attack_sampler = AttackSampler(self.__state.player_profile) self.__transfer_sampler = TransferSampler(self.__state.player_profile) self.__pick_starting_regions_sampler = PickStartingRegionsSampler(self.__state.player_profile) self.__deployment_sampler = DeploymentSampler(self.__state.player_profile) def process_command(self, input_command): output_commands = [] map = self.__state.map if isinstance(input_command, SuperRegionsCmd): map.init_super_regions(input_command.super_region_to_reward()) elif isinstance(input_command, RegionsCmd): map.init_regions(input_command.region_to_super_region()) elif isinstance(input_command, NeighborsCmd): map.init_neighbors(input_command.region_to_neighbors()) # After this command, we have a fully initialized map, so we can create a situation self.__state.init_situation() self.init_samplers() elif isinstance(input_command, PickStartingRegionsRequestCmd): output_commands = [PickStartingRegionsCmd(' '.join(self.pick_starting_regions(input_command.regions())))] elif isinstance(input_command, UpdateMapCmd): for region in self.__state.situation.get_player_regions(self.__state.player): region.owner = self.__state.opponent for update in input_command.map_updates(): self.__state.situation.update_map(update) elif isinstance(input_command, OpponentMovesCmd): for command in input_command.opponent_commands(): if isinstance(command, PickStartingRegionsCmd): self.__state.situation.update_opponent_picked_regions(command.regions()) elif isinstance(command, MoveCmd): self.__state.situation.update_opponent_moved(command.move(), self.__state.player) elif isinstance(command, PlaceArmiesCmd): self.__state.situation.update_opponent_placed_armies(command.placed_armies()) else: pass elif isinstance(input_command, BotNameCmd): self.__state.player = input_command.bot_name() elif isinstance(input_command, OpponentNameCmd): self.__state.opponent = input_command.bot_name() elif isinstance(input_command, StartingArmiesCmd): self.__starting_armies = input_command.num_armies() elif isinstance(input_command, PlaceArmiesRequestCmd): output_commands = [PlaceArmiesCmd(placed.output()) for placed in self.place_armies()] if not output_commands: output_commands = [DontMoveCmd()] elif isinstance(input_command, MoveRequestCmd): output_commands = [MoveCmd(move.output()) for move in self.make_moves()] if not output_commands: output_commands = [DontMoveCmd()] else: raise UnknownCommandException(input_command) return output_commands