Python,纸牌游戏,属性错误
我想让一个纸牌游戏变傻。但当我运行程序时,我得到一个AttributeError: 输入玩家数量:1 玩家:玩家1包含: 手动值:0回溯最近的调用上次:File main.py, 第25行,在 printplayer文件C:\Users\kozus\Desktop\fool\fool\Hand.py,第38行,str text+=\n和值:+strself.getValue文件C:\Users\kozus\Desktop\fool\fool\Hand.py,第20行,在getValue中 结果+=self.card.cardPoints自身文件C:\Users\kozus\Desktop\fool\fool\card.py,第8行,在cardPoints中 如果[10,J,Q,K,A]中的self.rank:AttributeError:'Hand'对象没有属性'rank' 这是我的密码: 从随机导入洗牌Python,纸牌游戏,属性错误,python,class,oop,attributeerror,Python,Class,Oop,Attributeerror,我想让一个纸牌游戏变傻。但当我运行程序时,我得到一个AttributeError: 输入玩家数量:1 玩家:玩家1包含: 手动值:0回溯最近的调用上次:File main.py, 第25行,在 printplayer文件C:\Users\kozus\Desktop\fool\fool\Hand.py,第38行,str text+=\n和值:+strself.getValue文件C:\Users\kozus\Desktop\fool\fool\Hand.py,第20行,在getValue中 结果+
class Card(object):
def __init__(self, rank, suit):
self.rank = rank
self.suit = suit
def getRank(self):
return self.rank
def cardPoints(self):
# Rerturns amount points for some card
if self.rank in ["10", "J", "Q", "K", "A"]:
if self.rank == "A":
# 11 points for ace
return 11
else:
# 10 points for 10, jack, queen или king
return 10
else:
# Amount points for any other card
return ["6", "7", "8", "9"].index(self.rank) + 6
def __str__(self):
return "%s %s" % (self.rank, self.suit)
class Hand(object):
def __init__(self, name):
self.name = name
self.cards = []
self.card = Card
def addCard(self, card):
# Add card in hand
self.cards.append(card)
def getValue(self):
# Amount points in hand
result = 0
# Amount aces in hand
aces = 0
for card in self.cards:
result += self.card.cardPoints(self)
# If ace in hand then we increasing amount of aces in hand
if card.getRank() == "A":
aces += 1
# Count aces like 1 or 11 points
if result + aces * 10 <= 21:
result += aces * 10
return result
def __str__(self):
text = "%s's contains:\n" % self.name
for card in self.cards:
text += str(card) + " "
text += "\nHand value: " + str(self.getValue())
return text
class Deck(object):
def __init__(self):
ranks = ["6", "7", "8", "9", "10", "J", "Q", "K", "A"] # Ranks
suits = ["D", "C", "H", "S"] # Suits
self.cards = [Card(r, s) for r in ranks for s in suits] # Generating deck, consists of 36 cards
shuffle(self.cards)
def dealCard(self):
# Card handing over function
self.cards.pop()
amount_players = int(input("Enter amount of players: "))
deck = Deck() # Creating deck
i = 0
# Creating players
players = [Hand("player{0}".format(i + 1)) for i in range(amount_players)]
print("Players: ")
for player in players:
# Printing players
print(player)
for player in players:
while i < 6:
# Distrbuting 6 card per player
player.addCard(deck.dealCard())
i += 1
for player in players:
print(player)
有人知道如何修复它吗?我认为您手中不需要card属性,因此您应该从Hand构造函数中删除初始化。所有卡都已存储在卡中 这将导致以下错误:
File "/tmp/t.py", line 43, in getValue
result += self.card.cardPoints(self)
AttributeError: 'Hand' object has no attribute 'card'
这里的问题是,您不使用card循环迭代变量,因为您使用self在对象中查找它。cardPoints方法也不接受除隐式self参数以外的任何参数,因此我们也要解决这个问题:
for card in self.cards:
result += card.cardPoints()
这将使您克服最初的错误
之后,您必须更改dealCard方法以实际返回从组中弹出的卡,因为dealCard方法当前不返回任何内容,根本没有返回语句
# Change this line:
result += self.card.cardPoints(self)
# to this:
result += card.cardPoints()
您不需要将对象instanceself传递给“cardPoints”。为什么会有这样的情况:
self.card = Card
没有必要这样做,您所做的只是将self.card设置为类而不是对象。我刚刚调试了它,然后看到了Florian的答案。我的代码中提到了这些更改,并且删除了全局I变量。你永远不要使用全局i,这是我们编程前辈传给后代的一条永远不要忘记的戒律。作为旁注:你的卡片分数太大了,请尝试def cardpoints self:+try:return intself.rank+除了:如果self.rank==A else 10,则返回11