Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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)
Beispiel #5
0
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