链接: main.py: http://pastebin.com/19qBqWcF
Classes文件夹:
game.py: http://pastebin.com/P7Degwna (我没有足够的声誉发布两个以上的链接。以下断开链接是为了完整性,但我相信他们的代码完全没问题)
magic.py:http:// pastebin.com/wpwSCDe7
inventory.py:http:// pastebin.com/8kFXJne1
我正在努力成为一名优秀的程序员,并且一直在关注一个简单的战斗系统的教程。目前正在实施敌人战斗战术。
我正在尝试编程,如果一个敌人选择治疗并且剩下超过50%,他们会重新选择一个咒语。 每当发生这种情况时,我的代码都会出现以下错误
Traceback (most recent call last):
File "C:/Users/Kyle/PycharmProjects/battle/main.py", line 160, in <module>
choose_attack, spell, magic_dmg = enemy.choose_enemy_spell()
TypeError: 'NoneType' object is not iterable
以下是在此之前输出到终端的转储:
ACTIONS:
1. Attack
2. Magic
3. Items
Choose action:1
TARGET:
1. Ganon
2. Vaati
Choose target:1
player attacked enemy for 284 points of damage.
Begin method
Curaga INSIDE CLASS
This is happening.
Begin method
Meteor INSIDE CLASS
1186 INSIDE CLASS INSIDE METHOD INSIDE FINAL ELSE
我可以看到我的玩家轮到他们,然后敌人选择治疗法术,有太多的HP选择另一个法术然后我得到noneType错误。
每当第一次选择另一个不是curaga的咒语时,代码就可以了。
#Create Black Magic
fire = Spell("Fire", 25, 600, "black") #create object fire from class Spell
thunder = Spell("Thunder", 25, 600, "black")
blizzard = Spell("Blizzard", 25, 600, "black")
meteor = Spell("Meteor", 40, 1200, "black")
quake = Spell("Quake", 32, 900, "black")
#Create White Magic
cure = Spell("Cure", 25, 620, "white")
cura = Spell("cura", 32, 1500, "white")
curaga = Spell("Curaga", 50, 6000, "white")
#Create lists of magic and items associated with players
player_magic = [fire, thunder, blizzard, meteor, cure, cura] #Create list of magic spell objects for object player
player_items = [{"item": potion, "quantity": 15}, {"item": hipotion, "quantity": 5}, {"item": superpotion, "quantity": 5},
{"item": elixer, "quantity": 5}, {"item": hielixer, "quantity": 2}, {"item": grenade, "quantity": 5},] #Create list of item objects for object player
#Creat lists of magic and items associated with enemies
enemy_spells = [fire, meteor, curaga]
eneny_items = []
#Istantiate Player objects
player1 = Person("Zelda", 3260, 132, 300, 34, player_magic, player_items)
#Inistantiating object player using class Person
player2 = Person("Link ", 4160, 188, 311, 34, player_magic, player_items)
player3 = Person("Sheik", 3089, 174, 288, 34, player_magic, player_items)
#Instantiate Enemy objects
enemy1 = Person("Vaati", 1250, 130, 560, 325, enemy_spells, [])
enemy2 = Person("Ganon", 18200, 701, 535, 25, enemy_spells, [])
#Instantiating object enemy using class Person
enemy3 = Person("Vaati", 1250, 130, 560, 325, enemy_spells, [])
# Enemy chose to use magic
if enemy_choice == 1:
choose_attack, spell, magic_dmg = enemy.choose_enemy_spell()
enemy.reduce_mp(spell.cost)
if spell.type == "white": # Check type of spell of object spell to determine how to handle the chosen spell.
enemy.heal(magic_dmg) # White typer means heal
print(bcolours.OKBLUE + "\n" + spell.name, " heals", enemy.name + str(magic_dmg),
"HP." + bcolours.ENDC)
elif spell.type == "black": # black type means do damage
target = random.randrange(0, 3)
players[target].take_damage(magic_dmg)
print(bcolours.OKBLUE + "\n" + enemy.name.replace(" ", "") + "'s " + spell.name, "deals",
str(magic_dmg), "points of damage to " + players[target].name + bcolours.ENDC)
if players[target].get_hp() == 0:
print(players[target].name + " has died.")
del players[target]
#Determine the spell the enemy chooses to use
def choose_enemy_spell(self):
print("Begin method")
choose_attack = 0
magic_choice = random.randrange(0, len(self.magic))
spell = self.magic[magic_choice]
magic_dmg = spell.generate_damage()
print(spell.name, "INSIDE CLASS")
pct = (self.hp / self.maxhp)*100 #percentage of health remaining
if self.mp < 25:
print("This probably isnt happening")
choose_attack = 1
return choose_attack, spell, magic_dmg
if (spell.type == "white" and pct > 50) or self.mp < spell.cost:
print("This is happening.")
self.choose_enemy_spell()
else:
print(magic_dmg, "INSIDE CLASS INSIDE METHOD INSIDE FINAL ELSE")
return choose_attack, spell, magic_dmg
答案 0 :(得分:2)
http://pastebin.com/P7Degwna中的第172行缺少return
。
变化:
self.choose_enemy_spell()
要:
return self.choose_enemy_spell()
以下是调试思考过程:
首先查看追溯讯息Traceback (most recent call last): File "C:/Users/Kyle/PycharmProjects/battle/main.py", line 160, in choose_attack, spell, magic_dmg = enemy.choose_enemy_spell() TypeError: 'NoneType' object is not iterable
它告诉你的是enemy.choose_enemy_spell()
返回无而不是3元组。
接下来,查看Person.choose_enemy_spell
中的代码,检查所有退出路径,看看哪个是问题。
第169行和第175行的返回值都正确返回3元组return choose_attack, spell, magic_dmg
。但是,第172行上的代码计算预期结果而不返回它。这就是为什么您只在(spell.type == "white" and pct > 50) or self.mp < spell.cost
评估为真时才会看到错误。
否则,您的代码看起来不错。希望这个小调试练习符合你的技能培养目标: - )