使用OOP风格的Blackjack sim遇到麻烦 - AttributeError:'Deck'对象没有属性'fulldeck'

时间:2015-10-18 01:39:51

标签: python oop

我正在尝试通过创建一个可以通过cli玩的二十一点游戏来学习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'

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

1 个答案:

答案 0 :(得分:4)

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

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,所以只剩下最后一个。{1}}。但是,第一次迭代是最后一次,因为你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()))。