繁体   English   中英

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

[英]Can't solve 'NoneType' object is not iterable TypeError

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

类文件夹:

game.py: http://pastebin.com/P7Degwna (我没有足够的信誉来发布两个以上的链路以下断开的链接是完整,但他们的代码,我认为这是完全正常。)

magic.py:http://pastebin.com/wpwSCDe7

库存.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错误。

每当在代码周围第一次选择不是咒语的咒语时,它就可以正常工作。

相关代码部分:

这是我的主程序

#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()返回None而不是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计算为true时才看到错误的原因。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM