コード例 #1
0
ファイル: brain_bot.py プロジェクト: challenging/hearts-game
    def pick_card(self, data):
        self.is_first_play = True

        candidate_cards = []
        for card in data['self']['candidateCards']:
            candidate_cards.append(transform(card[0], card[1]))

        self.my_hand_cards = []
        for card_str in data['self']['cards']:
            card = transform(card_str[0], card_str[1])
            self.my_hand_cards.append(card)

        self.game.current_player_idx = self.player.position
        self.game._player_hands[self.player.position] = self.my_hand_cards

        played_card = self.game.players[self.player.position].play_card(
            self.game, self.other_info)

        message = "Pick Card:{}, Candicated Card: {}, Hand Card: {}".format(
            played_card, candidate_cards,
            self.game._player_hands[self.player.position])
        self.say(message)

        system_log.show_message(message)
        system_log.save_logs(message)

        return str(played_card)
コード例 #2
0
ファイル: brain_bot.py プロジェクト: challenging/hearts-game
    def receive_opponent_cards(self, data):
        self.my_hand_cards = self.get_cards(data)

        self.given_cards = []
        self.received_cards = []

        players = data['players']
        for player in players:
            player_name = player['playerName']
            if player_name == self.player_name:
                picked_cards = player['pickedCards']
                for card_str in picked_cards:
                    card = transform(card_str[0], card_str[1])
                    self.given_cards.append(card)

                receive_cards = player['receivedCards']
                for card_str in receive_cards:
                    card = transform(card_str[0], card_str[1])
                    self.received_cards.append(card)

                message = "User Name:{}, Given Cards:{}, Receive Cards:{}".format(
                    player_name, self.given_cards, receive_cards)
                self.say(message)

                system_log.show_message(message)
                system_log.save_logs(message)

                break
コード例 #3
0
ファイル: sample_bot.py プロジェクト: challenging/hearts-game
    def turn_end(self,data):
        turnCard = data['turnCard']
        turnCard = transform(turnCard[0], turnCard[1])

        turnPlayer = data['turnPlayer']
        players = data['players']
        is_timeout = data['serverRandom']

        for player in players:
            player_name = player['playerName']
            if player_name == self.player_name:
                current_cards = player['cards']
                for card in current_cards:
                    self.players_current_picked_cards.append(transform(card[0], card[1]))

                break

        self.round_cards[turnPlayer] = turnCard

        opp_pick = {}
        opp_pick[turnPlayer] = turnCard

        if (self.pick_his.get(turnPlayer)) is not None:
            pick_card_list=self.pick_his.get(turnPlayer)
            pick_card_list.append(turnCard)
            self.pick_his[turnPlayer]=pick_card_list
        else:
            pick_card_list = []
            pick_card_list.append(turnCard)
            self.pick_his[turnPlayer] = pick_card_list

        self.round_cards_history.append((turnPlayer, turnCard))
        self.pick_history(data, is_timeout, opp_pick)
コード例 #4
0
def run_one_step(current_round_idx, position, num_hand_cards, init_trick, hand_cards, is_hearts_broken, expose_info, cards,
                 score_cards=None, played_card=None, selection_func=random_choose, must_have={}, void_info={}):

    for trick_idx, (winner_index, trick) in enumerate(init_trick):
        for card_idx, card in enumerate(trick):
            for suit, rank in str_to_bitmask([card]).items():
                trick[card_idx] = [suit, rank]

    if played_card is not None:
        played_card = [SUIT_TO_INDEX[played_card.suit.__repr__()], NUM_TO_INDEX[played_card.rank.__repr__()]]

    simulations_cards = None
    if cards:
        simulation_cards = redistribute_cards(1, position, hand_cards, num_hand_cards, init_trick[-1][1], cards, must_have, void_info)
    else:
        simulation_cards = [hand_cards]

    for simulation_card in simulation_cards:
        card = one_step_simulation(current_round_idx, 
                                   position, 
                                   simulation_card, 
                                   copy.deepcopy(init_trick), 
                                   void_info,
                                   copy.deepcopy(score_cards), 
                                   is_hearts_broken, 
                                   expose_info, 
                                   played_card, 
                                   selection_func)

        #print("----->", card)
        return transform(INDEX_TO_NUM[card[1]], INDEX_TO_SUIT[card[0]])
コード例 #5
0
    def translate_hand_cards(self, hand_cards):
        cards = []

        for suit, ranks in hand_cards.items():
            bit_mask = NUM_TO_INDEX["2"]
            while bit_mask <= NUM_TO_INDEX["A"]:
                if hand_cards[suit] & bit_mask:
                    cards.append(transform(INDEX_TO_NUM[bit_mask], INDEX_TO_SUIT[suit]))

                bit_mask <<= 1

        return cards
コード例 #6
0
ファイル: sample_bot.py プロジェクト: challenging/hearts-game
    def get_cards(self, data):
        try:
            receive_cards = []
            players = data['players']
            for player in players:
                if player['playerName'] == self.player_name:
                    cards = player['cards']
                    for card in cards:
                        receive_cards.append(transform(card[0], card[1]))
                    break
            return receive_cards
        except Exception as e:
            system_log.show_message(e)

            return None
コード例 #7
0
    def translate_taken_cards(self, hand_cards):
        cards = []

        bit_mask = NUM_TO_INDEX["2"]
        while bit_mask <= NUM_TO_INDEX["A"]:
            if hand_cards[SUIT_TO_INDEX["H"]] & bit_mask:
                cards.append(transform(INDEX_TO_NUM[bit_mask], "H"))

            bit_mask <<= 1

        if hand_cards[SUIT_TO_INDEX["S"]] & NUM_TO_INDEX["Q"]:
            cards.append(Card(Suit.spades, Rank.queen))

        if hand_cards[SUIT_TO_INDEX["C"]] & NUM_TO_INDEX["T"]:
            cards.append(Card(Suit.clubs, Rank.ten))

        return cards
コード例 #8
0
ファイル: brain_bot.py プロジェクト: challenging/hearts-game
    def expose_my_cards(self, data):
        self.my_hand_cards = []
        for card in data["self"]["cards"]:
            self.my_hand_cards.append(transform(card[0], card[1]))

        is_exposed = self.player.expose_hearts_ace(self.my_hand_cards)
        expose_card = []
        if is_exposed:
            expose_card.append(str(Card(Suit.hearts, Rank.ace)))

        #    for card in self.my_hand_cards:
        #        if card == Card(Suit.hearts, Rank.ace):
        #            expose_card.append(str(card))

        #            break

        message = "Expose Cards:{}".format(expose_card)
        system_log.show_message(message)
        system_log.save_logs(message)

        return expose_card
コード例 #9
0
ファイル: brain_bot.py プロジェクト: challenging/hearts-game
    def pass_cards(self, data):
        cards = data['self']['cards']
        self.my_hand_cards = []

        for card_str in cards:
            card = transform(card_str[0], card_str[1])
            self.my_hand_cards.append(card)

        pass_cards = self.player.pass_cards(self.my_hand_cards,
                                            data["dealNumber"])
        self.proactive_mode = self.player.proactive_mode

        return_values = []
        for card in pass_cards:
            return_values.append(str(card))

        message = "Pass Cards:{}".format(return_values)
        system_log.show_message(message)
        system_log.save_logs(message)

        self.my_pass_card = return_values

        return return_values
コード例 #10
0
def run_simulation(seed,
                   current_round_idx,
                   position,
                   init_trick,
                   hand_cards,
                   is_hearts_broken,
                   expose_info,
                   cards,
                   score_cards=None,
                   played_card=None,
                   selection_func=random_choose,
                   must_have={},
                   void_info={},
                   proactive_mode=None,
                   simulation_time=0.93):

    simulation_time = max(simulation_time, 0.1)

    stime = time.time()

    for trick_idx, (winner_index, trick) in enumerate(init_trick):
        for card_idx, card in enumerate(trick):
            for suit, rank in str_to_bitmask([card]).items():
                trick[card_idx] = [suit, rank]

    if played_card is not None:
        played_card = [
            SUIT_TO_INDEX[played_card.suit.__repr__()],
            NUM_TO_INDEX[played_card.rank.__repr__()]
        ]

    simulations_cards = None
    if cards:
        simulation_cards = redistribute_cards(seed, position, hand_cards,
                                              init_trick[-1][1], cards,
                                              must_have, void_info)
    else:
        simulation_cards = [hand_cards]

    results, num_of_shoot_the_moon = defaultdict(list), defaultdict(int)
    for simulation_card in simulation_cards:
        card, scores, _, self_shoot_the_moon = simulation(
            current_round_idx, position, simulation_card,
            copy.deepcopy(init_trick), void_info, copy.deepcopy(score_cards),
            is_hearts_broken, expose_info, played_card, selection_func,
            proactive_mode)

        if card is None:
            continue

        card = tuple(card)

        sum_score = sum(scores)
        results[card].append(
            [scores[position] / sum_score, self_shoot_the_moon])

        if time.time() - stime > simulation_time or IS_DEBUG:
            break

    return dict([(transform(INDEX_TO_NUM[card[1]],
                            INDEX_TO_SUIT[card[0]]), info)
                 for card, info in results.items()])
コード例 #11
0
    hand_3 = "AH, 9D, 7C, 7D, 6S, 4H, 5D, 4C, 3D, 2D, AD, QH, KD".replace(
        " ", "")
    hand_4 = "JC, JS, TD, TS, 9C, 8D, 7S, 6D, 3C, 2C, KS, KH, AC".replace(
        " ", "")

    init_trick = [[None, []]]
    hand_1 = "6C, 7C, JC, QC, 2S, 5S, 6S, 9S, QS, AS, 6H, 7H, KH".replace(
        " ", "")
    hand_2 = "8C, AC, 3D, 4D, 7D, 8S, TS, JS, KS, 2H, 4H, 5H, QH".replace(
        " ", "")
    hand_3 = "4C, 2D, 5D, 8D, 9D, TD, JD, KD, 4S, 7S, 3H, 8H, AH".replace(
        " ", "")
    hand_4 = "2C, 3C, 5C, 9C, TC, KC, 6D, QD, AD, 3S, 9H, TH, JH".replace(
        " ", "")

    hand_cards = [[transform(card[0], card[1]) for card in hand_1.split(",")],
                  [transform(card[0], card[1]) for card in hand_2.split(",")],
                  [transform(card[0], card[1]) for card in hand_3.split(",")],
                  [transform(card[0], card[1]) for card in hand_4.split(",")]]

    myself_hand_cards = hand_cards

    cards = []

    played_card = None
    score_cards = None
    must_have = {}
    void_info = {}
    proactive_mode = None

    IS_DEBUG = True
コード例 #12
0
def run_simulation(seed, current_round_idx, position, num_hand_cards, init_trick, hand_cards, is_hearts_broken, expose_hearts_ace, cards,
                   score_cards=None, played_card=None, selection_func=random_choose, must_have={}, void_info={},
                   proactive_mode=None, simulation_time=0.93):

    simulation_time = max(simulation_time, 0.1)

    stime = time.time()

    for trick_idx, (winner_index, trick) in enumerate(init_trick):
        for card_idx, card in enumerate(trick):
            for suit, rank in str_to_bitmask([card]).items():
                trick[card_idx] = [suit, rank]

    if played_card is not None:
        played_card = [SUIT_TO_INDEX[played_card.suit.__repr__()], NUM_TO_INDEX[played_card.rank.__repr__()]]

    simulations_cards = None
    if cards:
        simulation_cards = redistribute_cards(seed, position, hand_cards, num_hand_cards, init_trick[-1][1], cards, must_have, void_info)
    else:
        simulation_cards = [hand_cards]

    results, num_of_shoot_the_moon = defaultdict(list), defaultdict(int)
    for simulation_card in simulation_cards:
        card, scores, _, self_shoot_the_moon = simulation(current_round_idx, 
                                                          position, 
                                                          simulation_card, 
                                                          copy.deepcopy(init_trick), 
                                                          void_info,
                                                          copy.deepcopy(score_cards), 
                                                          is_hearts_broken, 
                                                          expose_hearts_ace, 
                                                          played_card, 
                                                          selection_func,
                                                          proactive_mode)

        if card is None:
            continue

        card = tuple(card)

        rating = [0, 0, 0, 0]

        info = zip(range(4), scores)
        total_score = sum(scores)
        pre_score, pre_rating, sum_score = None, None, [score/total_score for score in scores]
        for rating_idx, (player_idx, score) in enumerate(sorted(info, key=lambda x: -x[1])):
            tmp_rating = rating_idx
            if pre_score is not None:
                if score == pre_score:
                    tmp_rating = pre_rating

            rating[player_idx] = (4-tmp_rating)/4 + sum_score[player_idx]

            pre_score = score
            pre_rating = tmp_rating

        #print(card, scores, rating, sum_score)
        results[card].append([rating[position], self_shoot_the_moon])

        if time.time()-stime > simulation_time or IS_DEBUG:
            break

    return dict([(transform(INDEX_TO_NUM[card[1]], INDEX_TO_SUIT[card[0]]), info) for card, info in results.items()])
コード例 #13
0
ファイル: brain_bot.py プロジェクト: challenging/hearts-game
    def expose_cards_end(self, data):
        expose_player, expose_card = None, None

        self.player_names, current_player_idx, players = [], None, []
        for player_idx, player in enumerate(data['players']):
            try:
                self.player_names.append(player["playerName"])

                p = None
                if self.player_names[-1] == self.player_name:
                    p = copy.deepcopy(self.pure_player)
                    current_player_idx = player_idx
                else:
                    p = SimplePlayer(verbose=False)

                p.name = self.player_names[-1]
                players.append(p)
            except Exception as e:
                system_log.show_message(e)
                system_log.save_logs(e)

        self.game = Game(players, verbose=False)
        self.player = self.game.players[current_player_idx]

        if self.proactive_mode:
            self.player.proactive_mode = self.proactive_mode
        else:
            self.player.evaluate_proactive_mode(self.game)

        idx = None
        deal_number = data["dealNumber"]
        if deal_number % 4 == 1:
            idx = (self.player.position + 1) % 4
            self.player.set_transfer_card(idx, self.given_cards)
        elif deal_number % 4 == 2:
            idx = (self.player.position + 3) % 4
            self.player.set_transfer_card(idx, self.given_cards)
        elif deal_number % 4 == 3:
            idx = (self.player.position + 2) % 4
            self.player.set_transfer_card(idx, self.given_cards)

        if idx is not None:
            self.say("pass card to {}, {}, {}", idx,
                     self.player.transfer_cards, self.given_cards)
        else:
            self.say("not passing card")

        if expose_player is not None and expose_card is not None:
            message = "Player:{}, Expose card:{}".format(
                expose_player, expose_card)
            self.game.expose_heart_ace = True
            self.player.set_transfer_card([
                idx for idx in range(4)
                if self.player_names[idx] == expose_player
            ][0], transform(expose_card[0], expose_card[1]))

            #print("expose", message, self.player.transfer_cards)

            system_log.show_message(message)
            system_log.save_logs(message)
            self.expose_card = True
        else:
            message = "No player expose card!"

            system_log.show_message(message)
            system_log.save_logs(message)
            self.expose_card = False