2010-12-21 168 views
1

所以我卡上的新手問題一次:d檢查如果列表包含相同值的4個元素

我試圖去混搭魚的基於文本的一起遊戲對電​​腦。

好吧,1卡實際上是來自兩個列表的元素的元組。

suits = ['Clubs', 'Diamonds', 'Spade', 'Hearts'] 
ranks = [None, 'ace', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'jack', 'queen', 'king'] 

然後,這被添加到一個套牌,洗牌和什麼都沒有,然後處理到手中。 (得到了大部分從書thinkpython我想。學到了很多關於階級結構和繼承的過程。)

所以,一方面可能是這樣的

['Clubs 2', 'Diamonds king', 'Diamonds 2', 'Spades 2', 'Hearts 2'] 

正如你可以看到,一方面包含四個相同的等級,這對於玩家來說是1分。 但是,如何檢查手是否包含等級列表中任何項目的四個實例? 我是否必須迭代列表中的每個項目,或者有一些乾淨而簡單的方法呢?


編輯
非常感謝所有的答案傢伙。 :D 但是,當我嘗試在手中的物品上使用「拆分」時,我收到屬性錯誤。 猜猜我應該發佈更多我正在運行的代碼。

的完整代碼,並回溯這裏
http://pastebin.com/TwHkrbED

有什麼錯的方法是如何在卡定義? 我一直在試圖讓它工作幾個小時,但沒有運氣。

EDIT2
對甲板生成部分進行了一些更改。現在整個卡組是一個元組列表,代碼少得多。

thedeck=[] 
class Deckofcards: 
    suits = ['Clubs', 'Diamonds', 'Hearts', 'Spades'] 
    ranks = ['Ace', '2', '3', '4', '5', 
     '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King'] 
    def __init__(self): 
     for i in self.suits: 
      for a in self.ranks: 
       thedeck.append((i, a)) 

看起來像另一種方式過於複雜,但idk。我會看看明天會如何,添加實際的遊戲部分。

回答

4

我可能會提出一個輕微的重構:將每張牌表示爲(rank, suit)的元組。所以,你的例子右手是:

hand = [('2', 'Clubs'), 
     ('king', 'Diamonds'), 
     ('2', 'Diamonds'), 
     ('2', 'Spades'), 
     ('2', 'Hearts')] 

然後我建議了幾個輔助功能,以幫助您確定手的價值:

from collections import defaultdict 

def get_counts(hand): 
    """Returns a dict mapping card ranks to counts in the given hand.""" 
    counts = defaultdict(int) 
    for rank, suit in hand: 
     counts[rank] += 1 
    return counts 

def get_points(hand): 
    """Returns the number of points (ie, ranks with all 4 cards) in the given 
    hand.""" 
    return sum(1 for count in get_counts(hand).itervalues() if count == 4) 

編輯:切換到使用sumget_points函數,這對我來說似乎更清楚。

具有這些功能,你給的例子手的工作,你會得到像這樣的輸出:

>>> get_counts(hand) 
defaultdict(<type 'int'>, {'king': 1, '2': 4}) 

>>> get_points(hand) 
1 
+0

從Python 2.7開始,使用`collections.Counter`可以更簡單。 – 2010-12-21 22:48:38

1

這裏有一種方法:

x = ['Clubs 2', 'Diamonds king', 'Diamonds 2', 'Spades 2', 'Hearts 2'] 
ranks = [i.split()[1] for i in x] 
fourofakind = any(ranks.count(i)==4 for i in set(ranks)) 

fourofakind是那麼真,如果有在手同一職級的四張牌。

0

如果你正在尋找一個擴展的一種功能:

hand = ['Clubs 2', 'Diamonds king', 'Diamonds 2', 'Spades 2', 'Hearts 2'] 
hand_ranks = [i.split()[1] for i in x] 
fourofakind = {} 
for i in set(hand_ranks): 
    fourofakind[i] = (hand_ranks.count(i) == 4) 

會給你(在手的卡)的字典()映射牌點數是否你有秩的4。

0

比Justin的多一點一般:

suits = ['Clubs', 'Diamonds', 'Spade', 'Hearts'] 
ranks = [None, 'ace', '2', '3', '4', '5', '6', '7', \ 
'8', '9', '10', 'jack', 'queen', 'king'] 

hand = ['Clubs 2', 'Diamonds king', 'Diamonds 2', 'Spades 2', 'Hearts king'] 
rankshand = [i.split()[1] for i in hand] 

fourofakind = [hr for hr in ranks if rankshand.count(hr)==4] 
threeofakind = [hr for hr in ranks if rankshand.count(hr)==3] 
pair = [hr for hr in ranks if rankshand.count(hr)==2] 

fourofakind 
[] 
threeofakind 
['2'] 
pair 
['king'] 

有了,看看哪些排名有能力集合。

0

在Python 2.7中添加的新內置Counter類到標準庫collections模塊使得這非常簡單。

suits = ['Clubs', 'Diamonds', 'Spade', 'Hearts'] 
ranks = [None, 'ace', '2', '3', '4', '5', '6', '7', 
     '8', '9', '10', 'jack', 'queen', 'king'] 
hand = ['Clubs 2', 'Diamonds king', 'Diamonds 2', 'Spades 2', 'Hearts 2'] 

from collections import Counter 

counts = Counter(card.split()[1] for card in hand) 
four_of_a_kind = [rank for rank,count in counts.iteritems() if count == 4] 
print 'four_of_a_kind:', four_of_a_kind 
# four_of_a_kind: ['2'] 
相關問題