2010-11-25 21 views
14

私は学校の進歩のためのテキストベースのアドベンチャーゲームを設計しています。私はそれぞれの "レベル"をクラスとして設定し、それぞれの探索可能なエリア(ノード)を適切なクラス内のメソッドとして設定します。Java - メソッドの配列を作成

私が悩んでいるのは、あるノードから別のノードに移動するコードです。各ノードは最大4つの他のノードに接続されているため、各メソッドで非常に似たコードブロックを繰り返す必要があります。

私は何を好むだろうが、このように、各ノードの最初にメソッドのアレイを含んでいる:

public static void zero() 
{ 
    ... adjacentNodes[] = {one(), two(), three(), four()}; 
} 

そして、一般的な方法に、その配列を送信し、それがプレイヤーを送ってい

public static void move(...[] adjacentNodes, int index) 
{ 
    adjacentNodes[index]; 
} 

私はコードを簡略化しましたが、それは一般的な考えです。これは可能ですか?

+4

あなたのデザインを再考することをお勧めします。実際のニーズなしにリフレクションを使用することは、良い習慣ではありません。 – khachik

+0

'one()'、 'two()'などのメソッドシグネチャは何ですか? – missingfaktor

答えて

41

ポインターツーファンクションを考えるときはいつでも、アダプターパターン(またはバリエーション)を使用してJavaに変換します。

public class Node { 
    ... 
    public void goNorth() { ... } 
    public void goSouth() { ... } 
    public void goEast() { ... } 
    public void goWest() { ... } 

    interface MoveAction { 
     void move(); 
    } 

    private MoveAction[] moveActions = new MoveAction[] { 
     new MoveAction() { public void move() { goNorth(); } }, 
     new MoveAction() { public void move() { goSouth(); } }, 
     new MoveAction() { public void move() { goEast(); } }, 
     new MoveAction() { public void move() { goWest(); } }, 
    }; 

    public void move(int index) { 
     moveActions[index].move(); 
    } 
} 
+0

さて、私はこれを試してみるつもりです。提案していただきありがとうございます! –

+0

それは完璧に働いた。手伝ってくれてどうもありがとう! –

+0

この例は、 'Node'インスタンスごとに4つの' MoveActions'を作成することに注意してください。この実装をもう一度考え直すことで、すべてのインスタンスに対して 'MoveAction'オブジェクトを共有可能にすることができます。この場合、 'move()'を 'move(Node)'に変更し、 'MoveAction'を静的クラスとして実装し、' move() 'の呼び出しで' this'を渡します。 – gpeche

6

あなたのノードをすべて同じインターフェイスに準拠したオブジェクトにするだけで、そのメソッドを確実に呼び出すことができます。

0

解決策を考えずに考えてみてください。たとえば、enumsとすることができます。

2

デザインには基本的な欠陥があります。通常のオブジェクト指向設計では、各 "レベル"はオブジェクト(クラス 'レベル'またはそれに類するもの)になります。それぞれの「探検可能な領域」は、レベルオブジェクト内に含まれるオブジェクトでもあります。おそらく、クラスExplorableAreaです。 'explorable areas'は異なる種類にすることができます。その場合、ExplorableAreaの異なるサブクラスにすることができます。

+0

あなたは正しいです。私が思いつくことができる最高の構造ではありません。私は再設計の途中ですが、最初にこの問題を解決したいと思っていました –

4

Javaはファーストクラスのエンティティとしてメソッドの概念を持たないため、これは苦痛でエラーを起こしやすいリフレクションを使用してのみ可能です。

最良の近似は、おそらく方法のインスタンスごとの実装と列挙型としてのレベルを持っているだろう:

public enum Level1 implements Explorable{ 
    ROOM1 { 
     public void explore() { 
      // fight monster 
     } 
    }, ROOM2 { 
     public void explore() { 
      // solve riddle 
     } 
    }, ROOM3 { 
     public void explore() { 
      // rescue maiden 
     } 
    }; 

} 

public interface Explorable{ 
    public abstract void explore();  
} 

public static void move(Explorable[] adjacentNodes, int index) 
{ 
    adjacentNodes[index].explore(); 
} 

しかし、これは、列挙型の概念の乱用のビットです。私は重大なプロジェクトには使用しません。

+0

まだ、私はそれを試してみましょう。ヒントをありがとう! –

+0

それは働いた;おかげさまで –

関連する問題