лучший способ реализовать колоду для карточной игры на питоне - PullRequest
16 голосов
/ 25 марта 2010

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

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

Ответы [ 5 ]

25 голосов
/ 25 марта 2010

Покерные серверы, как правило, используют 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

7 голосов
/ 25 марта 2010

Самое простое - использовать список кортежей, где карты - это целые, а масти - строки:

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')]
1 голос
/ 25 марта 2010

Колода карт состоит из одинакового диапазона значений (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]

в питоне 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)
1 голос
/ 25 марта 2010
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)
1 голос
/ 25 марта 2010

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

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

номер DIV 13 = костюм

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...