将类和实例变量混合在一起

2024-04-26 10:55:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在设计一个简单的角色扮演游戏(类似于魔兽世界,传奇联盟等),你基本上有一个英雄或一个冠军,他与野生动物和其他英雄/冠军战斗。 这个英雄可以通过从战斗中获得经验值来升级,每一级都会给他一个技能点,这可以让他提升一个技能。 每种技能都有自己的目的和作用,例如:

class DamageAura(Skill):
    """
    This skill increases damage dealt by your hero,
    as well as deals damage back to the ones who attack your hero.
    """

    name = 'Damage Aura'
    description = '...'

    # These methods are called when the actual event happens in game

    def unit_attack(self, target, damage):  
        target._health -= (self.level / 100) * damage

    def unit_defend(self, attacker, damage):
        attacker.deal_damage((self.level / 100) * damage)

现在我希望游戏中的玩家能够创造出他们自己的英雄,我需要让它变得简单。 问题是,我不想做“坏”代码只是为了让创建英雄更容易。 下面是一个英雄类的理想状态:

^{2}$

现在的问题是,我希望name变量是实际hero(f.e.Warrior)实例的属性,而不是类变量。 有没有一种简单而安全的方法来合并这两者? 基本上,类变量将定义一个英雄的默认值,但是如果我想用一个自定义名称创建一个Warrior实例,我只需做warrior1 = Warrior(name='Warrior God', maximum_level=40)

如果我不必担心子类或创建的难易程度,这个类就是这样的:

class Hero(object):
    def __init__(self, name, description='', maximum_level=50, skill_set=None, ...):
        self.name = name
        self.description = description
        self.maximum_level = maximum_level
        self.skill_set = skill_set or []
        ...

我忘了提,每个玩家都可以扮演同一个英雄,在这个例子中是战士,所以这就是为什么战士是一个类,而不仅仅是一个英雄的例子。他们都有相同的技能,但水平不同等等

编辑2: 我对Python类没有任何问题,通常我不会让技能嵌套类,或者任何类似的东西,但是在这种情况下,我必须在创建类的容易性上投入大量的资金,所以即使是“noob”也可以在几乎不知道Python的情况下完成它。在


Tags: nameself游戏def技能descriptionlevelskill
1条回答
网友
1楼 · 发布于 2024-04-26 10:55:13

您可以允许最终用户将其Hero定义创建为字典:

my_hero = dict(name='Warrior'.
               description='Ancient Warrior is thirsty for blood.',
               maximum_level=30,
               ...)

然后您可以轻松地创建一个实例,如:

^{pr2}$

(如果语法不熟悉,请参见What does ** (double star) and * (star) do for parameters?

对于DamageAura和{},它们分别作为Skill和{}的子类更合适。在


或者,考虑让用户在代码的之外创建字符(例如在JSON、XML、YAML等中),然后解析文件并从输入数据创建适当的实例。在

相关问题 更多 >