0

例如,我正在尝试为一个简单的游戏构建一个敌人类。每个生成的敌人都有一个类型,它会影响它的统计数据,这些统计数据是敌人类中的字段。

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 多个类)构建一个类,或者有更好的方法吗?这个敌人将是随机的,所以我想这些类型也可以放入一个字典中,该字典使用类型的名称作为关键字。尽管我不完全确定如何实现这一点。

4

3 回答 3

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

确保您不会混淆元组中的字段

于 2016-08-10T00:03:24.437 回答
0

如果每种敌人类型的属性集和可能的动作在不同类型中都很常见,那么我认为没有理由比为该类型定义一个包含 80 个项目的枚举并使用一个名为Enemy.

如果您确实需要各种操作等,也许您可​​以将您的 80 种类型分组到各种集合中,然后这些集合将具有共同的属性(例如FlyingEnemyUndeadEnemy等)。然后这些将成为您的子类。

于 2016-08-10T00:03:28.223 回答
0

妖精应该是 Enemy 的一个实例。但是,在您的示例中,您添加了一个名为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])

现在您可以创建一个Enemy名为 goblin 的实例。

为了回答您最初关于何时使用子类的问题,我想说使用子类很棒,但在您的情况下可能会使事情变得过于复杂。由于您的子类中只有一个方法,您可以轻松地创建一个模块,然后在__init__指定attack函数的参数中添加一个参数。这将进一步简化您的代码。

注意:如果您要使用子类,请确保在__init__您的子__init__类中使用super().

于 2016-08-10T00:03:33.943 回答