Лучший способ реализовать колоду для карточной игры в 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)