1

ちょっと遊んでみると、コマンドラインで2人でターン制のバトルゲームを作ろうとしています。各プレイヤーは最大4つの異なる動きでモンスターをコントロールします。さまざまなモンスターと動きを定義するために、MonsterクラスとMoveクラスを定義しました。プレイヤーがムーブを使用する場合、使用するムーブでperformOn(Monster mon)メソッドのようなものを呼び出したいと思っています。その方法では、すべての移動が同じことを行うわけではないため、移動が行うことの実装を定義したいと思います。Javaがこれを実行できることはかなり確信していますが、それがどのように実行されるかは完全にはわかりません。MonsterクラスとMoveクラスの両方に、大きなコンストラクターメソッドを回避するための内部Builderクラスがあります。そして、誰かが移動を実行する方法についてより良いアイデアを持っているなら、遠慮なく共有してください。:)

ありがとう!

例:

// moves is a HashMap<String, Move>
monster1.moves.get("Firebreath").performOn(monster2); // damages monster2
monster2.moves.get("Heal").performOn(monster2); // heals monster2
4

3 に答える 3

2

あなたはスーパークラスを作ることができMove、すべての特別な動きはそれを拡張することができます:

public abstract class Move
{
    public abstract void performOn(Monster m);
}

そして拡張します:

public class FirebreathMove extends Move
{
    public void performOn(Monster m)
    {
         // do something to Monster
    }
}

または、インターフェースを作成することもできます。

public interface Move
{
    public void performOn(Monster m);
}

そしてあなたの動きはそれを実装することができます:

public class FirebreathMove implements Move
{
    public void performOn(Monster m)
    {
         // do something to Monster
    }
}

どちらの場合も、Move呼び出すことができるへの参照がありますがperformOn(Monster)、すべての移動がサブクラス化する何らかの共通機能を共有するかどうか(最初のメソッド、スーパークラスを使用)、または移動が他のものになる可能性があるかどうかによって異なります。performOn(Monster)メソッドのシグネチャが必要です。たとえば、武器のようなものがある場合、それは移動します:

public class FancyWeapon extends Weapon implements Move
{

}
于 2012-08-09T03:16:45.437 に答える
1

これがあなたの言っていることかどうかはわかりませんが、interfaceあなたが求めているものである可能性はありますか?

インターフェイスは次のようになります。 public interface Move() { void performOn(Object o); String getMoveName(); }

その例では、一連のクラスを作成します public class BreatheFire implements Move { @Overrides public void performOn(Object o) { .... } }

お役に立てば幸いです。

于 2012-08-09T03:15:01.650 に答える
1

Move親クラス(またはインターフェイス)を持つことができるので、これと同じように機能します。

public interface Move{
  public void performOn(Monster m);
}

public Firebreath implements Move{
  public void performOn(Monster m)
  {
    m.takeFireDamage(5);
  }
}

public Heal implements Move{
  public void performOn(Monster m)
  {
    m.healDamage(5);
  }
}
于 2012-08-09T03:15:14.937 に答える