class Card: """A single card is represented by a rank and suit. Rank ranges between 0 and 12, and suit between 0 and 3. The representation for rank and suit are mapped through class variables, as is the value for rank.""" RankRepr = [ 'A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K' ] SuitRepr = [ 'S', 'H', 'D', 'C' ] RankValue = [ [ 1, 11 ], 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 ] def __init__(self, rank, suit): "Create card of suit and rank." self._rank = rank self._suit = suit def __str__(self): return '%s%s' % (self.RankRepr[self._rank], self.SuitRepr[self._suit]) def rank(self): return self.RankRepr[self._rank] def value(self): return self.RankValue[self._rank] def suit(self): return self.SuitRepr[self._suit] class Deck: """A deck consists of 13 cards in 4 suits.""" def __init__(self): "Create all cards using all rank and suit representations." self.cards = [] for rank in range(len(Card.RankRepr)): for suit in range(len(Card.SuitRepr)): card = Card(rank, suit) self.cards.append(card) self.nextCard = 0 def shuffle(self): "Put all cards back in deck and rearrange order." import random cards = [] while len(self.cards) > 1: card = random.choice(self.cards) cards.append(card) self.cards.remove(card) cards.append(self.cards[0]) self.cards = cards self.nextCard = 0 def remaining(self): "Returns number of unused cards remaining in deck." return len(self.cards) - self.nextCard def deal(self): "Remove top card in deck." card = self.cards[self.nextCard] self.nextCard = self.nextCard + 1 return card if __name__ == '__main__': def printDeck(deck): for r in range(13): for s in range(4): print deck.deal(), print deck = Deck() printDeck(deck) print deck.shuffle() printDeck(deck) print printDeck(deck)