Лучший способ реализовать колоду для карточной игры в python

Каков наилучший способ хранения карт и костюмов в python, чтобы я мог ссылаться на эти значения в другой переменной?

Например, если у меня есть список под названием hand (карты в руках игроков), как я могу хранить значения, которые могут ссылаться на имена костюмов и значений определенных карт, и как эти имена и значения костюмов и карточек храниться?

Ответы

Ответ 1

Покер-серверы, как правило, используют 2-значную строку для идентификации каждой карты, что приятно, потому что она легко обрабатывается программно и так же легко читается для человека.

>>> import random
>>> import itertools
>>> SUITS = 'cdhs'
>>> RANKS = '23456789TJQKA'
>>> DECK = tuple(''.join(card) for card in itertools.product(RANKS, SUITS))
>>> hand = random.sample(DECK, 5)
>>> print hand
['Kh', 'Kc', '6c', '7d', '3d']

Изменить. Это действительно прямо из модуля покера, который я написал для оценки рук в покере, вы можете увидеть здесь больше: http://pastebin.com/mzNmCdV5

Ответ 2

Простейшим может быть использование списка кортежей, где карты являются int и костюмы являются строками:

hand = [(1, 'spade'), (10, 'club'), ...]

Но простейшим может быть не то, что вы хотите. Возможно, вы хотите, чтобы класс представлял карту:

class Card:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

    def __repr__(self):
        letters = {1:'A', 11:'J', 12:'Q', 13:'K'}
        letter = letters.get(self.rank, str(self.rank))
        return "<Card %s %s>" % (letter, self.suit)

hand = [Card(1, 'spade'), Card(10, 'club')]

Ответ 3

Вы можете просто использовать номер и выбрать сопоставление между числом и "картой". Например:

номер MOD 13 = номинал (после +1)

число DIV 13 = костюм

Ответ 4

import collections

C, H, D, S = "CLUBS", "HEARTS", "DICE", "SPADE"
Card = collections.namedtuple("Card", "suit value")

hand = []

hand.append(Card(C, 3))
hand.append(Card(H, "A"))
hand.append(Card(D, 10))
hand.append(Card(S, "Q"))

for card in hand:
    print(card.value, card.suit)

Ответ 5

Колода карт состоит из одного и того же диапазона значений (1 - 13) в каждом из четырех костюмов, что предполагает декартово произведение. Понимание списка - это элегантный, плотный синтаксис для этого:

values = range(1, 10) + "Jack Queen King".split()
suits = "Diamonds Clubs Hearts Spades".split()

deck_of_cards = ["%s of %s" % (v, s) for v in values for s in suits]

в python 3:

deck_of_cards = ["{0} of {1}".format(v, s) for v in values for s in suits]

Как они выглядят, когда вы берете новую колоду из коробки; для воспроизведения вам нужно перетасовать их:

from random import shuffle

shuffle(deck_of_cards)