More requirements and another design
In a casino, the cards are often dealt from a shoe that has half a dozen decks of cards all mingled together. This consideration makes it necessary for us to build our own version of Deck
and not simply use an unadorned list
object.
Additionally, a casino shoe is not dealt fully. Instead, a marker card is inserted. Because of the marker, some cards are effectively set aside and not used for play.
The following is Deck
definition that contains multiple sets of 52-card decks:
class Deck3(list): def __init__(self, decks=1): super().__init__() for i in range(decks): self.extend( card6(r+1,s) for r in range(13) for s in (Club, Diamond, Heart, Spade) ) random.shuffle( self ) burn= random.randint(1,52) for i in range(burn): self.pop()
Here, we used the __init__()
superclass to build an empty collection. Then, we used self.extend()
to append multiple 52-card decks to the shoe. We could also use super().extend()
since we did not provide an overriding implementation in this class.
We could also carry out the entire task via super().__init__()
using a more deeply nested generator expression, as shown in the following code snippet:
( card6(r+1,s) for r in range(13) for s in (Club, Diamond, Heart, Spade) for d in range(decks) )
This class provides us with a collection of Card
instances that we can use to emulate casino blackjack as dealt from a shoe.
There's a peculiar ritual in a casino where they reveal the burned card. If we're going to design a card-counting player strategy, we might want to emulate this nuance too.