在Python中实现卡牌游戏的最佳牌组方法
在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