有人可以帮我在pygame中为扑克游戏创建一副纸牌吗

Posted

技术标签:

【中文标题】有人可以帮我在pygame中为扑克游戏创建一副纸牌吗【英文标题】:Can someone help me create a deck of Cards for a poker game in pygame 【发布时间】:2019-10-11 02:12:07 【问题描述】:

我正在尝试使用 pygame 和 OOP 在 python 中制作扑克游戏。我之前从 udemy 课程制作了一个基于文本的二十一点游戏,我试图使用一些相同的原理来创建我的套牌,但它不起作用。我遇到的问题是我想创建 52 个卡片对象,并且我希望每个卡片对象具有三个属性(套装、等级和 png 文件)。

class Card:

    def __init__(self, suit, rank, pic):

        self.suit = suit
        self.pic = pic
        self.rank = rank


class Deck:

    def __init__(self):

        self.deck_comp = []

    def create_deck(self):

        for suit in suits:
            for rank in ranks:
                for pic in deck:

                    self.deck_comp.append(Card(suit, rank, pic))

我觉得三个 for 循环是问题所在。在基于文本的二十一点游戏中,这张牌只需要有两个属性。对于这个游戏,我需要卡片对象有图片、价值和花色,以便我可以显示它们并进行比较。

suit 是四个花色字符串的列表 Rank 是作为字符串的卡片名称列表,并且 pic 是 52 个 .png 文件的列表(牌组中的每张卡片一个)

【问题讨论】:

欢迎来到 ***。你能告诉我们问题是什么吗? (您可以编辑您的问题并添加您看到的 Python 错误。) 什么是deck?但是,我假设花色/等级对与图片之间存在一对一的映射,因此您可能想要for suit, rank in product(suits, ranks): self.deck_comp.append(Card(suit, rank, deck[(suit, rank)])) 之类的东西,而不是为每张卡迭代每张图片。 是的,您当然不想循环播放图片,只需西装和排名,为每张卡片分配一张正确的图片。想必您可以将图片文件命名为“card_s_8.png”等,这样您就可以将文件名从军衔和花色组合起来。 【参考方案1】:

将所有 png 名称保存在字典中并在 Card 类中分配图像不是更明智吗?

class Card:
    def __init__(self, value, suit):
        self.value = value
        self.suit = suit
        self.img = png_images[f'valuesuit']

class Deck:
        def __init__(self, shuffle_cards=True):
        self.cards = []
        self.shuffle_cards = shuffle_cards
        self.create()

    def create(self):
        for _ in range(number_of_decks):
            for val in (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14):
                for suit in ("Hearts", "Spades", "Clubs", "Diamonds"):
                    self.cards.append(Card(val, suit))

        if self.shuffle_cards:
            shuffle(self.cards)

【讨论】:

没问题。如果我的回答有帮助,你介意接受吗? 是的,这是正确的方法。我也喜欢卡片值是数字而不是字符串。西装也应该如此,但这不是问题。 花色可以是字符串,因为它们不是直接比较的。在扑克中,比较花色的唯一原因是检测出 5 个相同的花色 同意,但是还有桥牌之类的游戏。甚至在扑克中也有类似低牌带入梭哈之类的东西,它确实比较了花色。【参考方案2】:

基于其中一本书的例子:

import collections

Card = collections.namedtuple('Card', ['rank', 'suit'])

class Deck:
    ranks = [str(n) for n in range(2, 11)] + ['JQKA']
    suits = ['spades', 'diamonds', 'clubs', 'hearts']
    #  dictionary of dictionaries which maps ranks and suits to the picture
    pic_mapping = 
                    'spades': 
                                '2': 'spades2',
                                '3': 'spades3'
                                ...
                              ,
                    'hearts': 
                                '2': 'hearts2',
                                '3': 'hearts3'
                                ...
                              ,  


    def __init__(self):
        self._cards = [Card(rank, suit, pic_mapping[suit][rank]) for suit in self.suits
                                        for rank in self.ranks]

请注意,列表可能会变成元组或可以使用生成器构建。列表只是为了更好的可读性。 此外,您可以重载__len____getitem__ 以支持以下操作:

索引 [i] random.choice(collection) 切片 迭代 reversed(collection)

您可以使用图像命名约定来代替 dict 映射 此模式 f'suitrank' 并将其动态添加到 Card 对象。

【讨论】:

【参考方案3】:

我已经有一段时间没有做过这样的事情了,但你可以为每件西装创建一个泡菜字典。

看看这个: How can I use pickle to save a dict?

并创建 TRIES: How to create a TRIE in Python

希望对你有帮助:)

【讨论】:

以上是关于有人可以帮我在pygame中为扑克游戏创建一副纸牌吗的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 int 数组创建带有面孔和西装的卡片组?

纸牌游戏----小猫钓鱼

纸牌游戏——小猫钓鱼

纸牌游戏-小猫钓鱼

Java编程练习——集合框架应用

扑克牌练习 数据结构