RobStoneは正しい軌道に乗っていますが、これはまさにダンジョンホー!を書いたときにやったことなので、詳しく説明したかったのです。
各カードには一連の効果が添付されている必要があります。効果のセットは、効果が何であるか、何をターゲットにするか、どのように、どれくらいの期間を示すことができるように定義されます。たとえば、「敵にダメージを与える」効果は次のようになります。
Effect type: deal damage (enumeration, string, what-have-you)
Effect amount: 20
Source: my weapon
Target: opponent
Effect Cost: 20
Cost Type: Mana
次に、エフェクトが発生したら、汎用ルーチンにエフェクトの処理を処理させます。ばかみたいに、私は巨大なcase / switchステートメントを使用しました。
switch (effect_type)
{
case DAMAGE:
break;
}
しかし、はるかに優れた、よりモジュール化された方法は、ポリモーフィズムを使用することです。このデータをすべてラップするEffectクラスを作成し、エフェクトのタイプごとにサブクラスを作成してから、そのクラスにクラス固有のonExecute()メソッドをオーバーライドさせます。
class Effect
{
Object source;
int amount;
public void onExecute(Object target)
{
// Do nothing
}
}
class DamageEffect extends Effect
{
public void onExecute(Object target)
{
target.health -= amount;
}
}
したがって、基本的なEffectクラスがあり、次にonExecute()メソッドを持つDamageEffectクラスがあります。そのため、処理コードでは先に進みます。
Effect effect = card.getActiveEffect();
effect.onExecute();
何が関係しているかを知る方法は、Vector / Array / linked list / etcを作成することです。任意のオブジェクト(プレイフィールド/「ゲーム」を含む)にアタッチされたアクティブエフェクト(タイプEffect、ベースクラス)オブジェクトを実行し、実行させます。効果がオブジェクトにアタッチされていない場合、効果はありません。
Effect effect;
for (int o = 0; o < objects.length; o++)
{
for (int e = 0; e < objects[o].effects.length; e++)
{
effect = objects[o].effects[e];
effect.onExecute();
}
}