5

私はゲームをプログラミングしている大学のプロジェクトに取り組んでいます。このゲームでは、いくつかの効果が発生する可能性があり、1 つの効果が別の効果の動作に影響を与える可能性があります。アイデアの 1 つは、最初は固い解決策のように見えた複合パターンを使用することでした。ここでの最大の問題は、エフェクトの動作がどのエフェクトと組み合わされているかによって異なり、これを修正する唯一の方法が .getClass() または instanceof を使用することであり、これは絶対に避けたいことです。

この問題を設計するにはどのような方法がありますか?

編集(小さな例):明示的なコード例はありませんが、次の例で少し明確にしようとします:

そのため、ゲームには手榴弾 (明らかに爆発してダメージを与える可能性があります) があり、この爆発は "ExplosionEffect" と見なされます。手榴弾が置かれているマスには、実行時に電源障害が発生する可能性があります (PowerfailureEffect)。ExplosionEffect と PowerfailureEffect を組み合わせると、爆発がより強力になり、より多くのダメージを与えることができます。ExplosionEffect は、爆発によるダメージの動作をさらに異なるものにする他のエフェクトと組み合わせることもできます。

4

4 に答える 4

2

ビジター デザイン パターンを使用できます。すべてのエフェクト クラスは Effect インターフェイスを実装します。メイン クラスは、Effect インターフェイス メソッドを使用して EffectB クラスに、どのように動作するかを尋ねます。EffectB クラスでの Effect のメソッドの実装は、メイン クラスで適切なメソッドを呼び出します。

于 2013-04-24T09:58:45.753 に答える
1

別のインターフェイスはどうですか。たぶんModifier、エフェクトが実装するさまざまなインターフェースがあります。これらの修飾子は、「爆発力の増加」などを行うことができます。instanceofクラスが修飾子を実装しているかどうかを確認してから、1 つの効果で別の効果を変更できます。

注:instanceofインターフェイスで を実行することはまったく問題ありません。それが何であるかに基づいて何かを実行できるかどうかはわかりませんが、それが持っている API に基づいています。

于 2013-04-24T10:14:23.223 に答える
0
public void test(){
    methodForWaterEffect(new WaterEffect());
    combinationAttack1(new FireEffect(), new WaterEffect());
}

interface Effect{
    public void activateEffect();
}

class FireEffect implements Effect{

    @Override
    public void activateEffect() {
        System.out.println("Fire!");
    }

}

class WaterEffect implements Effect{

    @Override
    public void activateEffect() {
        System.out.println("Water!");
    }

}
public void combinationAttack1(FireEffect fe, WaterEffect we){
    //your algorithm here

}

public void methodForWaterEffect(WaterEffect fe){
    fe.activateEffect();
}

とてもシンプルな提案があります。Effect と呼ばれるインターフェイスを実装する各エフェクトのクラスを作成してみませんか。さらに、組み合わせ攻撃をシミュレートしようとしている場合は、それらの組み合わせ攻撃ごとに関数を作成してみませんか?

したがって、あなたの例では、次のようになります

public void combination2(PoisonEffect pe, PowerFailureEffect pf){

}

これは大変な作業のように思えるかもしれませんが、これによりコードが非常にうまく分離され、後でコードを管理しやすくなると思います。

簡単にするために、これらは別個のクラス ファイル =D に含まれていないことに注意してください。

于 2013-04-24T10:31:55.190 に答える
-1

一般的なアンチパターンはinstanceof、ポリモーフィズムの代わりに、型チェックを使用することです。簡単な例を次に示します。

public class Shape {
    public void draw() {
        if (this instanceof Square) {
            // Draw a square
        } else if (this instanceof Circle) {
            // Draw a circle
        }
    }
}

public class Square extends Shape {
    // ...
}

public class Circle extends Shape {
    // ...
}

draw()class のメソッドでShapeは、現在のオブジェクトの型を見て何を描画するかを決定し、適切なコードを実行することに注意してください。これにはいくつかの欠点があります。クラスShapeはそのすべてのサブクラスを認識する必要があり、新しいシェイプを追加する場合はクラスShapeも変更する必要があります。draw()サブクラスでメソッドをオーバーライドして、ポリモーフィズムを使用する方がはるかに優れています。

public abstract class Shape {
    public abstract void draw();
}

public class Square extends Shape {
    public void draw() {
        // Draw a square
    }
}

public class Circle extends Shape {
    public void draw() {
        // Draw a circle
    }
}

このように、クラスShapeはそのサブクラスのすべてを知る必要はなくShape、新しい形状を追加するために変更する必要はなく、特定の形状に属するすべてのロジックは、それが属する場所 (その形状のクラス) にあります。 .

于 2013-04-24T09:59:38.853 に答える