关于python:基于Django的技能实现
Django-based skill implementation
我正在使用 django 开发 RPG,并且正在考虑实施部分技能系统的不同选项。
假设我有一个基础技能课程,例如:
|
1
2 3 4 |
class Skill (models.Model):
name = models.CharField() cost = models.PositiveIntegerField() blah blah blah |
实施特定技能的方法有哪些?想到的第一个选项是:
1) 每个技能都扩展了技能等级和
覆盖特定函数:
不确定这将如何在 django 中工作。似乎为每个技能都有一个数据库表会有点过头了。子类可以是抽象的,而技能类有一个条目吗?听起来不对。使用代理类怎么样?
还有哪些其他选择。我想避免纯 django 方法的脚本方法。
相关讨论
- 每项技能之间的独特性如何?有些人会有特殊技能独有的领域吗?
也许你可以考虑将一个技能和它的相关效果分开。更有可能的是,技能最终会产生一种或多种与之相关的效果,并且该效果可能会被多种技能使用。
例如,一个效果可以是"对当前目标造成 N 点冰霜伤害"。该效果可以被技能"暴雪之箭"、"冰霜冲击"和"冰霜新星"使用。
models.py
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class Skill(models.Model):
name = models.CharField() cost = models.PositiveIntegerField() effects = models.ManyToManyField(Effect) class Effect(models.Model): # Each Django model has a ContentType. So you could store the contenttypes of def do_effect(self, **kwargs): action = __import__(self.action) |
效果\\\\\\\\spells.py
|
1
2 3 4 5 6 |
def frost_damage(**kwargs):
if 'damage' in kwargs: target.life -= kwargs['damage'] if target.left <= 0: |
相关讨论
- 在我参与过的游戏中,每个技能都不会有单独的子类。你会有这样的东西,一个通用的"技能"类保存通用信息,并根据需要将不同的效果和动作与技能相关联。
- (这意味着"我同意这个答案"的评论。)
- 感谢您的良好回应。我知道我最终会为其他技能类型做一堆继承,即被动与主动技能等。将单独的字段作为基本技能的一部分,指向定义技能/效果特定动作的模块/类/功能触及我想要弄清楚的核心。
当我看到这个时,有两个类:一个是作为抽象实例的技能(例如说瑞典语的技能,Excel 开发的技能),然后是一个人所拥有的实际技能技能的外键。
我会设置一些继承。
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class BaseSkill(models.Model):
name = models.CharField() cost = models.PositiveIntegerField() type = models.CharField() .... class FireSkill(BaseSkill): def save(): class IceSkill(BaseSkill): def save(): |
这样做的好处是,当您只想列出所有需要使用 BaseSkill 类的玩家技能时。如果 vendor正在销售技能,您只需列出 BaseSkill 类的价格。当您需要更详细的技能属性时,可以轻松获取类型来访问它。例如。如果你有:skill = BaseSkill.objects().get(pk=1) 你可以通过 Skill.ice_skill.freeze_time 或者更一般的 get_attribute(skill, Skill.type).field_name
来访问冰技能
我有点累(在瑞典迟到了),所以如果我误解了我很抱歉,但我首先想到的是多对多关系的额外字段。
相关讨论
- 这是一个很好的建议,但我很难考虑如何避免使用这种方法为每个技能提供额外的模型。
您还可以使用单个表并将基于对象的内部模型保存在腌制字段中。