所以我再次陷入新手问题:D
我正在尝试将基于文本的游戏与计算机混合在一起。
好的,所以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
Card中如何定义方法有什么问题? 我一直在努力工作几个小时,但没有运气。
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。我明天会看到它如何,加上实际的游戏部分。
答案 0 :(得分: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)
修改:在sum
函数中切换到使用get_points
,这对我来说更清晰。
使用这些函数和你给出的示例手,你得到如下输出:
>>> get_counts(hand)
defaultdict(<type 'int'>, {'king': 1, '2': 4})
>>> get_points(hand)
1
答案 1 :(得分: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
为真。
答案 2 :(得分: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)
会给你一个dict()映射卡等级(手中的牌)你是否有4个等级。
答案 3 :(得分:0)
比贾斯汀更为一般:
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']
能够查看哪个等级具有该设置。
答案 4 :(得分: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']