2010-03-25 103 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)