Tcard.attack(self.players[self.opponent])
AttributeError: 'int' object has no attribute 'attack'
这是我通过致电attack()
得到的错误。
Tcard = self.players[self.turn].returnCard()
Tcard.attack(self.players[self.opponent])
由于某些奇怪的原因,当Tcard.attack()使用参数self.players [self.opponent]调用时,该列表返回的是比玩家对象更多的内容。有人可以解释为什么它返回一个int而不是一个对象吗?
以下是整个文件的代码:
class Game():
def __init__(self):
self.players = []
self.turn = 0
self.opponent = 1
def prepare_game(self):
AI_1 = AI("AI_1", 1000)
AI_1.generate_inventory()
AI_2 = AI("AI_2", 1000)
AI_2.generate_inventory()
self.players.append(AI_1)
self.players.append(AI_2)
def start(self):
p1 = self.players[self.turn]
p2 = self.players[self.opponent]
Tcard = self.players[self.turn].returnCard()
print "Battle time"
print "%s attacked %s" % (p1.Name, p2.Name)
Tcard.attack(self.players[self.opponent])
#switch
if self.turn == 0:
self.turn = 1
self.opponent = 0
self.start()
else:
self.turn = 0
self.opponent = 1
self.start()
这是函数returnCard所在的位置:
class AI():
def __init__(self, Name, Health):
self.Name = Name
self.Health = Health
self.inventory = []
def generate_inventory(self):
#Generate 6 Cards and 3 Power-ups
#rand_powerups = random.randint(min(len(powerup)), max(len(powerup)))
rand_cards = random.randint(0, 4)
#self.inventory.append(rand_powerups)
while len(self.inventory) != 4:
self.inventory.append(rand_cards)
if len(self.inventory) == 4:
break
def returnCard(self):
return self.inventory[random.randrange(0, 4)]
答案 0 :(得分:1)
self.inventory = [] # a list
rand_cards = random.randint(0, 4)
self.inventory.append(rand_cards) # you add ints to the list
# you return an int
return self.inventory[random.randrange(0, 4)]
# you set Tcard equal to an int returned from ^^
Tcard = self.players[self.turn].returnCard()
另一方面,您应该使用范围添加随机整数并继续调用randint,否则您只会将相同的数字添加到列表中:
def generate_inventory(self):
for _ in range(4):
self.inventory.append(random.randint(0, 4))
如果要使用类中的方法,请创建实例。我可以给你一个例子,但我不知道攻击来自哪里。
答案 1 :(得分:1)
def returnCard(self):
return self.inventory[random.randrange(0, 4)]
returnCard
会返回self.inventory
的随机项。
而self.inventory
由generate_inventory
填充,执行此操作:
# generate a random *INT*
rand_cards = random.randint(0, 4)
while len(self.inventory) != 4:
# append that *INT*
self.inventory.append(rand_cards)
# (note that this keeps adding the same number over and over)
因此,当然,returnCard
将返回一个int:
Tcard = self.players[self.turn].returnCard()
因此,当您尝试调用attack
时,您尝试在int:
Tcard.attack(self.players[self.opponent])
答案 2 :(得分:1)
首先,由于这一行,Tcard
成为一个变量:
Tcard = self.players[self.turn].returnCard()
通过为Tcard
分配.returnCard()
的结果,它始终是一个整数,因为您使returnCard()
返回一个整数:
return self.inventory[random.randrange(0, 4)]
因此,由于整数不具有任何属性,因此这将是一个错误。因此,引发的错误表明int
没有属性。
其次,Tcard
甚至不是一个功能。只有函数可以具有属性,从而为错误添加更多内容。您需要为Tcard
创建一个能够工作的函数。添加如下内容:
class Tcard:
def attack():
#Do something