示例#1
0
    def _conservative_pass(self, suit_dict):
        return_values = []
        asc_suit_amount = sorted(
            suit_dict.items(),
            key=lambda d: d[1])  #asc :[('S', 0), ('D', 1), ('C', 5), ('H', 7)]
        min_suit = asc_suit_amount[0][0]
        count = 0
        for card in self.my_hand_cards:  # already order in desc
            if card == Card("QS"):  # -13
                return_values.append(card.toString())
                count += 1
            elif card == Card("TC"):  # double your score in this deal
                return_values.append(card.toString())
                count += 1
            elif card.suit == min_suit:  # pass if it's min suit
                return_values.append(card.toString())
                count += 1
            elif card.suit_index == 2:  # pick Heart
                return_values.append(card.toString())
                count += 1
            if count == 3:
                break

        if count < 3:
            second_min_suit = asc_suit_amount[1][0]
            for card in self.my_hand_cards:
                if card.suit == second_min_suit:
                    return_values.append(card.toString())
                    count += 1
                if count == 3:
                    break

        self.my_pass_card = return_values
        return return_values
示例#2
0
    def get_round_scores(self, is_expose_card=False, data=None):
        player_shoot_moon = collections.defaultdict(bool)
        if data != None:
            for player in data["players"]:
                player_shoot_moon[
                    player["playerName"]] = player["shootingTheMoon"]
            players = data['roundPlayers']
            picked_user = players[0]  #init
            round_card = self.round_cards.get(picked_user)
            score_cards = []
            for i in range(len(players)):
                card = self.round_cards.get(players[i])
                if card in self.game_score_cards:
                    score_cards.append(card)
                if round_card.suit_index == card.suit_index:
                    if round_card.value < card.value:
                        picked_user = players[i]  #next
                        round_card = card
            if (self.score_cards.get(picked_user) != None):
                current_score_cards = self.score_cards.get(picked_user)
                score_cards += current_score_cards
            self.score_cards[picked_user] = score_cards
            self.round_cards = {}

        receive_cards = {}
        for key in self.pick_his.keys():
            picked_score_cards = self.score_cards.get(key)
            round_score = 0
            round_heart_score = 0
            is_double = False
            if picked_score_cards != None:
                for card in picked_score_cards:
                    if card in self.game_score_cards:
                        if card == Card("QS"):
                            round_score += -13
                        elif card == Card("TC"):
                            is_double = True
                        else:
                            round_heart_score += -1
                if is_expose_card:
                    round_heart_score *= 2
                round_score += round_heart_score
                if player_shoot_moon[key]:
                    round_score *= 4
                    round_score = abs(round_score)
                if is_double:
                    round_score *= 2
            receive_cards[key] = round_score
        return receive_cards
示例#3
0
    def pass_cards(self, data):
        cards = data['self']['cards']
        self.my_hand_cards = []
        suit_dict = collections.defaultdict(int)
        large_cards = 0
        for card_str in cards:
            card = Card(card_str)
            self.my_hand_cards.append(card)
            suit_dict[
                card.suit] += 1  # [('S', 5), ('D', 2), ('C', 4), ('H', 2)]
            if card.value > 10:
                large_cards += 1

        # aggressive
        if large_cards > 5:
            message = "Pass card with _shooting_the_moon_pass"
            self.system_log.show_message(message)
            self.system_log.save_logs(message)
            return self._shooting_the_moon_pass(suit_dict)
        # conservative
        else:
            message = "Pass card with _conservative_pass"
            self.system_log.show_message(message)
            self.system_log.save_logs(message)
            return self._conservative_pass(suit_dict)
示例#4
0
 def pick_card(self, data):
     me = data['self']['playerName']
     cadidate_cards = data['self']['candidateCards']
     # set strategy candidate cards
     self.strategy.set_candidates(cadidate_cards)
     out_round = []
     for player_name, out_turn_card in self.round_cards.items():
         out_round.append(out_turn_card)
     # set strategy round cards
     self.strategy.set_roundcards(out_round)
     message = "Me:{}, Candidates:{}, Roundcards:{}".format(
         me, cadidate_cards, out_round)
     self.system_log.show_message(message)
     self.system_log.save_logs(message)
     if self.player_dict[me]:
         predict_action = self.global_agent.predict_action(
             self.player_dict[me].state)
         message = "Me:{}, Predict Strategy No.{}".format(
             me, predict_action)
         # set action with predict action
         self.player_dict[me].set_action(predict_action)
         self.system_log.show_message(message)
         self.system_log.save_logs(message)
         predict_card, actual_action = self.strategy.dispatcher(
             predict_action)
         card_string = predict_card.toString()
         # set action with fallback(action) action could make model forever not know what a strategy affects to a state
         # self.player_dict[me].set_action(actual_action)
         message = "Me:{}, Strategy Fallback to No.{}".format(
             me, actual_action)
         self.system_log.show_message(message)
         self.system_log.save_logs(message)
         message = "Me:{}, Action Set: {}".format(
             me, self.player_dict[me].action)
         self.system_log.show_message(message)
         self.system_log.save_logs(message)
         message = "Me:{}, Predict Card:{}".format(me, card_string)
         self.system_log.show_message(message)
         self.system_log.save_logs(message)
         return card_string
     else:
         cards = data['self']['cards']
         self.my_hand_cards = []
         for card_str in cards:
             card = Card(card_str)
             self.my_hand_cards.append(card)
         message = "My Cards:{}".format(self.my_hand_cards)
         self.system_log.show_message(message)
         card_index = len(cadidate_cards) - 1  # pick smallest
         message = "Pick Card Event Content:{}".format(data)
         self.system_log.show_message(message)
         message = "Candidate Cards:{}".format(cadidate_cards)
         self.system_log.show_message(message)
         self.system_log.save_logs(message)
         message = "Pick Card:{}".format(cadidate_cards[card_index])
         self.system_log.show_message(message)
         self.system_log.save_logs(message)
         return cadidate_cards[card_index]
示例#5
0
 def expose_my_cards(self, yourcards):
     expose_card = []
     for card in self.my_hand_cards:
         if card == Card("AH"):
             expose_card.append(card.toString())
     message = "Expose Cards:{}".format(expose_card)
     self.system_log.show_message(message)
     self.system_log.save_logs(message)
     return expose_card
示例#6
0
 def _is_uni_suit(self, cards):
     suit = collections.defaultdict(list)
     if cards:
         for card in cards:
             c = Card(card)
             suit[c.suit] += 1
         if len(suit.keys()) == 1:
             return True
     return False
示例#7
0
 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(Card(card))
                 break
         return receive_cards
     except Exception as e:
         self.system_log.show_message(e)
         self.system_log.save_errors(e)
         return None
示例#8
0
    def turn_end(self, data):
        turnCard = data['turnCard']
        turnPlayer = data['turnPlayer']
        players = data['players']
        is_timeout = data['serverRandom']
        player_sample = self.player_dict[self.player_name]
        for player in players:
            if player['playerName'] == self.player_name:
                current_cards = player['cards']
                for card in current_cards:
                    self.players_current_picked_cards.append(
                        Card(card))  # self left hand cards

        self.round_cards[turnPlayer] = Card(
            turnCard
        )  # turnPlayer hand out turnCard. keep round_cards here {'P1':'3C', 'P2':'8C'}

        # if self.player_name == turnPlayer:
        #     player_sample.set_turn_card(Card(turnCard))
        #     message = "My Turn:{}. Pick {} State: {}".format(turnPlayer, turnCard, player_sample.state)
        #     self.system_log.show_message(message)
        #     self.system_log.save_logs(message)
        # else:
        player_sample.set_others_turn_card(Card(turnCard))
        message = "{}'s Turn:. Pick {}  Mark it used".format(
            turnPlayer, turnCard)
        self.system_log.show_message(message)
        self.system_log.save_logs(message)

        opp_pick = {}
        opp_pick[turnPlayer] = Card(turnCard)
        if (self.pick_his.get(turnPlayer)) != None:
            pick_card_list = self.pick_his.get(turnPlayer)
            pick_card_list.append(Card(turnCard))
            self.pick_his[turnPlayer] = pick_card_list
        else:
            pick_card_list = []
            pick_card_list.append(Card(turnCard))
            self.pick_his[turnPlayer] = pick_card_list
        self.round_cards_history.append(Card(turnCard))
示例#9
0
 def set_others_score_cards(self, oppo_label, scores):  # list
     for s in scores:
         s_card = Card(s)
         self.state[13 * s_card.suit_index + s_card.value -
                    2] = oppo_label  # 4 / 5 / 6
示例#10
0
 def set_score_cards(self, scores):  # list
     for s in scores:
         s_card = Card(s)
         self.state[13 * s_card.suit_index + s_card.value - 2] = 3
示例#11
0
 def set_hand_cards(self, hands):  # list
     for h in hands:
         h_card = Card(h)
         self.state[13 * h_card.suit_index + h_card.value - 2] = 1
示例#12
0
 def __init__(self, player_name, system_log):
     self.game_count = 0
     self.round_cards_history = []
     self.pick_his = {}
     self.round_cards = {}
     self.score_cards = {}
     self.player_name = player_name
     self.players_current_picked_cards = []
     self.game_score_cards = {
         Card("QS"),
         Card("TC"),
         Card("2H"),
         Card("3H"),
         Card("4H"),
         Card("5H"),
         Card("6H"),
         Card("7H"),
         Card("8H"),
         Card("9H"),
         Card("TH"),
         Card("JH"),
         Card("QH"),
         Card("KH"),
         Card("AH")
     }
     self.system_log = system_log
     self.state_size = 54
     self.action_size = 12  # strategy amount
     self.player_dict = collections.defaultdict(list)
     self.global_agent = A3CAgent(self.state_size, self.action_size)
     self.player_episodes = []
     self.strategy = None
示例#13
0
 def set_roundcards(self, round_cards):
     for r in round_cards:
         if isinstance (r, Card):
             self.round_cards.append(r)
         else:
             self.round_cards.append(Card(r))
示例#14
0
 def set_candidates(self, candi):
     for c in candi:
         self.candidates.append(Card(c))