from __future__ import annotations
import random
from typing import List
from texasholdem.card import card
from texasholdem.card.card import Card
[docs]
class Deck:
"""
Class representing a deck. The first time we create, we seed the static
deck with the list of unique card integers. Each object instantiated simply
makes a copy of this object and shuffles it.
"""
_FULL_DECK: List[Card] = []
def __init__(self):
self.cards = Deck._get_full_deck()
self.shuffle()
[docs]
def shuffle(self) -> None:
"""
Shuffles the remaining cards in the deck.
"""
random.shuffle(self.cards)
[docs]
def draw(self, num=1) -> List[Card]:
"""
Draw card(s) from the deck. These cards leave the deck and are not saved.
Args:
num (int): How many cards to draw. Defaults to 1.
Returns:
List[Card]: A list of length n of cards (See :class:`~texasholdem.card.card.Card`).
Raises:
ValueError: If the deck size is less than the given n.
"""
if len(self.cards) < num:
raise ValueError(
f"Cannot draw {num} cards from deck of size {len(self.cards)}"
)
cards = self.cards[:num]
self.cards = self.cards[num:]
return cards
def __str__(self) -> str:
return card.card_list_to_pretty_str(self.cards)
@staticmethod
def _get_full_deck() -> List[Card]:
if Deck._FULL_DECK:
return list(Deck._FULL_DECK)
# create the standard 52 card deck
for rank in Card.STR_RANKS:
for suit in Card.CHAR_SUIT_TO_INT_SUIT:
Deck._FULL_DECK.append(Card(rank + suit))
return list(Deck._FULL_DECK)
[docs]
def copy(self, shuffle: bool = True) -> Deck:
"""
Make a copy of the deck
Args:
shuffle (bool): Shuffle the deck when copying, defaults to true
Returns:
Deck: A copy of the deck
"""
deck = Deck()
deck.cards = self.cards.copy()
if shuffle:
deck.shuffle()
return deck
def __copy__(self):
return self.copy(shuffle=False)
def __deepcopy__(self, memodict=None):
memodict = memodict if memodict else {}
return self.copy(shuffle=False)