2013-11-27 23 views
1

我正在爲我的研究工作RPG遊戲,我們需要使用設計模式,並且我正在嘗試編寫動態角色技能。例如,我會有一些物品在裝備後增加角色以前沒有的新技能(痊癒......)。爲此,我想使用裝飾器模式,但是對於這個模式,我們不能將方法或屬性添加到類中,只需修改那些已存在的對象,對不對?Java RPG動態技能和設計模式

那麼有沒有一種動態的方式來做到這一點?

回答

1

有很多模式;你的老師是否要求一個特定的模式或一組模式?另外,模式是有時候有意義的事情。只有在他們幫助解決問題時才使用它們,而不是因爲它們很酷。

在這種情況下,裝飾者可以使用。在編寫時,他們不應該添加外部方法或屬性。所以你甚至需要getHealingPower(),getArmorValue()等甚至裸體字符;並且每個包裝修飾器都會修改它所關心的事情的返回值:HealingBookDecorator將返回wrappedObject.getHealingPower() + 15。然而,我覺得他們對於這個場景來說相當難看,因爲角色無法將治癒書放在地板上,或者拿起更好的書。裝飾對象通常不知道他們的裝飾者。另外,如果你的角色被命名爲bob,那麼使用StripedShirtDecorator(RedScarfDecorator(PolkaDotTrousersDecorator(bob)))來裝扮他會很奇怪。

如果讓我來實現這一點,每個Item將有一個String description,幷包含一個Map<Stat, Integer> modifiers(其中Stat是有效的統計數據,如癒合,護甲值,最大HP,等等的enum)。一個Character將有一個ArrayList<Item> inventory,一個Map<Stat, Integer> baseStats他或她的基礎屬性,而另一個Map<Stat, Integer> currentStats其中將包括合併baseStats的結果,在人物的清單上每一Itemmodifiers,而這將需要更新每個角色拉平時間或在他的庫存中添加或刪除某些東西。

要檢查Stat.MusicProficiencyCharacter中的等級lisaSimpson,您將編寫lisaSimpson.getStat(Stat.MusicProficiency);。這具有添加新類型的項目(它們將是對象實例,而不是類)的非常容易的優點,並且庫存管理將大大簡化。

+0

但是,你可以在繪製角色時使用裝飾器 - 一個可以繪製衣服,另一個可以增加護甲,另一個可以在頂部繪製HP條。這樣會很好,因爲角色從不需要知道他是如何被繪製的...... – tucuxi

+0

哇,這是令人鼓舞的。我對遊戲開發非常陌生(剛開始幾個星期前),而這正是*我這樣做的方式 - 除了我使用std :: unordered_map 而不是枚舉。真棒! – AmagicalFishy

+0

@AmagicalFishy趨同進化:-)。但是,我建議不要使用簡單的字符串,因爲拼寫錯誤會導致很多悲傷(「Armor」與「Armor」),並且使用枚舉可以獲得編譯時警告並自動完成。 – tucuxi