有人可以帮我在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__
以支持以下操作:
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中为扑克游戏创建一副纸牌吗的主要内容,如果未能解决你的问题,请参考以下文章