Димитър обнови решението на 26.03.2014 00:11 (преди над 10 години)
+class Rank:
+ # вид на картата
+
+ def __init__(self, symbol):
+ self.symbol = symbol # символът на картата (A, 2, Q, K)
+
+
+class Suit:
+ # боя на картата
+
+ def __init__(self, color):
+ self.color = color # цветът на боята ('red', 'black')
+
+
+def ClassFactory(class_name, attribute_value, base_class):
+ # създава динамично класовете за RANKS и SUITS
+
+ def __init__(self):
+ setattr(self, 'title', class_name)
+ base_class.__init__(self, attribute_value)
+
+ def __str__(self):
+ return self.title
+
+ def __eq__(self, other):
+ return self.title == other.title
+ return type(class_name, (base_class,), {"__init__": __init__,
+ "__str__": __str__,
+ "__eq__": __eq__})
+
+RANKS_ORDER = ['King', 'Queen', 'Jack', 'Ten', 'Nine', 'Eight',
+ 'Seven', 'Six', 'Five', 'Four', 'Three', 'Two', 'Ace']
+
+BELOTЕ_RANKS_ORDER = ['King', 'Queen', 'Jack', 'Ten', 'Nine', 'Eight',
+ 'Seven', 'Ace']
+
+SIXTY_SIX_RANKS_ORDER = ['King', 'Queen', 'Jack', 'Ten', 'Nine', 'Ace']
+
+SUITS_ORDER = ['Diamonds', 'Clubs', 'Hearts', 'Spades']
+
+RANKS = {rank_type[1]: ClassFactory(rank_type[1], rank_type[0], Rank)
+ for rank_type in [('A', 'Ace'), ('2', 'Two'), ('3', 'Three'),
+ ('4', 'Four'), ('5', 'Five'), ('6', 'Six'),
+ ('7', 'Seven'), ('8', 'Eight'), ('9', 'Nine'),
+ ('10', 'Ten'), ('J', 'Jack'), ('Q', 'Queen'),
+ ('K', 'King')]}
+
+
+SUITS = {suit_type[1]: ClassFactory(suit_type[1], suit_type[0], Suit)
+ for suit_type in [('red', 'Diamonds'), ('red', 'Hearts'),
+ ('black', 'Spades'), ('black', 'Clubs')]}
+
+
+class Card:
+ # клас който представлява една карта за игра
+
+ def __init__(self, rank, suit):
+ self.__rank = rank()
+ self.__suit = suit()
+
+ def __str__(self):
+ return str(self.rank) + " of " + str(self.suit)
+
+ def __repr__(self):
+ return '<' + self.__class__.__name__ + ' ' + str(self) + '>'
+
+ def __eq__(self, other):
+ return self.rank == other.rank and self.suit == other.suit
+
+ @property
+ def rank(self):
+ return self.__rank
+
+ @property
+ def suit(self):
+ return self.__suit
+
+
+class CardCollection:
+ # Представлява колекция (тесте) от карти
+
+ def __init__(self, collection=[]):
+ self.__collection = collection[:]
+
+ def __getitem__(self, index):
+ return self.collection[index]
+
+ def __iter__(self):
+ for card in self.collection:
+ yield card
+ raise StopIteration
+
+ def __len__(self):
+ return len(self.collection)
+
+ def __str__(self):
+ return str([card for card in self.collection])
+
+ @property
+ def collection(self):
+ return self.__collection
+
+ def draw(self, index):
+ card = self.collection[index]
+ del self.collection[index]
+ return card
+
+ def draw_from_top(self):
+ return self.collection.pop()
+
+ def draw_from_bottom(self):
+ self.collection.reverse()
+ card = self.collection.pop()
+ self.collection.reverse()
+ return card
+
+ def top_card(self):
+ return self.collection[-1]
+
+ def bottom_card(self):
+ return self.collection[0]
+
+ def add(self, card):
+ self.collection.append(card)
+
+ def index(self, card):
+ return self.collection.index(card)
+
+
+def StandardDeck():
+ # създава стандартно тесте карти
+
+ return CardCollection([Card(RANKS[rank], SUITS[suit])
+ for suit in SUITS_ORDER
+ for rank in RANKS_ORDER])
+
+
+def BeloteDeck():
+ # създава тесте за белот
+
+ return CardCollection([Card(RANKS[rank], SUITS[suit])
+ for suit in SUITS_ORDER
+ for rank in BELOTЕ_RANKS_ORDER])
+
+
+def SixtySixDeck():
+ # създава тесте за сантасе(66)
+
+ return CardCollection([Card(RANKS[rank], SUITS[suit])
+ for suit in SUITS_ORDER
+ for rank in SIXTY_SIX_RANKS_ORDER])
По принцип избягвай да пишеш коментари тип
def StandardDeck():
# създава стандартно тесте карти
Какво прави функцията, класа или др. трябва да е видно от самото им име. Добра практика е кодът ти да е толкова добре написан, че всичко да е ясно само по себе си, без да има нужда от коментар.
Коментарите се пишат когато смяташ, че използваш алгоритъм който трудно се разбира какво прави при първо четене или искаш да документираш бъг (при бъгове се пише например # FIXME: In some cases this function throws a ValueError
)
Надявам се че разбра идеята :)