2

抽象的なファイター クラスを持つテキスト ゲームを作成しています。ファイター内には、保護されたブール値 isGround と呼ばれる変数があります。次に、AirFighter と GroundFighter という名前の Fighter を拡張する 2 つの抽象クラスがあります。これらは基本的に isGround を、地上ユニットかどうかに応じて True または False に設定します。

次に、戦闘フェーズでプレイヤー 1 の速度がプレイヤー 2 よりも速いかどうかをゲームがチェックし、どちらが速いかに応じて p1.attack(p2) のように実行し、の統計を出力するようにゲームをセットアップします。その戦闘、各プレイヤーの残りの体力など。

一部のエアファイターが空中を攻撃する方法、または空中と地上を攻撃する方法が必要であり、一部のグラウンドファイターが地上のみ、または地上と空中を攻撃する方法が必要です。疎結合を維持しながら、これを行うにはどうすればよいですか? それはデザインパターンのクラスであり、私をイライラさせます。これを支援する設計パターンはありますか?

ゲームのスタークラフトを考えてみてください。それは基本的に私のゲームが模倣しているものです。海兵隊のような特定のユニットは地上と空中を攻撃でき、空中のみを攻撃できるユニットもあれば、両方を攻撃できるユニットもあります。厄介な if else チェックステートメントを使用せずにこれを実行できるようにしたいと考えています。

4

2 に答える 2

1

これを行う簡単な方法は、別の攻撃Fighterが可能かどうかを確認するために使用できるメソッドをベースに持つことです。Fighter

public abstract class Fighter {
    public abstract boolean isGround ();
    public abstract boolean canAttack (Fighter target);
}

その後、サブクラスはオーバーライドcanAttackして適切な決定を下すことができます。例えば:

public class SurfaceToAirLauncher extends Fighter {
    @Override public boolean isGround () {
        // missile launcher is on the ground
        return true; 
    }
    @Override public boolean canAttack (Fighter target) {
        // we can only attack air targets
        return (target != null && !target.isGround());
    }
}

public class Dragon extends Fighter {
    @Override public boolean isGround () {
        // dragons are in the air
        return false; 
    }
    @Override public boolean canAttack (Fighter target) {
        // dragons can attack every target.
        return (target != null);
    }
}

public class Knight extends Fighter {
    @Override public boolean isGround () {
        // knights are on the ground
        return true; 
    }
    @Override public boolean canAttack (Fighter target) {
        // knights can only attack dragons
        return (target != null && target instanceof Dragon);
    }
}

になることがないことがnullわかっている場合は、 のチェックを外すことができます。完全を期すために含めました。targetnull

于 2013-08-13T04:15:32.037 に答える