from itertools import product from typing import List from cardy.deck import Card from cardy.deck import Pile from cardy.deck import WildCard # SUITES is a collection of tuples with suites and their colors SUITS = ( ("diamonds", "red"), ("hearts", "red"), ("clubs", "black"), ("spades", "black"), ) # FACES maps special values to their face names FACES = { 11: "Jack", 12: "Queen", 13: "King", 14: "Ace", -1: "Joker", } class PlayingCard(Card): @property def face(self) -> str: return FACES.get(self.value, str(self.value)) def __str__(self) -> str: return ( f"[{self.face.capitalize()} of {self.suit.capitalize()} " f"({self.color.capitalize()})]" ) class Joker(WildCard, PlayingCard): def __str__(self) -> str: return "[Joker]" class Deck(Pile): def __init__(self, num_jokers: int = 0, aces_high: bool = False): cards: List[PlayingCard] = [] card_values = range(2, 15) if aces_high else range(1, 14) for c in product(card_values, SUITS): cards.append( PlayingCard( value=c[0], suit=c[1][0], color=c[1][1], ) ) for _ in range(0, num_jokers): cards.append(Joker()) super().__init__(cards2)