我正在使用 django 开发 RPG,并且正在考虑实现部分技能系统的不同选项。

假设我有一个基本技能类,例如:

class Skill (models.Model):
      name = models.CharField()
      cost = models.PositiveIntegerField()
      blah blah blah

实现特定技能的方法有哪些?想到的第一个选项是:

1) 每个技能都扩展了技能等级和
覆盖特定功能:

不确定这在 Django 中如何工作。似乎每个技能都有一个 db 表会有点矫枉过正。当技能类有条目时,子类可以是抽象的吗?听起来不对。使用代理类怎么样?

还有哪些其他选择。我想避免使用纯 django 方法的脚本方法。

最佳答案

也许您可能会考虑将一项技能与其相关的效果分开。更有可能的是,技能最终会产生一种或多种与其相关的效果,而这种效果可能会被多种技能使用。

例如,效果可能是“对当前目标造成 N 次霜冻伤害”。该效果可以被技能“暴风雪之箭”、“冰霜冲击”和“冰冷新星”使用。

模型.py

class Skill(models.Model):
    name = models.CharField()
    cost = models.PositiveIntegerField()
    effects = models.ManyToManyField(Effect)

class Effect(models.Model):
    description = models.CharField()
    action = models.CharField()

    # Each Django model has a ContentType.  So you could store the contenttypes of
    # the Player, Enemy, and Breakable model for example
    objects_usable_on = models.ManyToManyField(ContentType)

    def do_effect(self, **kwargs):
        // self.action contains the python module to execute
        // for example self.action = 'effects.spells.frost_damage'
        // So when called it would look like this:
        // Effect.do_effect(damage=50, target=target)
        // 'damage=50' gets passed to actions.spells.frost_damage as
        // a keyword argument

        action = __import__(self.action)
        action(**kwargs)

效果\spells.py
def frost_damage(**kwargs):
    if 'damage' in kwargs:
        target.life -= kwargs['damage']

        if target.left <= 0:
            # etc. etc.

关于python - 基于Django的技能实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1836881/

10-13 02:07