2014-12-02 55 views
0

現在我正在嘗試編寫一個關於日本RPG遊戲機制的簡單Java程序。 我在實施消耗品的使用方面遇到了麻煩,也就是說,改變特定狀態的項目,無論是來自變量HP還是MP中的「字符」類。下面是類「項目」的粗略代碼現在:RPG遊戲中的消耗品設計java

abstract class Items{ 
int stock; 

public int checkCategory(); 
public int use(); 
} 

class HPitems extends Items{ 

public int checkCategory(){ 
return 1; // this only means that category '1' heals HP, not MP 
} 

} 

class Potion extends HPitems{ 

public int use(){ 
stock--; 
return 50; //this means potion heals 50 HP 
} 

} 

,所以我相信你現在的想法,我打算讓班級MPitems擴展了返回2.類別,每當我的球員對象消耗物品一個項目,使用消耗(項目e),它將使用多個if語句來檢查類別。如果返回類別1,我將使用相應Items子類的use()返回的值,並將該值添加到播放器HP.我認爲現在沒有任何問題,但是如果有很多Items類別,例如給出另一種狀態效果的項目,我認爲它效率不高。有沒有更好的方法來做到這一點?

順便說一句,這是球員類,如果你需要它:

public class Player{ 
int HP; 
int MP; 

public void consume(Items e){ 
if(e.checkCategory() == 1){ 
    this.HP = this.HP+e.use(); 
else{ 
    this.MP = this.MP+e.use(); 
} 
} 

} // consume 

} 
+1

你可以給使用方法玩家作爲參數:使用(玩家p),然後在Potion類中使用(玩家p){p.HP + = 50}這樣你就不需要很多if-子句。另一方面,使用功能現在綁定到玩家。如果其他對象也需要「使用」藥水,我會創建一個新的類字符,例如並定義使用(字符c)。玩家會從角色繼承。然後,消費方法看起來像是消耗(項目e){e.use(this)},而與項目類型無關。順便說一句,它應該是項目,而不是項目:) – Michael 2014-12-02 14:17:19

+0

@邁克爾很好。非常好:D謝謝 – Rei 2014-12-02 14:29:38

回答

1

而不是使用e.checkCategory的,使用更自然的方式通過調度

class Player { 
    int hp; 
    int mp; 

    void use(Potion p) { 
     p.use(this); 
    } 
} 

interface Potion { 
    void use(Player p); 
} 

class HPPotion implements Potion { 
    public void use(Player p) { 
     p.hp += 50; 
    } 
} 

class MPPotion implements Potion { 
    public void use(Player p) { 
     p.mp += 50; 
    } 
} 
+0

我明白你在說什麼。這就是我要找的,謝謝:D – Rei 2014-12-02 14:30:19

+1

那傢伙偷走了我的答案:P – Michael 2014-12-02 14:51:33

+1

@Michael,對不起) – mishadoff 2014-12-02 16:37:33