2014-12-02 3 views
0

прямо сейчас Я пытаюсь написать простую Java-программу о японском механизме игры RPG. У меня возникли проблемы с использованием расходных элементов, то есть элементов, которые изменяют определенный статус, либо от переменной HP, либо от MP в классе «character». Вот примерный код класса «Пункт» прямо сейчас:дизайн расходных материалов в игре 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, я буду использовать значение, возвращаемое из use() соответствующего подкласса Items, и добавьте значение к игроку HP. Я не думаю, что в этом есть проблема, но если есть много категорий предметов, например Элементы, которые дают другие статусные эффекты, я полагал, что это будет неэффективно. Есть ли лучший способ сделать это?

и, кстати, это классный игрок, если вам это нужно:

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

Вы могли бы дать использование метода игрока в качестве аргумента: используйте (Player p), а затем в использовании класса Potion (Player p) {p.HP + = 50} таким образом вам не понадобятся многие if-предложения. С другой стороны, функция использования теперь привязана к игроку. Если другим объектам также необходимо «использовать» зелье, я бы создал новый класс Character eg и define use (Character c). Затем игрок наследует от персонажа. Тогда метод потребления будет выглядеть так, как это потребляет (Элементы e) {e.use (this)} независимо от типа Items. Btw конвенции он должен быть Item, а не Items :) – Michael

+0

@Michael приятно. очень приятно: D спасибо – Rei

ответ

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

+1

Этот чувак украл мой ответ: P – Michael

+1

@ Майкл, извините за это) – mishadoff

Смежные вопросы