2012-06-24 100 views
3

這是一個設計問題,我將盡可能清晰地將其框架化,但我不確定要將該問題稱爲我面臨的問題。包裝收集元素

我正在研究視頻遊戲,設置和玩遊戲涉及多個步驟。我想用某種對象來包裝每一個步驟,以保持一切清潔。

我選擇將遊戲流程分解爲會話,回合和產生。一場比賽是最高的比賽級別,您可以配置哪些球員處於活動狀態(通過加入畫面),然後開始一輪比賽。您可以在單個會話中播放多個回合,並且每個回合將繼承全局會話數據。同樣,你可以在每一輪中多次死亡和重生,並繼承本輪和會話的數據。

所以想象一下免費的。

  • 會話1
  • 會話2
    • B輪
      • 菌種1
      • 菌種2
    • 回合Ç
  • 會議3

菌種1將有來自B輪對數據的訪問和會話2

這似乎是一個非常簡潔的設計。我可以將會話範圍的數據保存在一個地方,並在整個會話中保持該對象的活動狀態,每一輪都分支並繼承這些數據。

現在有趣的問題。就像我之前說過的,會話包含一羣玩家(加入遊戲並在整個會話期間處於活動狀態的玩家)。這一輪ALSO需要保留一些關於每個玩家的額外數據,但是這些數據只存在於一輪(例如最後的重生點或當前得分)內。我想要遵循相同的模式,並創建另一個類,這將持有這一輪特定的數據。

這裏發生故障的地方在於維護集合。因爲會話包含了玩家的權威列表,並且每輪都提供了額外的附加數據,如果該輪只更新了SessionPlayer的成員?本輪是否有自己的選手列表,每個選手都有輪次數據和一個指向會話級數據的指針?它們是否應該包含具有匹配ID的單獨集合?

這似乎是可以用巧妙的設計模式解決的問題,但我一直無法找到。

總結:如何臨時包裝一個包含集合的對象,同時包裝該集合的所有元素?

我希望我解釋得很對。謝謝您的幫助!

+0

如何具有'Player'對象攜帶本人所有必要的數據? (如當前會話/輪/產卵,HP,彈藥等等) –

+0

這就是你有多個會話,並在同一時間循環發生一個MMOG? – tcarvin

+0

@tcarvin:不是MMOG,而是與本地合作的遊戲。想想像超級粉碎兄弟 – deemen

回答

2

先回答你的最後一個問題:

總結:如何暫時包裹包含集合的對象,而包裝該集合中的所有元素呢?

這可以用Composite Design pattern,其中一個類包含的元素本身來實現和類可以獨立的,或容器。對這個類的操作本身以及它所包含的每個元素都可以工作。

關於你以前在哪裏存儲玩家的問題,這是一個有點困難,但決定時應該考慮以下幾點:

  • 玩家數據確實應該都是在同一個地方。如果您將其所有權分散到不同的對象中,那是一種凌亂的設計,並且難以維護。
  • 儘量避免在你的依賴層次(會議,圓形,菌種)來回指針/引用,因爲這可以得到真正的複雜真正的快,這將不再是一個依賴層次,而是交織類的扭曲混亂具有非常高的耦合度。
  • 如果由相關層次的所有級別所需要的球員數據,那麼它應該包含的地方是有道理的,是由各個層次的方便。如果是這樣的話,你還應該考慮問自己是否真的有必要讓所有關卡都需要了解玩家數據。

如果它絕對有必要有這些雙向引用,則可能是最好的方式來實施這將是與Dependency Injection。這將簡化與維護雙向參考相關的典型頭痛問題。嘗試僅注入所需的最具體的實體,而不僅僅是整個根級對象,如Session。

+0

感謝提示,這些都是很好的考慮。 我絕對同意有雙向鏈接。這是我儘量避免的事情。 我覺得關於這種情況的奇怪之處在於,層次結構的每個級別都需要了解上面的玩家和級別,還需要添加額外的數據。如果我把所有的回合和菌種級數據在SessionPlayer類,那我也通過某種ResetRound()或ResetSpawn()函數來手動控制這些部件的壽命。 – deemen

+0

實際上看着要求,我不認爲我可以擺脫雙向參考。我需要有一個滴答信號從層次結構的頂部到兒童,但每個孩子都必須知道它的父母。 – deemen

+0

@deemen,我用一種方法更新了答案,稱爲依賴注入。希望這會給你一個更清潔的解決方案。 – Brady

0

所以有SessionPlayer和RoundPlayer類。如何使RoundPlayer成爲SessionPlayer的非靜態成員類?這樣,您可以維護2個不同的集合,其中1個用於會話,1個用於RoundPlayer的Round隱式引用SessionPlayer。

+0

這就是我在想什麼,但有兩個集合要維護讓我的代碼感發癢。也許沒有別的辦法。 – deemen