我正在设计一个简单的角色扮演游戏(类似于魔兽世界,英雄联盟等),你基本上拥有一个与野生生物和其他英雄/冠军战斗的英雄或冠军。 然后这个英雄可以通过从战斗中获得经验值来升级,并且每个级别都会授予他技能点,这使他能够提升他的一项技能。 每种技能都有自己的目的并做自己的事情,技能的一个例子是:
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
实例,我可以通过简单地执行warrior1 = Warrior(name='Warrior God', maximum_level=40)
如果我不必担心子类或易于创建,这就是本课的样子:
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 []
...
修改 我忘了提;在这种情况下,每个玩家可以扮演完全相同的英雄,战士,这就是为什么战士是一个阶级,而不仅仅是英雄的一个实例。他们都具有相同的技能组合,但具有独特的等级。
编辑2: 我对Python类或任何东西没有任何问题,通常我不会使技能嵌套类或类似的东西,但在这种情况下,我必须投入很多来轻松创建类,所以即使是" noobs"可以做到这一点,而根本不知道任何python。
答案 0 :(得分: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
更适合作为实例而非<{1}}和{{1}}的子类。 / p>
或者,考虑让用户在代码中创建外部字符(例如,在JSON,XML,YAML等中),然后解析文件并从输入数据创建适当的实例。