我觉得当有人第一次掌握课程时,这一定是一个相当普遍的问题,但我无法找到答案。我正在尝试制作二十一点游戏,部分评估是使用一个类来完成交易过程。我正在使用的代码如下:
class Deal:
def __init__(self,shuffled_deck,dealt_card):
self.shuffled_deck = shuffled_deck
self.dealt_card = dealt_card
def dealing(self):
dealt_card = []
dealt_card += shuffled_deck.pop(0)
print(dealt_card)
#Dealing the first round of cards
for name in player_hand:
Deal(shuffled_deck,dealt_card).dealing()
player_hand[name] += dealt_card
以供参考:
我想要做的是关闭卡片列表中的第一项并将其设置为等于dealing_card。然后我想将processed_card添加到当前的player_hand中 - 这是一个关键:dictonary中的列表对。然后我想让它为字典中的每个玩家重复这个过程。
我没有理解这一点 - 调用类Deal()导致shuffled_deck被修改,并且更改也发生在类外。然而,processed_card变量的修改发生在类中,但在类之外它仍然是一个空列表。为什么只有一半的更改由类转移到它之外的命名空间?
在dealing()
方法中,你需要使用self.shuffled_deck
(即dealt_card += self.shuffled_deck.pop(0)
),因为你正在调用Deal
的实例。
此外,你可能想要将每个玩家的交易分配给一个变量,以便跟踪它,比如player_deal[name] = Deal(shuffled_deck,dealt_card)
或沿着这些线的东西?
你的变量shuffled_deck和dealing_card都是不同范围内的独立变量......
class Deal:
def __init__(self,shuffled_deck,dealt_card):
self.shuffled_deck = shuffled_deck
self.dealt_card = dealt_card
这是两个不同的变量self.shuffled_deck(全局到类)和shuffled_deck>(本地)来自init函数 - 与processed_card相同 - 这很好。
def dealing(self):
dealt_card = []
dealt_card += shuffled_deck.pop(0)
print(dealt_card)
processed_card是您刚刚为处理方法定义的全新LOCAL变量。 shuffled_deck也是,虽然你没有定义它...所以应该给出错误。我想你想要self.shuffled_deck。
#Dealing the first round of cards
for name in player_hand:
Deal(shuffled_deck,dealt_card).dealing()
player_hand[name] += dealt_card
这里你还没有定义shuffled_deck和dealing_card的位置,但是这些是传递给类的init函数的......
因此,当您要引用包含类的deck时,请在类方法中使用self.shuffled_deck。
这是一个处理5张牌扑克牌的功能的例子:
import random
class Deck:
def __init__(self,**players):
self.ranks = [str(i) for i in range(2,11)] + ['J','Q','K','A']
self.suits = 'HDCS'
self.deck = [(s,r) for s in self.suits for r in self.ranks]
self.players = players
def deal(self):
random.shuffle(self.deck)
for player in self.players:
self.players[player] = [] # empty hands on each deal
for i in range(5):
try:
card = self.deck.pop()
self.players[player].append(card)
except IndexError:
print('Deck ran out! - reshuffling new deck...')
self.deck = [(s,r) for s in self.suits for r in self.ranks]
self.deal()
Deck = Deck(player1=[],player2=[],player3=[])
Deck.deal()
print(Deck.players)
这里的主要区别在于,与你的版本相比,牌组每场比赛只创造一次(如果牌组耗尽,则会创建一个新牌组并重新洗牌)。这是因为Deck
只是实例化一次,而你的版本每次尝试处理一张卡时都会创建Deal
实例。
此外,我假设你打算为每个玩家(而不是一张牌)全力交易,所以在上面的deal
方法中,每个玩家依次发出5张牌,并相应地更新玩家字典以反映那些发牌。