Реализация навыков на основе Django - PullRequest
3 голосов
/ 03 декабря 2009

Я работаю над RPG с использованием django и рассматриваю различные варианты реализации части системы навыков.

Скажем, у меня есть базовый класс навыков, например, что-то вроде:

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

Каковы были бы некоторые подходы к реализации конкретных навыков? Первый вариант, который приходит на ум:

1) Каждый навык расширяет класс навыка и переопределяет определенные функции:

Не уверен, как это будет работать в Django. Похоже, что наличие таблицы БД для каждого навыка было бы излишним. Может ли дочерний класс быть абстрактным, пока в классе Skill есть запись? Не правильно звучит. Как насчет использования прокси-класса?

Какие есть еще варианты? Я хотел бы избежать использования сценариев для подхода чистого Джанго.

Ответы [ 5 ]

5 голосов
/ 03 декабря 2009

Возможно, вы могли бы рассмотреть разделение навыка и связанного с ним эффекта. Скорее всего, в конечном итоге навыки будут иметь один или несколько связанных с ними эффектов, и этот эффект потенциально может использоваться несколькими навыками.

Например, эффектом может быть «Наносит ли N мороз повреждения текущей цели». Этот эффект может быть использован навыками «Метелица», «Ледяной взрыв» и «Ледяная нова».

models.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.
1 голос
/ 03 декабря 2009

Я бы настроил наследство.

class BaseSkill(models.Model):
    name = models.CharField()
    cost = models.PositiveIntegerField()
    type = models.CharField()
    ....

class FireSkill(BaseSkill):
    burn_time = models.PositiveIntegerField()

    def save():
        self.type = 'fire_skill'
        return super(FireSkill, self).save()

class IceSkill(BaseSkill):
    freeze_time = models.PositiveIntegerField()

    def save():
        self.type = 'ice_skill'
        return super(IceSkill, self).save()

Преимущества этого состоят в том, что вы просто хотите перечислить навыки игрока, необходимые для работы с классом BaseSkill. Если продавец продает навыки, вам нужно всего лишь перечислить цены из класса BaseSkill. Когда вам нужны более подробные атрибуты навыка, легко получить тип для доступа к нему. Например. Если у вас есть: skill = BaseSkill.objects (). Get (pk = 1) , вы можете получить доступ к навыку льда, выполнив skill.ice_skill.freeze_time или, в более общем случае, get_attribute ( skill, skill.type) .field_name

1 голос
/ 03 декабря 2009

Когда я увидел это, было два класса: один для Навыка как абстрактного экземпляра (например, навык говорения на шведском языке, навык в разработке Excel), а затем реальные навыки, которыми обладает человек с иностранным языком. ключ к навыку.

1 голос
/ 03 декабря 2009

Я немного устал (поздно здесь, в Швеции), поэтому мне жаль, если я неправильно понял, но первое, что пришло мне в голову, было дополнительные поля в отношениях "многие ко многим"

0 голосов
/ 03 декабря 2009

Вы также можете использовать одну таблицу и сохранить внутреннюю модель, основанную на объекте, в маринованном поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...