gpt4 book ai didi

python - 当一个人攻击另一个人时触发事件的逻辑?

转载 作者:太空宇宙 更新时间:2023-11-03 18:58:14 25 4
gpt4 key购买 nike

我有一个类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 将某些数据发送到监听器函数。问题是,我希望所有四个事件都发送攻击者和受害者。这使得事情变得有些复杂,我必须将 attacker 作为 hurt() 方法的参数,然后再次引发 attacker 的事件受害者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() 方法的参数,因为它不需要用于伤害,仅用于引发事件。此外,在受害者的 hurt() 方法中引发攻击者的 event_kill 事件几乎不会违反封装。

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

最佳答案

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

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

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

如果一个人要对另一个人进行攻击,它只会告诉 GES 发送了一个攻击事件。然后,GES 会(根据事件发生的位置,但这超出了范围)将该事件发送给所有涉及的攻击监听者(监护人、受害者、攻击者、武器……)。

现在,受害者也将收到该事件(将由 GES 调用),然后作为 react 计划伤害事件(再次仅通过告诉 GES 该事件)。事件数据中是否提及伤害的来源仅仅是一个设计决策(也许您不想为伤害监听者提供治疗咒语或类似的任何方法来找出攻击者,无论出于什么原因原因)。在 Tubmud,我们致力于发送尽可能多的信息,并且这种方式没有遇到任何缺点。

受害者现在将被 GES 再次调用以接收它自己发送的伤害事件(因为也许其他一些听众会改变伤害中的某些内容,例如减少由于止痛药造成的伤害)。对它使用react,实际上会降低它的生命值。

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

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

我不确定这些想法是否对您有任何帮助。我只是将其作为关于我们如何做到这一点的报告发布。

所以,关于你的问题:

如果您设计物理世界的模拟,并希望能够在一系列事件发生后决定它们的含义,请不要太急于封装尝试将数据仅粘贴在其所属的位置。在伤害事件期间,攻击者可能看起来并不重要,因此您可能会想忽略它,但是一旦结果被完整地解释,丢失的数据就会令人烦恼。毕竟,在现实生活中,警察也可能会发现丢失的数据(因此实际上,在现实生活中,造成损害的信息通常存在于伤害中)。

关于python - 当一个人攻击另一个人时触发事件的逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16763583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com