100 lines
2.3 KiB
Python
100 lines
2.3 KiB
Python
import random
|
|
|
|
class Card:
|
|
suits = ['♠', '♥', '♦', '♣']
|
|
ranks = list(range(1, 11)) + ['J', 'Q', 'K']
|
|
RANK_ORDER = {str(n): n for n in range(2, 11)}
|
|
RANK_ORDER.update({"A": 1, "J": 11, "Q": 12, "K": 13})
|
|
|
|
def __init__(self, rank, suit):
|
|
self.rank = rank
|
|
self.suit = suit
|
|
|
|
@property
|
|
def value(self):
|
|
if isinstance(self.rank, int):
|
|
return self.rank
|
|
return 10 if self.rank in ['J', 'Q', 'K'] else 1 # Ace low
|
|
|
|
def __repr__(self):
|
|
return f"{self.rank}{self.suit}"
|
|
|
|
|
|
class Deck:
|
|
def __init__(self):
|
|
self.cards = [Card(rank, suit) for suit in Card.suits for rank in Card.ranks]
|
|
random.shuffle(self.cards)
|
|
|
|
def draw(self):
|
|
return self.cards.pop() if self.cards else None
|
|
|
|
|
|
class DiscardPile:
|
|
def __init__(self):
|
|
self.cards = []
|
|
|
|
def top(self):
|
|
return self.cards[-1] if self.cards else None
|
|
|
|
def discard(self, card):
|
|
self.cards.append(card)
|
|
|
|
|
|
class Hand:
|
|
def __init__(self):
|
|
self.cards = []
|
|
|
|
def add(self, card):
|
|
self.cards.append(card)
|
|
|
|
def remove(self, card):
|
|
self.cards.remove(card)
|
|
|
|
def deadwood_points(self):
|
|
return sum(c.value for c in self.cards) # placeholder
|
|
|
|
def __repr__(self):
|
|
return f"Hand({self.cards})"
|
|
|
|
|
|
class Player:
|
|
def __init__(self, name):
|
|
self.name = name
|
|
self.hand = Hand()
|
|
|
|
def draw(self, deck, discard_pile, from_discard=False):
|
|
card = discard_pile.top() if from_discard else deck.draw()
|
|
if card:
|
|
self.hand.add(card)
|
|
if from_discard:
|
|
discard_pile.cards.pop()
|
|
return card
|
|
|
|
def discard(self, discard_pile, card):
|
|
self.hand.remove(card)
|
|
discard_pile.discard(card)
|
|
|
|
|
|
class Game:
|
|
def __init__(self, players):
|
|
self.deck = Deck()
|
|
self.discard_pile = DiscardPile()
|
|
self.players = players
|
|
|
|
def deal(self):
|
|
for _ in range(10):
|
|
for player in self.players:
|
|
player.hand.add(self.deck.draw())
|
|
self.discard_pile.discard(self.deck.draw())
|
|
|
|
def play_round(self):
|
|
# placeholder loop
|
|
self.deal()
|
|
print("Initial hands:")
|
|
for p in self.players:
|
|
print(p.name, p.hand)
|
|
|
|
|
|
|
|
|
|
|