我正在尝试通过创建一个可以通过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
。
答案 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())
)。