47 lines
1.1 KiB
Python
47 lines
1.1 KiB
Python
class Card():
|
|
def __init__(self, name, deck):
|
|
self.name = name
|
|
self.deck = deck
|
|
|
|
def discard(self):
|
|
self.deck.discard(self)
|
|
return None
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
from random import randint
|
|
from typing import List
|
|
|
|
class Deck():
|
|
def __init__(self):
|
|
self._cards = self.load_cards()
|
|
self._discard = []
|
|
|
|
def load_cards(self) -> List[Card]:
|
|
raise NotImplemented()
|
|
|
|
def shuffle(self):
|
|
self._cards.extend(self._discard)
|
|
self._discard = []
|
|
|
|
# (ref:fisher-yates)
|
|
for old_slot, card in enumerate(reversed(self._cards)):
|
|
new_slot = randint(0, len(self._cards)-1)
|
|
self._cards[old_slot], self._cards[new_slot] = (
|
|
self._cards[new_slot], self._cards[old_slot]
|
|
)
|
|
|
|
def draw(self) -> Card:
|
|
if len(self._cards) == 0:
|
|
print("shuffle...")
|
|
self.shuffle()
|
|
|
|
return self._cards.pop()
|
|
|
|
def discard(self, card: Card):
|
|
self._discard.append(card)
|
|
|
|
def depth(self) -> int:
|
|
return len(self._cards)
|