例如,我正在尝试为简单游戏构建一个敌人类。产生的每个敌人都有一个类型,它会影响它的属性,即敌人类中的字段。
class Enemy:
#Base Stats for all enemies
name = "foo"
current_health = 4
max_health = 4
attack = 0
defense = 0
armor = 0
initiative = 0
initMod = 0
alive = True
每个类型应该是敌人的子类,如此...
class goblin(Enemy):
name = goblin;
current_health = 8
max_health = 8
attack = 3
defense = 2
armor = 0
def attack(){
//goblin-specific attack
}
但是这种方法意味着我必须为每个类型(这将是80多个类)构建一个类,或者有更好的方法吗?这个敌人将被随机化,所以我认为 types 也可以放入字典,它使用的名字>类型作为关键字。虽然我不完全确定如何实现它。
答案 0 :(得分:0)
如果你想去字典路线,你可以做一些这样的事情,关键字返回一个元组:
enemy_types = {"goblin": ("goblin", 8, 8, 3, 2, 0, goblin_attack)}
def goblin_attack(enemy):
do_stuff()
虽然你可能想使用named_tuple
https://stackoverflow.com/a/13700868/2489837
确保你不要混淆元组中的字段
答案 1 :(得分:0)
如果每种敌人类型的属性集和可能的操作在各种类型中最常见,我没有理由做更复杂的事情而不是为类型定义80项枚举,并使用单个类叫Enemy
。
如果您确实需要各种各样的操作,也许您可以将80种类型分组到各种集合中,然后这些集合具有共同的属性(例如FlyingEnemy
,UndeadEnemy
等)。那些将成为你的子类。
答案 2 :(得分:0)
妖精应该是敌人的一个例子。但是,在您的示例中,您添加了一个名为attack
的方法。我想说最好的方法就是这样:
class Enemy:
#Base Stats for all enemies
def __init__ (self, **kwargs):
self.name = "foo"
self.current_health = 4
self.max_health = 4
self.attack = 0
self.defense = 0
self.armor = 0
self.initiative = 0
self.initMod = 0
self.alive = True
# Use this to specify any other parameters you may need
for key in kwargs:
exec ("self.%s = %s" % (key, kwargs[key])
现在,您可以创建一个名为goblin的Enemy
实例。
要回答你关于何时使用子类的初始问题,我会说使用子类很好,但可能会使你的情况复杂化。由于您的子类中只有一个方法,因此您可以轻松地创建一个模块,然后在__init__
中创建一个指定attack
函数的参数。这将简化您的代码。
注意:如果您要使用子类,请确保在子类的
__init__
中使用__init__
调用基类的super()
。