无法解决'NoneType' object is not iterable TypeError

Can't solve 'NoneType' object is not iterable TypeError

链接: main.py: http://pastebin.com/19qBqWcF

类文件夹:

game.py: http://pastebin.com/P7Degwna (我没有足够的声誉 post 超过两个链接。以下断开的链接是为了完整性,但我认为它们的代码完全没问题)

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

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() returned None 而不是三元组。

  • 接下来,查看Person.choose_enemy_spell中的代码,检查所有退出路径,看看哪一个有问题。

  • 第 169 行和第 175 行的 return 都正确 return 一个 3 元组,return choose_attack, spell, magic_dmg。但是,第 172 行的代码在没有 return 的情况下计算了预期的结果。这就是为什么您仅在 (spell.type == "white" and pct > 50) or self.mp < spell.cost 计算结果为真时才看到错误。

否则,您的代码看起来不错。希望这个小小的调试练习能满足您的技能培养目标:-)