无法解决'NoneType'对象不可迭代TypeError

时间:2017-03-26 00:38:49

标签: python nonetype

链接: 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

1 个答案:

答案 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评估为真时才会看到错误。

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