Example #1
0
class DeckManager:
    def __init__(self):
        self.unused = Deck((Card(n, s) for n, s in itertools.product(
            constants.STANDARD_CARDS, constants.STANDARD_SUITS)))
        self.discard, self.active = Deck(), Deck()
        self.Reset()

    # moves cards between decks
    def _move(self, source, dest, card):
        source.Draw(card)
        dest.Append(card)

    def _combine(self, dest, *sources):
        for source in sources:
            while not source.Empty():
                dest.Append(source.Draw())

    # move a card from unused to active
    def Draw(self):
        card = self.unused.Draw()
        self.active.Append(card)
        return card

    # move cards from unused or active to the Discard pile.
    def Discard(self, *cards):
        for card in cards:
            if not self.active.Contains(card) and not self.unused.Contains(
                    card):
                raise Exception('Card not in play or unused')
            if self.active.Contains(card):
                self._move(self.active, self.discard, card)
            else:
                self._move(self.unused, self.discard, card)

    def Reset(self):
        self._combine(self.unused, self.discard, self.active)
        assert self.unused.Size() == 52
        self.unused.Shuffle()