Source code for maverick.hand
from typing import Tuple, Iterator, Optional
from itertools import combinations
from pydantic import BaseModel
from .card import Card
from .utils import score_hand
from .enums import HandType
__all__ = ["Hand"]
[docs]
class Hand(BaseModel):
"""
Private cards plus as many community cards as needed to complete the hand.
Fields
------
private_cards : list[Card]
The private cards held by the player.
community_cards : list[Card]
The community cards on the table.
Examples
--------
>>> from maverick import Hand, Card
>>> hand = Hand(
... private_cards=[Card(suit='S', rank=14), Card(suit='H', rank=13)],
... community_cards=[Card(suit='D', rank=10), Card(suit='C', rank=11), Card(suit='H', rank=12)]
... )
>>> hand.score()
(HandType.STRAIGHT, 8.1234) # Example output, actual value may vary
>>> from maverick import Hand, Card, Deck
>>> deck = Deck.standard_deck(shuffle=True)
>>> private_cards = deck.deal(2)
>>> community_cards = deck.deal(5)
>>> hand = Hand(private_cards=private_cards, community_cards=community_cards)
>>> hand.score()
(HandType.FLUSH, 6.5678) # Example output, actual value may vary
"""
private_cards: list[Card]
community_cards: list[Card]
[docs]
def score(self) -> Tuple[HandType, float]:
"""Classifies and scores the hand.
Returns (HandType, float_score) where higher scores = stronger hands.
"""
all_cards = self.private_cards + self.community_cards
return score_hand(all_cards)
[docs]
@classmethod
def all_possible_hands(
cls, private_cards: list[Card], community_cards: Optional[list[Card]] = None
) -> Iterator["Hand"]:
"""Generate all possible hands."""
if community_cards is None:
for combination in combinations(private_cards, 5):
combo = list(combination)
yield cls(private_cards=combo[:2], community_cards=combo[2:])
else:
for combination in combinations(community_cards, 3):
yield cls(
private_cards=private_cards, community_cards=list(combination)
)
def __repr__(self) -> str:
private_cards = [card.utf8() for card in self.private_cards]
community_cards = [card.utf8() for card in self.community_cards]
return " ".join(private_cards + community_cards)