Ejemplo n.º 1
0
 def has_suited_pockets(self, player_index):
     if Card.get_suit_int(
             self.pocket_cards[player_index][0]) == Card.get_suit_int(
                 self.pocket_cards[player_index][1]):
         return True
     else:
         return False
Ejemplo n.º 2
0
    def _get_observation(self, player):
        keys = ['position', 'state', 'stack', 'money_in_pot', 'bet_this_street', 'all_in']
        values = [
            [other.position, other.state, other.stack, other.money_in_pot, other.bet_this_street, other.all_in]
            for other in self.players if other is not player
        ]
        return {
            'self': {
                'position': player.position,
                'cards': [[Card.get_suit_int(card), Card.get_rank_int(card)] for card in player.cards],
                'stack': player.stack,
                'money_in_pot': player.money_in_pot,
                'bet_this_street': player.bet_this_street,
            },
            'table': {
                'street': int(self.street),
                'cards': [[Card.get_suit_int(card), Card.get_rank_int(card)] for card in self.cards],
                'pot': self.pot,
                'bet_to_match': self.bet_to_match,
                'minimum_raise': self.minimum_raise,
            },
            'others': [
                {
                    key: val
                    for key, val in zip(keys, value)
                }
                for value in values
            ]

        }
Ejemplo n.º 3
0
    def eval_trick_winner(self):

        trumps = []
        for card in self.playedCards:
            if Card.get_suit_int(card) == self.trumps:
                trumps.append(card)
        trumps.sort(reverse=True)

        if len(trumps) > 0:
            bestCard = trumps[0]

        else:
            leadSuits = []
            for card in self.playedCards:
                if Card.get_suit_int(card) == self.leadSuit:
                    leadSuits.append(card)
                leadSuits.sort(reverse=True)
                bestCard = leadSuits[0]

        winnerIndex = self.playedCards.index(bestCard)
        winner = self.playerOrder[winnerIndex]
        winner.trickCount += 1
        print('\n', winner.name, ' wins the trick with ',
              Card.print_pretty_card(bestCard))
        self.leadPlayer = winner
        self.playedCards = []
Ejemplo n.º 4
0
def find_swap(hand):

    s1 = Card.get_suit_int(hand[0])
    s2 = Card.get_suit_int(hand[1])

    if (s1 == s2):
        if (s1 == 1):
            return 0  #both are spades, do nothing
        else:
            return [int_to_char[s1] + 's']  #swap with spades

    elif (s1 == 1 or s2 == 1):

        if (s1 == 1):
            if (s2 != 2):
                return [int_to_char[s2] + 'h']
            else:
                return 0
        else:
            #some suit with spade
            if (s1 != 2):
                return [int_to_char[s1] + 'h', 'hs']
            else:
                #heart and spade
                return ['hs']

    elif (s1 == 2 or s2 == 2):  #no spades, hearts and something else
        if (s1 == 2):
            return [int_to_char[s2] + 's', 'sh']

        else:
            return [int_to_char[s1] + 's']

    else:
        return [int_to_char[s1] + 's', int_to_char[s2] + 'h']
Ejemplo n.º 5
0
def split_by_suit(cards):
    
    spades = []
    hearts = []
    diamonds = []
    clubs = []
    
    for card in cards:
        if Card.get_suit_int(card)==1:
            spades.append(card)
        elif Card.get_suit_int(card)==2:
            hearts.append(card)
        elif Card.get_suit_int(card)==4:
            diamonds.append(card)
        elif Card.get_suit_int(card)==8:
            clubs.append(card)
        else:
            return 'Card suit ERROR'
        
    all_suits = [spades,hearts,diamonds,clubs]
    
    suit_split = []
    for suit in all_suits:
        if len(suit)>0:
            suit_split.append(suit)
    
    suit_split.sort(key=len, reverse=True)
    
    return suit_split
Ejemplo n.º 6
0
 def is_flush(cards):
     suit = Card.get_suit_int(cards[0])
     is_flush = True
     for card in cards:
         if Card.get_suit_int(card) != suit:
             is_flush = False
             break
     return is_flush
Ejemplo n.º 7
0
 def __construct_preflop_key(self, card_strs):
     cards = sorted(Card.hand_to_binary(card_strs), reverse=True)
     #print Card.print_pretty_cards(cards)
     key = ''.join([Card.int_to_str(card)[0] for card in cards])
     if Card.get_suit_int(cards[0]) == Card.get_suit_int(cards[1]):
         key = key + "s"
     else:
         key = key + "o"
     return key
Ejemplo n.º 8
0
 def _get_valid_hand_cards(self, playing_cards, hand_cards):
     valid_hand_cards = hand_cards
     if len(playing_cards) > 0:
         trick_suit = Card.get_suit_int(playing_cards[0])
         valid_hand_cards = [
             c for c in hand_cards if Card.get_suit_int(c) == trick_suit
         ]
     if len(valid_hand_cards) == 0:
         valid_hand_cards = hand_cards
     return valid_hand_cards
Ejemplo n.º 9
0
def do_swap(card, swap):

    char_one = swap[0]
    char_two = swap[1]

    if (Card.get_suit_int(card) == char_to_int[char_one]):
        return Card.new(rank_int_to_char[Card.get_rank_int(card)] + char_two)
    else:
        return card
Ejemplo n.º 10
0
 def get_card_real_suit_int(self, card):
     suit = Card.get_suit_int(card)
     if suit == 1:
         return 1
     elif suit == 2:
         return 2
     elif suit == 4:
         return 3
     elif suit == 8:
         return 4
Ejemplo n.º 11
0
    def move(self, observation):

        # for Lookaheadplaystrategy
        if self._first_action_card is not None:
            first_action_card = self._first_action_card
            self._first_action_card = None
            return first_action_card

        number_of_playing_ids = len(observation['playing_ids'])
        valid_hand_cards = observation['valid_hand_cards']
        playing_cards = observation['playing_cards']
        valid_hand_ranks = [Card.get_rank_int(c) for c in valid_hand_cards]
        min_card_id = valid_hand_ranks.index(min(valid_hand_ranks))
        max_card_id = valid_hand_ranks.index(max(valid_hand_ranks))

        # if i am last player in this trick
        if number_of_playing_ids == observation['number_of_players'] - 1:
            first_suit = Card.get_suit_int(playing_cards[0])
            competitor_ranks = [
                Card.get_rank_int(c) for c in playing_cards
                if Card.get_suit_int(c) == first_suit
            ]
            max_suit = Card.get_suit_int(valid_hand_cards[max_card_id])
            punish_score = self._evaluator.calculate_score(playing_cards)
            # we do not have same suit card, so just drop max card. it does not get punish score
            if (max_suit != first_suit) or (punish_score == 0):
                return valid_hand_cards[max_card_id]
            # we will be the looser in this round, so just drop max card.
            elif valid_hand_ranks[min_card_id] > max(competitor_ranks):
                return valid_hand_cards[max_card_id]
            # drop the card which is not larger then biggest playing card.
            else:
                max_safe_card_id = min_card_id
                max_safe_rank = valid_hand_ranks[min_card_id]
                max_competitor_ranks = max(competitor_ranks)
                for tmp_card_id, r in enumerate(valid_hand_ranks):
                    if (r < max_competitor_ranks) and (r > max_safe_rank):
                        max_safe_rank = r
                        max_safe_card_id = tmp_card_id
                return valid_hand_cards[max_safe_card_id]
        # otherwise
        else:
            return valid_hand_cards[min_card_id]
Ejemplo n.º 12
0
def card_to_total_index(c):
    suit = Card.get_suit_int(c)
    # keeping 1 as is
    if suit == 2:
        suit = 0
    elif suit == 4:
        suit = 2
    elif suit == 8:
        suit = 3

    return Card.get_rank_int(c)*(suit+1)
Ejemplo n.º 13
0
    def move(self, observation):
        number_of_playing_ids = len(observation['playing_ids'])
        valid_hand_cards = observation['valid_hand_cards']
        playing_cards = observation['playing_cards']
        valid_hand_ranks = [Card.get_rank_int(c) for c in valid_hand_cards]
        min_card_id = valid_hand_ranks.index(min(valid_hand_ranks))
        max_card_id = valid_hand_ranks.index(max(valid_hand_ranks))

        # if i am last player in this trick
        if number_of_playing_ids == observation['number_of_players'] - 1:
            first_suit = Card.get_suit_int(playing_cards[0])
            competitor_ranks = [
                Card.get_rank_int(c) for c in playing_cards
                if Card.get_suit_int(c) == first_suit
            ]
            max_suit = Card.get_suit_int(valid_hand_cards[max_card_id])
            punish_score = self._evaluator.calculate_score(playing_cards)
            # we do not have same suit card, so just drop max card. it does not get punish score
            if (max_suit != first_suit) or (punish_score == 0):
                return valid_hand_cards[max_card_id]
            # we will be the looser in this round, so just drop max card.
            elif valid_hand_ranks[min_card_id] > max(competitor_ranks):
                return valid_hand_cards[max_card_id]
            # drop the card which is not larger then biggest playing card.
            else:
                max_safe_card_id = min_card_id
                max_safe_rank = valid_hand_ranks[min_card_id]
                max_competitor_ranks = max(competitor_ranks)
                for tmp_card_id, r in enumerate(valid_hand_ranks):
                    if (r < max_competitor_ranks) and (r > max_safe_rank):
                        max_safe_rank = r
                        max_safe_card_id = tmp_card_id
                return valid_hand_cards[max_safe_card_id]
        # apply monte carlo sampling to estimate win rate of valid hand cards
        else:
            simulated_scores = [
                self._simulate(card, observation) for card in valid_hand_cards
            ]
            best_card_id = simulated_scores.index(min(simulated_scores))
            return valid_hand_cards[best_card_id]
Ejemplo n.º 14
0
 def preflop(self):
     score = 0
     highest_card = max(Card.get_rank_int(self.hand[0]),
                        Card.get_rank_int(self.hand[1]))
     if highest_card == 12:
         score += 10
     elif highest_card == 11:
         score += 8
     elif highest_card == 10:
         score += 7
     elif highest_card == 9:
         score += 6
     elif highest_card <= 8:
         score += highest_card / 2 + 1
     if Card.get_rank_int(self.hand[0]) == Card.get_rank_int(self.hand[1]):
         score = score * 2
         if score < 5:
             score = 5
     if Card.get_suit_int(self.hand[0]) == Card.get_suit_int(self.hand[1]):
         score += 2
     if abs(
             Card.get_rank_int(self.hand[0]) -
             Card.get_rank_int(self.hand[1])) == 2:
         score -= 1
     elif abs(
             Card.get_rank_int(self.hand[0]) -
             Card.get_rank_int(self.hand[1])) == 3:
         score -= 2
     elif abs(
             Card.get_rank_int(self.hand[0]) -
             Card.get_rank_int(self.hand[1])) == 4:
         score -= 4
     elif abs(
             Card.get_rank_int(self.hand[0]) -
             Card.get_rank_int(self.hand[1])) >= 5:
         score -= 5
     if abs(Card.get_rank_int(self.hand[0]) - Card.get_rank_int(self.hand[1])) <= 2 \
             and highest_card < 10:
         score += 1
     return math.ceil(score)
Ejemplo n.º 15
0
    def available_moves(self, player):

        if self.leadPlayer == player:
            return player.cards
        else:
            lsCards = []
            for card in player.cards:
                if Card.get_suit_int(card) == self.leadSuit:
                    lsCards.append(card)
            if lsCards == []:
                return player.cards
            else:
                return lsCards
Ejemplo n.º 16
0
def transferCard(cards):
    try:
        result = []
        for i in cards:
            rank = Card.get_rank_int(i)
            suit = Card.get_suit_int(i)
            suit = int(math.log2(suit))
            result.append(suit * 13 + rank)
        print('cards = ', result)
        one_hot_encoding = np.zeros(52)
        one_hot_encoding[result] += 1
    except Exception as e:
        print(cards)
        one_hot_encoding = np.zeros(52)

    return one_hot_encoding
Ejemplo n.º 17
0
def convertCardToString(card):
    intSuit = Card.get_suit_int(
        card)  # Spade = 1, heart = 2, diamond = 4, club = 8
    intRank = Card.get_rank_int(
        card
    )  # 2 = 0, 3 = 1, 4 = 2, 5 = 3, 6 = 4, 7 = 5, 8 = 6,... J = 9, ... A = 12

    cardString = ""
    if (intRank < 8):
        cardString = str(intRank + 2)
    elif (intRank == 8):
        cardString = "T"
    elif (intRank == 9):
        cardString = "J"
    elif (intRank == 10):
        cardString = "Q"
    elif (intRank == 11):
        cardString = "K"
    elif (intRank == 12):
        cardString = "A"
    else:
        raise Exception(
            'intRank should not exceed 12. The value of intRank was: {}'.
            format(intRank))

    if (intSuit == 1):
        cardString = cardString + "s"
    elif (intSuit == 2):
        cardString = cardString + "h"
    elif (intSuit == 4):
        cardString = cardString + "d"
    elif (intSuit == 8):
        cardString = cardString + "c"
    else:
        raise Exception(
            'intSuit bad. The value of intSuit was: {}'.format(intSuit))

    return cardString
Ejemplo n.º 18
0
    def update_trumps(self):

        self.trumps = Card.get_suit_int(self.trumpCard)
Ejemplo n.º 19
0
 def suit(self):
     suit_int = Card.get_suit_int(self._card)
     return Card.INT_SUIT_TO_CHAR_SUIT[suit_int]
Ejemplo n.º 20
0
def purge_offsuits(item):
    a, b = item
    return Card.get_suit_int(a) == Card.get_suit_int(b)
Ejemplo n.º 21
0
 def GetCardInt(self, card):
     card_suit = Card.get_suit_int(card) - 1
     if card_suit == 7:  #Treys Clubs suit == 8-> From line above, if clubs, card_suit == 7 (Club_Suit-1 --> 8 - 1 == 7)
         card_suit = 2  #Correct the fact clubs suit should == 3, from first line (clubs_int - 1 == 2)
     return str((13 * card_suit) + Card.get_rank_int(card))
Ejemplo n.º 22
0
def pretty_print_hand(hand_cards, hand_type, table_cards, kicker):
    combined = []
    combined.extend(hand_cards)
    combined.extend(table_cards)
    values = [Card.get_rank_int(c) for c in combined]
    suits = [Card.get_suit_int(c) for c in combined]
    suit_ints = [1, 2, 4, 8]
    if hand_type == 'High Card':
        return 'High card %s' % singulars[max(values)]
    if hand_type == 'Pair':
        doubles = []
        for k, v in Counter(values).items():
            doubles.extend([k] * (v // 2))
        return 'a pair of %s' % plurals[max(doubles)]
    if hand_type == 'Two Pair':
        doubles = []
        for k, v in Counter(values).items():
            doubles.extend([k] * (v // 2))
        first = max(doubles)
        doubles.remove(first)
        second = max(doubles)
        return 'two pair, %s and %s' % (plurals[first], plurals[second])
    if hand_type == 'Three of a Kind':
        triples = []
        for k, v in Counter(values).items():
            triples.extend([k] * (v // 3))
        return 'three of a kind, %s' % plurals[max(triples)]
    if hand_type == 'Straight':
        # TODO: Fix this mess
        previous_value = None
        high = None
        low = None
        sequence = 1
        for value in reversed(sorted(set(values))):
            if previous_value is None:
                previous_value = value
                high = value
                continue
            elif value == previous_value - 1:
                sequence += 1
                if sequence == 4 and value == 0:
                    if 12 in values:
                        low = value
                        break
            else:
                sequence = 1
                high = value
            if sequence == 5:
                low = value
                break
            previous_value = value
        return 'a straight, %s to %s' % (singulars[low], singulars[high])
    if hand_type == 'Flush':
        # TODO: Fix this mess
        counts = np.array(
            [len([suit for suit in suits if suit == i]) for i in suit_ints])
        suit_i = int(np.argmax(counts))
        high = max([
            values[i] for i in range(len(values))
            if suits[i] == suit_ints[suit_i]
        ])
        return 'a flush, %s high' % singulars[high]
    if hand_type == 'Full House':
        triples = []
        for k, v in Counter(values).items():
            triples.extend([k] * (v // 3))
        doubles = []
        for k, v in Counter(values).items():
            doubles.extend([k] * (v // 2))
        return 'a full house, %s full of %s' % (plurals[max(triples)],
                                                plurals[max(doubles)])
    if hand_type == 'Four of a Kind':
        quads = []
        for k, v in Counter(values).items():
            quads.extend([k] * (v // 4))
        return 'four of a kind, %s' % plurals[max(quads)]
    if hand_type == 'Straight Flush':
        # TODO: Fix this mess
        counts = np.array(
            [len([suit for suit in suits if suit == i]) for i in suit_ints])
        suit_i = int(np.argmax(counts))
        correct_suit = [
            values[i] for i in range(len(values))
            if suits[i] == suit_ints[suit_i]
        ]

        previous_value = None
        high = None
        low = None
        sequence = 1
        for value in reversed(sorted(set(correct_suit))):
            if previous_value is None:
                previous_value = value
                high = value
                continue
            elif value == previous_value - 1:
                sequence += 1
                if sequence == 4 and value == 0:
                    if 12 in correct_suit:
                        low = value
                        break
            else:
                sequence = 1
                high = value
            if sequence == 5:
                low = value
                break
            previous_value = value
        return 'royal flush, %s to %s' % (singulars[low], singulars[high])
    raise Exception("Incorrect hand/table passed to pretty_print_hand")
Ejemplo n.º 23
0
 def update_lead_suit(self):
     if self.playedCards == []:
         pass
     else:
         self.leadSuit = Card.get_suit_int(self.playedCards[0])