2015-02-09 43 views
4

我想製作一個戰艦遊戲(參見維基百科:Battleship_(遊戲))。設計一個簡單的遊戲類層次結構

我有一個Player類,一個Grid類和一個Ship類。

每個玩家都有一個網格,每個玩家擁有一組生活在網格上的船舶。

我如何知道是否要製作播放器或網格的Ships成員集?

在遊戲開始時,玩家必須將他們的船放置在網格上。我有一個方法要求玩家在哪裏放置他們的船。我怎麼知道該放什麼方法?如果它在玩家中,但是這組船舶在網格中,那麼我將不得不從網格中獲得對船舶集合的引用。然後,我想要Grid :: PlaceShip(Ship)還是Ship :: Place(x,y)?

有沒有這方面的方法?我已經嘗試過課堂責任 - 合作者,但它並沒有給我答案讓我開始編碼。我寧願學習如何自己找到答案,而不是給予他們這個具體的例子。

+0

難道你不想念'遊戲'概念嗎?行爲幾乎不會發生在代表所有行爲發起者的實體上,比如'Player','User'等,或者所有行爲都會在這些實體上發生。也許'game.placeInitialShipsFor(player,shipLocations)'? – plalx 2015-02-09 04:33:34

+0

我有一個遊戲課程,我試圖簡化到我認爲涉及的課程。我最終可能會把所有東西都添加到遊戲類中,而我讀過這是一個錯誤。遊戲引發行爲,玩家負責放置船隻,船隻負責放置,這取決於你如何看待它,並使我困惑。 – Qgenerator 2015-02-09 12:47:05

+0

誰負責維護數據的完整性?例如。只有遊戲知道誰是玩家,是誰已經做出了初始投放。如果將高級函數放在'Game'對象上,那麼像'Grid'和'Player'這樣的類仍然會涉及到。 – plalx 2015-02-09 13:21:23

回答

2

它有點取決於周圍的代碼,但我的直覺是船應該是網格的一部分。 Grid和Ship所代表的信息之間有很多重疊,它們並不真正關注玩家:特定的網格位置,法律猜測等。如果您將Ship作爲玩家的一部分,則仍然必須直接鏈接這兩者,以便網格知道船舶何時受到撞擊。如果它不知道船舶在哪裏,那麼擁有一個網格幾乎沒有意義。

這個問題沒有真正的硬性和快速的答案:我該如何構建一個對象模型?無論對象模型如何,我都試圖想象我可能必須編寫哪些函數/方法/子例程。如果相同的概念在同一組函數中開始出現,那麼它們應該在對象模型中連在一起。

當代碼的不同部分代表相同的信息不止一次時,也很好的注意到這一點。對於每個任務或資源,儘量確保只有一部分代碼負責它。你可能需要調整你的抽象,以便負責任的代碼可以用於稍微不同的事情,所有事情都涉及同一種工作。

你的目標是簡單的代碼。如果你開始寫作,並且隨着代碼變得越來越複雜(即更難理解),那麼這就意味着你需要重新思考並重構你的模型。