我试图使用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
希望它有帮助:(