Я разрабатываю простую ролевую игру (похожую на 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» может это сделать, не зная редко любого питона вообще.
Не уверен, что вы подразумевали это, но '__init__' не является« плохим кодом ». Это довольно часто используется. – Kevin
Итак, вы намерены позволить игрокам создавать пользовательские классы Hero, позволяя им писать код, правильно ли это? Если да, то почему? –
Обратите внимание, что вложенные классы очень редко являются хорошей идеей в Python. –