在Python中实现卡牌游戏的最佳牌组方法

17 投票
5 回答
28529 浏览
提问于 2025-04-15 20:51

在Python中,存储扑克牌的花色和点数的最佳方法是什么,这样我就可以在其他变量中引用这些值呢?

举个例子,如果我有一个叫做hand的列表(代表玩家手中的牌),我该如何保存可以指向花色名称和特定牌点数的值?这些花色和牌点数的名称以及它们的值又该如何存储呢?

5 个回答

2

一副扑克牌由四种花色,每种花色都有相同的数字范围(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)
7

最简单的方法就是用一个包含元组的列表,其中牌面用整数表示,花色用字符串表示:

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')]
26

扑克服务器通常使用两个字符的字符串来表示每一张牌,这样做的好处是,程序处理起来很简单,人类阅读起来也很容易。

>>> 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

撰写回答