Moved hand_rank_name to hand_utils.py

This commit is contained in:
Donald Calloway 2025-09-19 18:57:07 -07:00
parent 689ac58a7d
commit 8dd2abb38c

View File

@ -20,6 +20,21 @@ class Card:
# return str(self) == str(other) # Alternative comparison method
# Other utility functions for hand evaluation
def hand_rank_name(rank: int) -> str:
names = {
9: "Royal Flush",
8: "Straight Flush",
7: "Four of a Kind",
6: "Full House",
5: "Flush",
4: "Straight",
3: "Three of a Kind",
2: "Two Pair",
1: "One Pair",
0: "High Card"
}
return names.get(rank, "Unknown Hand")
def get_rank_counts(ranks: List[int]) -> Counter:
return Counter(ranks)
@ -48,32 +63,32 @@ def evaluate_hand(hand: List[Card]) -> Tuple[int, List[int]]:
flush = is_flush(suits)
if flush and ranks == [14, 13, 12, 11, 10]:
return (9, ranks) # Royal Flush
return (9, hand_rank_name(9), ranks) # Royal Flush
if flush and straight:
return (8, ranks) # Straight Flush
return (8, hand_rank_name(8), ranks) # Straight Flush
if 4 in rank_counts.values():
four = max(rank for rank, count in rank_counts.items() if count == 4)
kicker = max(rank for rank in ranks if rank != four)
return (7, [four]*4 + [kicker]) # Four of a Kind
return (7, hand_rank_name(7), [four]*4 + [kicker]) # Four of a Kind
if 3 in rank_counts.values() and 2 in rank_counts.values():
three = max(rank for rank, count in rank_counts.items() if count == 3)
pair = max(rank for rank, count in rank_counts.items() if count == 2)
return (6, [three]*3 + [pair]*2) # Full House
return (6, hand_rank_name(6), [three]*3 + [pair]*2) # Full House
if flush:
return (5, ranks) # Flush
return (5, hand_rank_name(5), ranks) # Flush
if straight:
return (4, ranks) # Straight
return (4, hand_rank_name(4), ranks) # Straight
if 3 in rank_counts.values():
three = max(rank for rank, count in rank_counts.items() if count == 3)
kickers = sorted([rank for rank in ranks if rank != three], reverse=True)
return (3, [three]*3 + kickers) # Three of a Kind
return (3, hand_rank_name(3), [three]*3 + kickers) # Three of a Kind
if list(rank_counts.values()).count(2) == 2:
pairs = sorted([rank for rank, count in rank_counts.items() if count == 2], reverse=True)
kicker = max(rank for rank in ranks if rank not in pairs)
return (2, pairs*2 + [kicker]) # Two Pair
return (2, hand_rank_name(2), pairs*2 + [kicker]) # Two Pair
if 2 in rank_counts.values():
pair = max(rank for rank, count in rank_counts.items() if count == 2)
kickers = sorted([rank for rank in ranks if rank != pair], reverse=True)
return (1, [pair]*2 + kickers) # One Pair
return (0, ranks) # High Card
return (1, hand_rank_name(1), [pair]*2 + kickers) # One Pair
return (0, hand_rank_name(0), ranks) # High Card