def play_start_agent_random_vs_mcts(): deck1, deck2 = build_decks() hero_1 = Hero(name='Agent', cost=0, abilities=dict(), attack=0, health=20, hero_class=None) hero_2 = Hero(name='MCTS', cost=0, abilities=dict(), attack=0, health=20, hero_class=None) first_player = Player(hero_1, [], deck1, [], []) second_player = Player(hero_2, [], deck2, [], []) state = State(first_player, second_player) state.draw_card() state.draw_card() state.switch_players() state.draw_card() state.draw_card() state.draw_card() turns = 1 root_wins = [] root_loses = [] best_child_wins = [] best_child_losses = [] visited_nodes = [] while not state.is_terminal: state.new_turn_for_one_player() state, path = get_random_state(state) #print("\n\nAction taken by {}: {}\n\n".format(state.current_player.name, path)) #print_state(state.get_player_by_name(hero_1.name), state.get_player_by_name(hero_2.name)) if state.is_terminal: break start_node = get_node_from_state(state) best_child = perform_mcts(start_node) state, path = best_child['state'], best_child['path'] root_wins.append(start_node['wins']) root_loses.append(start_node['losses']) best_child_wins.append(best_child['wins']) best_child_losses.append(best_child['losses']) visited_nodes.append(start_node['wins'] + start_node['losses']) #print("\n\nAction taken by {}: {}\n\n".format(state.current_player.name, path)) #print_state(state.get_player_by_name(hero_1.name), state.get_player_by_name(hero_2.name)) turns += 1 visited_nodes.append(start_node['wins'] + start_node['losses']) mcts_win = 1 if state.get_player_by_name('Agent').health == 0 else 0 #print_state(state.get_player_by_name(hero_1.name), state.get_player_by_name(hero_2.name)) return turns, root_wins, root_loses, best_child_wins, best_child_losses, visited_nodes, mcts_win
def sim(node): state = deepcopy(node['state']) node_player = state.current_player while not state.is_terminal: state, _ = get_random_state(state) state.new_turn_for_one_player() return node_player.name != state.current_player.name
def simulation(node, new_turn=True): state = deepcopy(node['state']) current_player = True while not state.is_terminal: state.switch_players() current_player = not current_player for card in state.current_player.board: card.summoning_sickness = False if new_turn: state.new_turn() new_turn = not new_turn state = get_random_state(state) return False if (state.current_player.hero.health <= 0 and current_player) \ or (state.current_player.hero.health > 0 and not current_player) else True
def test_random_moves(self): self.state.current_player.hand = [self.abusive_sergeant, self.agent_squire, self.selfless_hero, self.divine_strength] self.state.current_player.board = [deepcopy(self.abusive_sergeant), deepcopy(self.selfless_hero), deepcopy(self.steward_of_darshire)] for card in self.state.current_player.board: card.summoning_sickness = False self.state.opposite_player.hand = [deepcopy(self.abusive_sergeant), deepcopy(self.agent_squire), deepcopy(self.selfless_hero), deepcopy(self.divine_strength)] self.state.opposite_player.board = [deepcopy(self.abusive_sergeant), deepcopy(self.selfless_hero), deepcopy(self.steward_of_darshire)] self.state.current_player.mana = 1 np.random.seed(0) s, p = get_random_state(self.state) print(p)
def random_playoff(): deck1, deck2 = build_decks() hero_1 = Hero(name='Pamisio', cost=0, abilities=dict(), attack=0, health=20, hero_class=None) hero_2 = Hero(name='Pamewcia', cost=0, abilities=dict(), attack=0, health=20, hero_class=None) first_player = Player(hero_1, [], deck1, [], []) second_player = Player(hero_2, [], deck2, [], []) state = State(first_player, second_player) for i in range(2): state.draw_card() state.switch_players() for i in range(3): state.draw_card() state.switch_players() for mana in range(1, 10): state.draw_card() print("Player {}".format(1)) print("Hand: {}".format([(minion.name, minion.cost) for minion in state.current_player.hand])) for card in state.current_player.board: card.summoning_sickness = False state = get_random_state(state, mana) print("Player 1 health = {} \nPlayer 2 health = {}".format( state.current_player.hero.health, state.opposite_player.hero.health)) if state.is_terminal: break state.switch_players() state.draw_card() print("\nPlayer {}".format(2)) print("Hand: {}".format([(minion.name, minion.cost) for minion in state.current_player.hand])) for card in state.current_player.board: card.summoning_sickness = False state = get_random_state(state, mana) print("Player 1 health = {} \nPlayer 2 health = {}".format( state.opposite_player.hero.health, state.current_player.hero.health)) state.switch_players() print("\n----------------\n") if state.is_terminal: break