使用OOPstyle 21点sim AttributeError遇到问题:“Deck”对象没有属性“fulldeck”

2024-10-02 16:28:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过创建一个21点游戏来学习OOP的原理,有人可以通过cli来玩。在

我已经成功地设置了一副52张牌,每副牌的数量都是正确的,但是我很难得到玩家的手。在

我已经写过的代码:

import random

class Deck:

    def makeCards(self):
        self.suits = ['Clubs', 'Diamonds', 'Spades', 'Hearts']
        self.rank = ['2','3','4','5','6','7','8','9','10','J','Q','K','A']
        for suit in self.suits:
            for rank in self.rank:
                self.fulldeck = (suit, rank)
                self.fulldeck = list(self.fulldeck)
                return(self.fulldeck)

    def playerHand(self):
        self.cardone = random.choice(self.fulldeck)
        self.cardtwo = random.choice(self.fulldeck)
        print(self.cardone, self.cardtwo)

Deck().makeCards()
Deck().playerHand()

我希望它从self.fulldeck中定义的卡中随机输出2张卡,但是它给了我

^{pr2}$

我不明白为什么,因为我已经在makeCards函数中定义了self.fulldeck。在


Tags: inselffordefrandomdecksuitchoice
1条回答
网友
1楼 · 发布于 2024-10-02 16:28:26

问题的主要部分是您在两个不同的实例上调用方法:

Deck().makeCards() # create a Deck instance, call makeCards on it, and discard it
Deck().playerHand() # create a new Deck instance, call playerHand on it, and discard it

保存对一个实例的引用,然后重用它:

^{pr2}$

我也怀疑你会有问题:

for suit in self.suits:
    for rank in self.rank:
        self.fulldeck = (suit, rank)
        self.fulldeck = list(self.fulldeck)
        return(self.fulldeck)

您正在迭代一个嵌套循环,但在每次迭代中,您都会重新指派一个全新的self.fulldeck,因此只保留最后一个。但是,第一次迭代是最后一次,因为您在它上面return。当您调用这个函数时,您甚至没有保存它-根本不需要在这里return。在

你可能会想要这样的东西:

self.fulldeck = []
for suit in self.suits:
    for rank in self.rank:
        self.fulldeck.append([suit, rank])

{cd4>也可以按如下方式进行修正:

def playerHand(self):
    return random.sample(self.fulldeck, 2)

当前版本选择随机卡两次,并替换。使用random.choice选择的卡不会从牌堆中移除,因此您可以获得同一张卡两次。使用random.sample将返回两张随机卡,它们保证不是同一张卡。你可以用这些卡片做任何你喜欢的事情,比如打印它们(print(a.playerHand()))。在

相关问题 更多 >