【问题标题】:Python/Pygame: subclass not finding variablePython/Pygame:子类找不到变量
【发布时间】:2013-05-02 18:28:09
【问题描述】:

可能不是正确的标题,但我不知道如何制定它。
我正在尝试根据灵活的值计算统计数据,特别是 HP 和 MP 并返回这些值,以便它们可以打印在屏幕上。我尝试为统计数据创建一个单独的类并调用它,在统计数据以及调用它时将其更改为 self.HP 但似乎没有任何效果,我无法弄清楚如何修复它。
我知道这是很多代码,但有人可以看看吗?

E1:在此处复制了正确的代码(我是个白痴-_-')并将 HP 改回 self.HP 后,程序完全崩溃了......它真的会自行运行到死。

import formulae
from formulae import *

characters = {"1":battle_maiden("Hibikime")}
enemies = {"a":enemy("Enemy")}

while characters["1"].alive and enemies["a"].alive:
    print
    for charactersKey, in sorted(characters.keys()):
        print(characters[charactersKey])

formae.py 中的代码:

class character(object):
    def __init__(self, name):
        self.name = name
        self.alive = True
        self.Hit = 10
        self.Dodge = 0
        self.Lv = 1

    def __str__(self):
        if self.alive:
            return "%s (%i HP, %i MP)" % (self.name, self.HP, self.MP)
        else:
            return "%s (DEAD)" % self.name

    def attack(self, enemy):
        print(self.name, "attacks", enemy.name)
        enemy.hit()

    def hit(self):
        self.HP -= self.Atk
        print(self.name, "is hit! (",self.Atk,")")
        if self.HP <= 0:
            self.die()

    def die(self):
        self.alive = False
        print(self.name, "died.")


class enemy(object):
    def __init__(self, name):
        self.name = name
        self.alive = True
        self.HP = 100
        self.MP = 20
        self.M_Atk = 10
        self.Atk = 30
        self.Def = 5
        self.M_Def = 5
        self.Hit = 10
        self.Dodge = 0

    def __str__(self):
        if self.alive:
            return "%s (%i HP, %i MP)" % (self.name, self.HP, self.MP)
        else:
            return "%s (DEAD)" % self.name

    def attack(self, enemy):
        print(self.name, "attacks", enemy.name)
        enemy.hit()

    def hit(self):
        self.HP -= self.Atk
        print(self.name, "is hit! (",self.Atk,")")
        if self.HP <= 0:
            self.die()

    def die(self):
        self.alive = False
        print(self.name, "died.")


##SUBCLASSES FOR CHARACTERS##

class battle_maiden(character):
    def __init__(self, name):
        super(battle_maiden, self).__init__(self)
        classHP = 80
        classMP = 5
        Vitality = 10
        Wisdom = 3
        Intelligence = 2
        Strength = 15
        Defense = 5
        Dexterity = 15
        Agility = 2

        self.HP = (classHP + (self.Lv*5) + (Vitality *(self.Lv *0.3)))
        self.MP = (classMP + (self.Lv*2) + (Wisdom *(self.Lv *0.2)))
        Atk = (Strength * (self.Lv*0.2))
        M_Atk = (Intelligence * (self.Lv*0.2))
        Def = (Defense + (self.Lv*1.5) + (Defense*0.1))
        M_Def = (Intelligence + (self.Lv*1.5) + (Intelligence*0.1))

我得到的错误:
return "%s (%i HP, %i MP)" % (self.name, self.HP, self.MP)
RuntimeError: 超出最大递归深度

【问题讨论】:

  • 其他地方有battle_maiden的代码吗?
  • 你似乎也没有为你的角色初始化 self.HP——至少不是为你的角色基类或你的法师。你这样做是为了敌人。
  • 我的错,我从代码中取出了一部分,然后从另一个文件中复制了错误的部分,哈哈。让我改变它。我也将其更改为 self.HP 因为 HP 给了我它没有全局声明的错误。

标签: class variables python-3.x pygame


【解决方案1】:

首先是第一,双重导入很淘气,所以不要这样做;)

解决这个问题很简单,你只需要替换替换

super(battle_maiden, self).__init__(self)

character.__init__(self, name)

至于为什么,请尝试自己找出答案。如果你不能在 30 分钟内,请在评论中提问,我会破坏它;)

【讨论】:

  • super(battle_maiden, self).__init__(name) 怎么样?没必要去掉 super() 吧?
  • 不,您不必这样做,这是正确的(尽管哪个版本更好是我不会参与的宗教辩论)。您只需修复变量,使其传递名称,而不是 self 的实例;)。
  • 好吧,我把它放进去是因为我在看一个指南并试图将它应用到这个,它特别声明要添加 super() 到它。这听起来合乎逻辑......
  • 你可以使用 super 就好了,如果这是教程建议的,那就坚持下去。只需确保下次正确输入参数;)
  • 实际上我唯一改变的是子类名称。其余的实际上是从教程中复制粘贴的。 :) 但是,将 self 更改为 name 确实解决了它。虽然我不得不承认我不完全确定为什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2018-11-24
相关资源
最近更新 更多