当某人初次接触课程时,我觉得这肯定是一个相当普遍的问题,但我找不到答案。我正在尝试制作二十一点游戏,而评估的一部分是使用类完成交易过程。我为此使用的代码如下:
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
以供参考:
我想要做的是弹出卡列表中的第一项,并将其设置为与dealt_card相等。然后,我想将Dealt_card添加到当前的玩家手中-这是字典中的key:list对。然后,我希望它对字典中的每个玩家重复此过程。
这不是我要理解的-调用Deal()类会导致shuffled_deck被修改,并且更改也发生在类之外。但是,对Dealt_card变量的修改发生在类内,但在类外则保留为空列表。为什么只将类所做的更改的一半转移到其外部的命名空间?
答案 0 :(得分:0)
在dealing()
方法中,由于要调用self.shuffled_deck
的实例,因此需要使用dealt_card += self.shuffled_deck.pop(0)
(即Deal
)。
此外,您可能想将每个玩家的Deal分配给一个变量,以便跟踪变量,例如player_deal[name] = Deal(shuffled_deck,dealt_card)
或类似的东西?
答案 1 :(得分:0)
您的变量shuffled_deck和dealt_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函数-与dealt_card相同-很好。
def dealing(self):
dealt_card = []
dealt_card += shuffled_deck.pop(0)
print(dealt_card)
dealt_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和dealt_card的位置,但随后将它们传递给类的init函数。
因此,当您要引用包含在甲板上的类时,请在类方法中使用self.shuffled_deck。
答案 2 :(得分:0)
以下是一个示例功能,可用来发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张牌,并且玩家字典为进行了相应更新,以反映出这些已发牌。