2013-05-26 44 views
1

我有一個類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() - 方法,然後再籌集victimhurt() - 方法的attacker事件:

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-受害者內部的事件hurt()-方法很難對抗封裝。

我應該如何設計這些事件以便他們遵循封裝並且通常更有意義?

+0

他們需要是類方法嗎? – James

+0

'他們'?聽衆不會,他們可以是任何東西。但顯然它是攻擊者和受到傷害的人,所以'攻擊'和'傷害'必須是方法。 –

+1

對當天最有趣的問題標題+1。 – Alfe

回答

1

你要求一個非常一般的答案,基於一個非常具體的情況。我想給出一個比較模糊的答案,它會對目前的具體情況有所瞭解。所以也許這太籠統了,無法直接應用於你的情況。

Tubmud我們設計我們重新設計了不止一次,以適應我們的需要的事件系統,仍然無法處理,我們能想到的一切。但你的榜樣非常有名,並且會在那裏找到合適的代表。

該系統基於全局事件服務器(單例,GES),事件的所有偵聽器都將註冊到該事件服務器,並且所有事件分發都將由GES處理。不會直接調用其他對象。

如果一個人對另一個人施加攻擊,它只會告訴GES發送了一個攻擊事件。然後GES(根據事件發生的位置,但超出範圍)將該事件發送給所有涉及攻擊聽衆(監護人角度,受害者,攻擊者,武器......)。

現在受害者也會收到該事件(將由GES調用),然後作爲反應安排一個傷害事件(再次通過僅告知GES關於該事件)。不管傷害的來源是否會在該事件中被提及,數據僅僅是一個設計決定(也許你不想給傷害聽衆如治療法術或類似的找出攻擊者是誰的手段,因爲任何原因)。在Tubmud,我們儘可能地發送了儘可能多的信息,並沒有以這種方式遇到任何缺點。

受害者現在將被GES再次調用以接收其發送的傷害事件(因爲也許其他一些聽衆會改變傷害事件,例如減少疼痛阻滯劑造成的傷害)。對此做出反應,實際上會降低其健康水平。

如果減少健康導致死亡,它會發出死亡事件,因爲在我們的理解中,死亡是更有形的事情發生(並且我們首先發生)。這又是通過GES發送並由受害者再次收到的事件。如果你決定在傷害事件中不提及攻擊者,那麼它也不會出現在死亡事件中。所以,也許你現在會做出不同的決定;-)

最後,現在,在我的理解中,殺人不是物理事件,而是對發生的事情的解釋。如果攻擊事件導致傷害並導致死亡,那麼這是一次殺戮。因此,嚴格來說,檢測這種情況的正確方法將是一種全能的法官,只是注意到所有這些事件,並根據其結果決定發送殺人事件。

我不確定這些想法是否對您有所幫助。我只是將其作爲我們如何做到這一點的報告發布。

所以,關於你的問題:

如果你設計的物理世界的模擬,並希望能夠後的一系列事件他們意味着決定,不要太急於通過試圖只在它所屬的地方粘住數據來封裝數據。攻擊者在傷害事件中可能看起來並不重要,所以您可能會想要忽略它,但只要結果能夠被完整解讀,缺少的數據就會令人討厭。畢竟,在現實生活中,警方可能也會發現缺失的數據(因此實際上在現實生活中,通常造成損害的信息是,其中傷害爲)。

+0

嗯,這並沒有直接回答我的問題,但我認爲這不僅僅是一個直接的答案。我不會接受,如果有人提出更好的答案(懷疑它),但感謝您的偉大答案,我*真的*欣賞它! :) –

+0

喜歡寫它:)你可以再次改變你的接受程度,所以AFAIK接受答案不是最終的。 – Alfe

相關問題