1

所以我再次陷入了一个新手问题:D

我正在尝试将基于文本的 go-fish 游戏与计算机混合在一起。

好的,所以 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。明天我会看看情况如何,添加实际的游戏部分。

4

5 回答 5

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
于 2010-12-21T22:17:39.177 回答
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如果手中有四张相同等级的牌,则为 True。

于 2010-12-21T22:02:47.167 回答
0

Counter在 Python 2.7 中添加到标准库模块的新内置类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']
于 2010-12-21T23:12:13.557 回答
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 个该等级。

于 2010-12-21T22:17:09.460 回答
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']

具有查看哪个等级的设置的能力。

于 2010-12-21T22:22:03.183 回答