【问题标题】:Having troubles with OOP-style Blackjack sim - AttributeError: 'Deck' object has no attribute 'fulldeck'使用 OOP 风格的 Blackjack sim 遇到问题 - AttributeError: 'Deck' object has no attribute 'fulldeck'
【发布时间】:2015-10-18 09:55:03
【问题描述】:

我正在尝试通过创建一个可以通过 cli 玩的 Blackjack 游戏来学习 OOP 的原理。

我已经成功地设置了一副由 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 张随机卡片,但它却给了我

AttributeError: 'Deck' object has no attribute 'fulldeck'

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

【问题讨论】:

    标签: python oop


    【解决方案1】:

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

    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
    

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

    a = Deck()
    a.makeCards()
    a.playerHand()
    

    我也怀疑你在这里会遇到问题:

    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])
    

    您还可以按如下方式细化和修复playerHand

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 2020-04-26
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多