课程什么时候保证子课程?

时间:2016-08-09 23:49:14

标签: python dictionary inheritance pygame python-object

例如,我正在尝试为简单游戏构建一个敌人类。产生的每个敌人都有一个类型,它会影响它的属性,即敌人类中的字段。

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 也可以放入字典,它使用的名字>类型作为关键字。虽然我不完全确定如何实现它。

3 个答案:

答案 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种类型分组到各种集合中,然后这些集合具有共同的属性(例如FlyingEnemyUndeadEnemy等)。那些将成为你的子类。

答案 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()