def draw_discards(cards, ranklist): """ Calculates the approprate card to discard for any draw-type hands. """ if len(cards) != 5: raise ValueError('Card list needs to be 5 cards for a valid discard.') suit = ev.dominant_suit(cards) suit_count = ev.count_suit(cards, suit) # Check 4 card draws first # Flush draws if suit_count == 4: return ev.strip_suits(cards, suit) # Test for open-ended straight draw(s) OESD = ev.chk_straight_draw(cards, 4, 0) if OESD is not None: return extract_discards(cards, OESD) # Test for gutshot straight draw(s) GSSD = ev.chk_straight_draw(cards, 4, 1) if GSSD is not None: return extract_discards(cards, GSSD) # Draw to high cards (J+) if card.RANKS[ranklist[2].rank] > 10: highcards = ''.join([ranklist[i].rank for i in range(3)]) return ev.strip_ranks(cards, highcards) elif card.RANKS[ranklist[1].rank] > 10: highcards = ''.join([ranklist[i].rank for i in range(2)]) return ev.strip_ranks(cards, highcards) # Draw to an Ace # We'll generally draw to an Ace over any backdoor draws. if ranklist[0].rank == 'A': return ev.strip_ranks(cards, 'A') if suit_count == 3: # Backdoor flush draw return ev.strip_suits(cards, suit) # Backdoor straight draws are pretty desparate BDSD = ev.chk_straight_draw(cards, 3, 0) if BDSD is not None: return extract_discards(cards, BDSD) # 1-gap Backdoor straight draws are truly desparate! BDSD = ev.chk_straight_draw(cards, 3, 1) if BDSD is not None: return extract_discards(cards, BDSD) # Last ditch effort - just draw to the best 2. highcards = ''.join([ranklist[i].rank for i in range(2)]) return ev.strip_ranks(cards, highcards)
def test_stripranks_stripAces_containsNoAces(self): ace = card.Card('A', 's') king = card.Card('K', 'c') cards = [ace, king] expected = False result = ace in evaluator.strip_ranks(cards, ['A']) self.assertEqual(expected, result)
def made_hand_discards(hand, ranklist): """ Determine the best cards to discard for a given made hand. hand is a Hand object. """ PAT_HANDS = ['STRAIGHT', 'FLUSH', 'FULL HOUSE', 'STRAIGHT FLUSH', 'ROYAL FLUSH'] DIS_RANKS = ['PAIR', 'TRIPS', 'QUADS'] if hand.rank() in PAT_HANDS: return [] # Don't discard anything elif hand.rank() in DIS_RANKS: # standard discard paircard = ranklist[0].rank return ev.strip_ranks(hand.cards, paircard) elif hand.rank() == 'TWO PAIR': # Keep the two pair, discard 1. paircard = ranklist[0].rank + ranklist[1].rank return ev.strip_ranks(hand.cards, paircard)
def test_stripranks_stripAcesAndKings_containsNothing(self): cards = tools.convert_to_cards(['As', 'Kc']) expected = [] result = evaluator.strip_ranks(cards, ['A', 'K']) self.assertEqual(expected, result)