当人攻击他人时触发事件的逻辑?

时间:2013-05-26 20:51:15

标签: python events logic

我有一个类Person,如下所示:

class Person(object):
    def __init__(self, health, damage):
        self.health = health
        self.damage = damage

    def attack(self, victim):
        victim.hurt(self.damage)

    def hurt(self, damage):
        self.health -= damage

我还有一个Event类,它包含在事件触发时调用的侦听器函数。 让我们为实例添加一些事件:

    def __init__(self, health, damage):
        self.health = health
        self.damage = damage
        self.event_attack = Event() # fire when person attacks
        self.event_hurt = Event() # fire when person takes damage
        self.event_kill = Event() # fire when person kills someone
        self.event_death = Event() # fire when person dies

现在,我希望我的事件能够使用**kwargs将某些数据发送到侦听器函数。 问题是,我希望所有四个事件都发送attackervictim。 这使得它有点复杂,我必须将attacker作为hurt() - 方法的参数,然后再次在attacker的{​​{1}}中引发victim的事件} -method:

hurt()

我认为我甚至不应该将def attack(self, victim): self.event_attack.fire(victim=victim, attacker=self) victim.hurt(self, self.damage) def hurt(self, attacker, damage): self.health -= damage self.event_hurt.fire(attacker=attacker, victim=self) if self.health <= 0: attacker.event_kill.fire(attacker=attacker, victim=self) self.event_death.fire(attacker=attacker, victim=self) 作为attacker - 方法的参数,因为它不需要伤害,仅用于提升事件。 此外,在受害者的hurt()方法中提升攻击者的event_kill - 事件几乎不会反对封装。

我应该如何设计这些事件,以便它们遵循封装并且通常更有意义?

1 个答案:

答案 0 :(得分:1)

你根据一个非常具体的情况要求一个非常一般的答案。我想提出一个更模糊的答案,忘记你目前的具体情况。因此,这可能过于笼统,无法直接应用于您的情况。

Tubmud我们设计了一个事件系统,我们不止一次地重新设计以满足我们的所有需求,但它仍然无法处理我们能想到的一切。但是你的例子非常有名,并且会在那里找到合适的代表。

该系统基于全局事件服务器(单例,GES),事件的所有侦听器都将注册到该服务器,并且GES将处理所有事件分发。不会直接涉及其他对象。

如果某人对其他人施加攻击,则只会告诉GES发送攻击事件。 GES然后(基于发生事件的位置,但是超出范围)将该事件发送给所有涉及的攻击听众(监护角度,受害者,攻击者,武器......)。

现在,受害者也会收到该事件(将由GES调用),然后作为反应时间表进行伤害事件(再次仅通过向GES告知该事件)。在这个事件中是否会提到伤害的来源数据仅仅是一个设计决定(也许你不想让伤害听众像治疗法术或类似的任何方法找出谁是攻击者,无论如何原因)。在Tubmud,我们尽可能多地发送信息,并没有遇到任何弊端。

受害者现在将再次被GES召唤以接收它自己发送的伤害事件(因为可能其他一些听众会改变伤害,例如减少因疼痛阻滞剂造成的伤害)。对此作出反应,实际上会降低其健康状况。

如果健康减少导致死亡,那么它将发送死亡事件,因为在我们的理解中,死亡是更实际的事情发生(并且我们让事先发生)。这也是通过GES发送并由受害者再次收到的事件。如果您决定不在伤害事件中提及攻击者,那么它也不会出现在死亡事件中。所以也许你现在会做出不同的决定; - )

最后,现在,在我的理解中,杀戮不是一个物理事件,而是对发生的事情的解释。如果攻击事件导致伤害并导致死亡,那么这就是杀戮。所以,严格地说,检测这种情况的正确方法是一种全能的法官,只是注意到所有这些事件,并根据他们的结果决定然后发送一个杀戮事件。

我不确定这些想法是否会以任何方式帮助你。我只是发布这个报告,说明我们是如何做到的。

所以,关于你的问题:

如果你设计一个物理世界的模拟,并希望能够在一系列事件之后决定他们意味着什么,那么不要过于急于封装数据只是试图将其粘贴在它所属的位置。在伤害事件期间,攻击者可能看起来并不重要,所以你可能会想要省略它,但是一旦结果被解释为完整性,丢失数据就会很烦人。毕竟,在现实生活中,警察可能也会发现丢失的数据(事实上,在现实生活中,造成损害的信息通常 存在于伤害中)。