From c1120bcd93ef99851cced2db0d295af1e010c755 Mon Sep 17 00:00:00 2001 From: Brennen Raimer Date: Tue, 17 Mar 2020 22:43:03 -0400 Subject: [PATCH] beginning implementations of CardCollection and some of its subclasses --- BearOnline/cards/__init__.py | 2 ++ BearOnline/cards/{card.py => _card.py} | 0 .../cards/{playingcard.py => _playingcard.py} | 2 +- BearOnline/cards/collections/__init__.py | 1 + .../cards/collections/_cardcollection.py | 10 ++++++ BearOnline/cards/collections/_deck.py | 34 +++++++++++++++++++ .../cards/collections/_playingcarddeck.py | 9 +++++ 7 files changed, 57 insertions(+), 1 deletion(-) rename BearOnline/cards/{card.py => _card.py} (100%) rename BearOnline/cards/{playingcard.py => _playingcard.py} (99%) create mode 100644 BearOnline/cards/collections/__init__.py create mode 100644 BearOnline/cards/collections/_cardcollection.py create mode 100644 BearOnline/cards/collections/_deck.py create mode 100644 BearOnline/cards/collections/_playingcarddeck.py diff --git a/BearOnline/cards/__init__.py b/BearOnline/cards/__init__.py index e69de29..c14c61a 100644 --- a/BearOnline/cards/__init__.py +++ b/BearOnline/cards/__init__.py @@ -0,0 +1,2 @@ +from ._card import Card +from ._playingcard import PlayingCard \ No newline at end of file diff --git a/BearOnline/cards/card.py b/BearOnline/cards/_card.py similarity index 100% rename from BearOnline/cards/card.py rename to BearOnline/cards/_card.py diff --git a/BearOnline/cards/playingcard.py b/BearOnline/cards/_playingcard.py similarity index 99% rename from BearOnline/cards/playingcard.py rename to BearOnline/cards/_playingcard.py index cfc742d..41357c0 100644 --- a/BearOnline/cards/playingcard.py +++ b/BearOnline/cards/_playingcard.py @@ -1,6 +1,6 @@ from itertools import chain -from .card import Card +from . import Card class PlayingCard(Card): diff --git a/BearOnline/cards/collections/__init__.py b/BearOnline/cards/collections/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/BearOnline/cards/collections/__init__.py @@ -0,0 +1 @@ + diff --git a/BearOnline/cards/collections/_cardcollection.py b/BearOnline/cards/collections/_cardcollection.py new file mode 100644 index 0000000..2b5fdc9 --- /dev/null +++ b/BearOnline/cards/collections/_cardcollection.py @@ -0,0 +1,10 @@ +from collections import deque + +from .. import Card + +class CardCollection(deque): + def __init__(self, iterable, maxlen=None): + if not len(iterable) == 0 or all([isinstance(Card, item) for item in iterable]): + raise TypeError("CardCollections must only contain Cards") + else: + super().__init__(iterable, maxlen) diff --git a/BearOnline/cards/collections/_deck.py b/BearOnline/cards/collections/_deck.py new file mode 100644 index 0000000..99f27b4 --- /dev/null +++ b/BearOnline/cards/collections/_deck.py @@ -0,0 +1,34 @@ +from collections.abc import Iterable +from itertools import cycle +from more_itertools import random_permutation + +from ._cardcollection import CardCollection + +class Deck(CardCollection): + def draw(self): + return self.pop() + + def shuffle(self): + shuffled = list(random_permutation(self)) + self.clear() + self.extend(shuffled) + return self + + def deal(self, card_collections, cards_per_rotation=1, max_rotations=None): + if not issubclass(card_collections, Iterable) or not all([issubclass(CardCollection, collection) for collection in card_collections]): + raise TypeError("You can only deal cards to an iterable containing CardCollections") + + if max_rotations is None: + rotation = cycle(card_collections) + elif isinstance(max_rotations, int): + rotation = card_collections * max_rotations + else: + raise TypeError("Max rotations should be a positive integer") + + for card_collection in rotation: + try: + for _ in range(cards_per_rotation): + card_collection.append(self.draw()) + except IndexError: + break + \ No newline at end of file diff --git a/BearOnline/cards/collections/_playingcarddeck.py b/BearOnline/cards/collections/_playingcarddeck.py new file mode 100644 index 0000000..99b1bde --- /dev/null +++ b/BearOnline/cards/collections/_playingcarddeck.py @@ -0,0 +1,9 @@ +from itertools import product, starmap +from ._deck import Deck +from .. import PlayingCard + +class PlayingCardDeck(Deck): + def __init__(self): + #initialize the deck with the product of the ranks and suits + super().__init__(list(starmap(PlayingCard, product(PlayingCard.ranks.keys(), PlayingCard.suits.keys())))) +