有人可以帮助我在Pygame中为扑克游戏创建一张牌



我试图使用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))

我感觉到三个循环是问题所在。在基于文本的二十一点游戏中,卡只需要具有两个属性。对于此游戏,我需要卡对象具有图片,价值和西装,以便我可以显示并进行比较。

西装是四个西装字符串的清单排名是卡字符串的卡名称列表,PIC是52 .png文件的列表(甲板上的每张卡一个(

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

class Card:
    def __init__(self, value, suit):
        self.value = value
        self.suit = suit
        self.img = png_images[f'{value}{suit}']
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)

基于其中一本书的示例:

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'{suit} {rank}'并动态地将其添加到卡对象中。

自从我做这样的事情以来已经有一段时间了,但是您可以创建一个腌制词典,因为每个西装也许。

请看一下:我如何使用泡菜保存dict?

并创建尝试:如何在Python中创建一个trie

希望它有帮助:(

最新更新