2010-03-25 61 views
15

用python存储纸牌和套装的最佳方式是什么,以便我可以在另一个变量中保存对这些值的引用?例如,如果我有一个名为hand(手牌)的列表,我怎样才能保存可以引用特定卡牌的套装和值的名称的值,以及这些名称和套装值以及卡被储存?用python实现纸牌游戏套牌的最佳方式

+1

你当然可以使用简单的元组或编码的字符串表示卡,但Ned Batchelder的回答给你更多的功能。如果你在开始像War这样的简单纸牌游戏之前开始进行像Poker这样更复杂的事情,你会看到定义一个Card类的价值,你可以在其中定义丰富的比较运算符,从而更容易比较ace和'10 ',而不是创建一些时髦的专业逻辑,试图比较“A”和王牌的“T”。还要注意,有些游戏有多种可能的值,比如21中的ace可以是1或11 。 – PaulMcG 2010-03-26 04:03:14

回答

7

最简单的事情是使用元组,其中卡INTS的列表和西装是字符串:

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

你可以简单地使用一个数字,并决定数字和“卡”之间的映射。例如:

号MOD 13 =面值

数DIV 13 =套装(一个1之后)

+0

应该指出的是,对于每张卡片,您都会使用0到51之间的值作为此方法。然后你可以为每个套装分配一个从0到3的数字。 – JSchlather 2010-03-25 19:43:26

24

扑克服务器倾向于使用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

+0

优秀 - 正是我需要的!谢谢 – matt1024 2010-03-25 19:58:44

+5

值得一提的是,您可以使用字符串:SUITS ='cdhs'和RANKS ='23456789TJQKA',而不是使用SUITS和RANK的元组。 – 2010-03-26 01:17:17

+1

请注意,在这个例子中,牌不会被拿走,这意味着下一个玩家可以得到同样的牌。一个更现实的实现会让DECK成为一个列表,随机卡从中弹出来执行'DECK.pop(r)' – 2017-08-15 08:44:55

1
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

一副牌是由同一系列的的价值(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)