Тесте карти

Предадени решения

Краен срок:
26.03.2014 17:00
Точки:
10

Срокът за предаване на решения е отминал

Задачата ви е да моделирате стандартното тесте от 52 карти за покер (жокери не са нужни). За целта трябва да използвате принципите на ООП.

Ето класовете които очакваме да видим:

Rank

class Rank # вид на картата
  symbol   # символът на картата (A, 2, Q, K)

Suit

class Suit # боя на картата
  color    # цветът на боята ('red', 'black')

RANKS

това трябва да е речник с класове, наследяващи Rank и представляващи всеки вид карта. Например:

>>> RANKS
{'Six': <class '__main__.Six'>, 'Four': <class '__main__.Four'>, ... }

За пълен списък с ключовете на масива вж. по-долу.

SUITS

речник с класове, наследяващи Suit и представляващи всеки вид боя. Например:

>>> SUITS
{'Hearts': <class '__main__.Hearts'>, 'Clubs': <class '__main__.Clubs'>, 'Spades': <class '__main__.Spades'>, 'Diamonds': <class '__main__.Diamonds'>}

Видовете карти и боите трябва да са сравними с оператора '=='. Например:

>>> RANKS["Ace"]() == RANKS["Ace"]()
True
>>> SUITS["Spades"]() == SUITS["Spades"]()
True

Видовете карти и боите трябва да имат репрезентация като низ:

 >>> str(RANKS["Ace"]())
 Ace
 >>> str(SUITS["Spades"]())
 'Spades'

Card

class Card # Клас който представлява една карта за игра
    rank
    suit
    __init__(self, rank, suit)

Конструктура на Card приема клас rank и suit (не тяхна инстанция). Класът е непроменяем (immutable). Например:

>>> aos = Card(RANKS["Ace"], SUITS["Spades"])
>>> aos.rank
<__main__.Ace object at 0x7f2632ed5890>
>>> aos.suit
<__main__.Spades object at 0x7f2632ed5950>
>>> aos.suit = SUITS["Hearts"]()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  AttributeError: can't set attribute

Инстанциите на Card трябва да са сравними с == (като Rank и Suit). Card трябва да има репрезентация като низ под тази форма:

>>> str(aos)
'Ace of Spades'

CardCollection

class CardCollection # Представлява колекция (тесте) от карти
    __init__(self, collection)
    draw(self, index)
    draw_from_top(self)
    draw_from_bottom(self)
    top_card(self)
    bottom_card(self)
    add(self, card)
    index(self, card)

Конструктора на Card пиема каквато и да е колекция от инстанции на Card като начални данни. Още карти могат да се добавят с метода add. Първата карта в колекцията се счита за тази най-долу в тестето. Тоест индекс 0 е най-долната карта. Метода add добавя карти отгоре. Класът трябва да може да се индексира с числа, и трябва да може да се итерира с for цикъл.

>>> deck[13]
<Card King of Clubs>
>>> deck[1337]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

Метода draw връща картата на определен индекс и я премахва от колекцията, draw_from_top и draw_from_bottom са аналогични. Методите top_card и bottom_card връщат съответните карти без да ги махат от колекцията.

Метода index търси за определена карта в тестето и връща индекса ѝ. Ако има няколко еднакви карти се връща индекса на първата намерена. Търсенето става чрез сравнение, т.е. не е задължително инстанцията на Асо Пика което подавате на index да е в колекцията, просто трябва да има Асо Пика в нея. Ако няма такава карта метода хвърля ValueError:

>>> deck.index(Card(RANKS["Two"], SUITS["Hearts"]))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: <Card Two of Hearts> is not in list

Стандартни тестета

Очакваме да видим и 3 функции които генерират стандартните тестета за Покер, Белот и Сантасе:

StandardDeck()
BeloteDeck()
SixtySixDeck()

Карти и подредба

Ключовете в dict-овете ви трябва да са именовани точно по този начин. Тестовете ни разчитат на това.

>>> RANKS.keys()
dict_keys(['King', 'Six', 'Jack', 'Five', 'Queen', 'Ten', 'Ace', 'Three', 'Eight', 'Four', 'Two', 'Seven', 'Nine'])
>>> SUITS.keys()
dict_keys(['Diamonds', 'Hearts', 'Spades', 'Clubs'])

Стандартната подредба на картите е по боя и след това по вид. Ето стандартната подредба на пълното тесте. Тестетата които StandardDeck, BeloteDeck и SixtySixDeck генерират трябва да са подредени по този начин.

>>> StandardDeck()
[<Card King of Diamonds>, <Card Queen of Diamonds>, <Card Jack of Diamonds>, <Card Ten of Diamonds>, <Card Nine of Diamonds>, <Card Eight of Diamonds>, <Card Seven of Diamonds>, <Card Six of Diamonds>, <Card Five of Diamonds>, <Card Four of Diamonds>, <Card Three of Diamonds>, <Card Two of Diamonds>, <Card Ace of Diamonds>, <Card King of Clubs>, <Card Queen of Clubs>, <Card Jack of Clubs>, <Card Ten of Clubs>, <Card Nine of Clubs>, <Card Eight of Clubs>, <Card Seven of Clubs>, <Card Six of Clubs>, <Card Five of Clubs>, <Card Four of Clubs>, <Card Three of Clubs>, <Card Two of Clubs>, <Card Ace of Clubs>, <Card King of Hearts>, <Card Queen of Hearts>, <Card Jack of Hearts>, <Card Ten of Hearts>, <Card Nine of Hearts>, <Card Eight of Hearts>, <Card Seven of Hearts>, <Card Six of Hearts>, <Card Five of Hearts>, <Card Four of Hearts>, <Card Three of Hearts>, <Card Two of Hearts>, <Card Ace of Hearts>, <Card King of Spades>, <Card Queen of Spades>, <Card Jack of Spades>, <Card Ten of Spades>, <Card Nine of Spades>, <Card Eight of Spades>, <Card Seven of Spades>, <Card Six of Spades>, <Card Five of Spades>, <Card Four of Spades>, <Card Three of Spades>, <Card Two of Spades>, <Card Ace of Spades>]

BeloteDeck и SixtySixDeck запазват подредбата на стандартното тесте, но Белот се играе без картите 2-6, а Сантасе(66) се играе без картите 2-8.

Ако имате още въпроси не се колебайте да попитате във форума.