2014-12-15 3 views
0

Я разрабатываю простую ролевую игру (похожую на World of Warcraft, League of Legends и т. Д.), Где у вас в основном есть герой или чемпион, сражающийся с дикими существами и другими героями/чемпионы. Этот герой может повышаться, получая очки опыта от боев, и каждый уровень дает ему умение, что позволяет ему выровнять одно из его навыков. Каждый навык имеет свои собственные цели и делает свою собственную вещь, пример мастерства будет:Смешивание класса и переменных экземпляра вместе

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) 

Теперь я хотел бы игроков в игре, чтобы иметь возможность сделать свои собственные герои, и я потребность это будет просто. Проблема в том, что я не хочу делать «плохой» код, чтобы упростить создание героев. Вот что класс герой будет идеально выглядеть следующим образом:

class Warrior(Hero): 
    name = 'Warrior' 
    description = 'Ancient Warrior is thirsty for blood.' 
    maximum_level = 30 
    agility = 20 
    intelligence = 10 
    strength = 30 

    class DamageAura(Skill): 
     name = 'Damage Aura' 
     description = '...' 

     def unit_attack(...): 
      ... 

    class StrongerWeapons(Skill): 
     name = 'Stronger Weapons' 
     ... 

Теперь проблема, я хотел бы переменная name быть атрибутом фактического героя (F.E. Warrior) экземпляра, а не переменная класса. Есть ли простой, но безопасный способ объединить эти два? В основном переменные класса будут определять значения по умолчанию для героя, но если бы я хотел создать Warrior экземпляр с пользовательским именем, я мог бы сделать это просто делать

Это то, что класс будет выглядеть, если я не придется беспокоиться о подклассах или простоте создания:

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 [] 
     ... 

EDIT: я забыл упомянуть; каждый игрок может сыграть того же героя, воина в этом случае, поэтому Warrior - это класс, а не только экземпляр Hero. Они все имеют один и тот же набор навыков, но и уникальные уровни и т.д.

EDIT 2: Я не имею никаких проблем с классами Python или что-нибудь, как правило, я бы не сделать навыки вложенных классов или что-нибудь подобное , но в этом случае я должен инвестировать много на простоту создания классов, поэтому даже «noobs» может это сделать, не зная редко любого питона вообще.

+0

Не уверен, что вы подразумевали это, но '__init__' не является« плохим кодом ». Это довольно часто используется. – Kevin

+0

Итак, вы намерены позволить игрокам создавать пользовательские классы Hero, позволяя им писать код, правильно ли это? Если да, то почему? –

+0

Обратите внимание, что вложенные классы очень редко являются хорошей идеей в Python. –

ответ

2

Вы могли бы позволить конечным пользователям создавать свои определения Hero в качестве словаря:

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

Затем вы можете легко создать экземпляр, как:

hero = Hero(**my_hero) 

(Если синтаксис незнаком, см. What does ** (double star) and * (star) do for parameters?)

Для обоих DamageAura и Warrior, кажется, более подходящим для них экземплярами, чем подклассы от Skill и Hero соответственно.


В качестве альтернативы рассмотрит позволяя пользователю создавать свои символы вне вашего кода (например, в формате JSON, XML, YAML, ...), затем проанализируйте файлы и создайте соответствующие экземпляры из входных данных.

+0

Прочтите мое редактирование, я уверен, что классы должны быть классами, а не экземплярами. Извините, забыл упомянуть об этом в первую очередь. Как я могу реализовать навыки, используя ваш метод? Они должны быть связаны с героем, и предпочтительный герой будет определен до навыков. –

+0

@MarkusMeskanen, но нет причин, по которым у каждого игрока не может быть своего экземпляра 'Hero' * без * подкласса *, просто создайте четыре экземпляра' Hero' из спецификации 'Warrior'. – jonrsharpe

+0

Ahh Я вижу это сейчас ... Спасибо, я думаю, что буду использовать ваш подход! –

Смежные вопросы