私は学校の進歩のためにテキストベースのアドベンチャーゲームをデザインしています。各「レベル」をクラスとして設定し、各探索可能領域(ノード)を適切なクラス内のメソッドとして設定します。
私をいじっているのは、あるノードから別のノードに移動するためのコードです。各ノードは最大4つの他のノードに接続されているため、各メソッドで非常に類似したコードブロックを繰り返す必要があります。
私がやりたいのは、次のように、各ノードの先頭にメソッドの配列を含めることです。
public static void zero()
{
... adjacentNodes[] = {one(), two(), three(), four()};
}
次に、その配列をジェネリックメソッドに送信し、プレーヤーを適切なノードに送信させます。
public static void move(...[] adjacentNodes, int index)
{
adjacentNodes[index];
}
コードを簡略化しましたが、それが一般的な考え方です。これは可能ですか?
関数へのポインタについて考えるときはいつでも、アダプタパターン(またはバリエーション)を使用して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();
}
}
ノードをすべて同じインターフェースに準拠するオブジェクトにするだけで、それらのメソッドを確実に呼び出すことができます。
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();
}
ただし、これは列挙型の概念の乱用です。本格的なプロジェクトには使いません。
あなたのデザインには根本的な欠陥があります。通常OOデザインでは、各「レベル」が(クラス「レベル」などの)オブジェクトになります。各「探索可能領域」もオブジェクトになり、レベルオブジェクト内に含まれます- ExplorableAreaクラスの可能性があります。「explorableareas」はさまざまな種類にすることができます。その場合、ExplorableAreaのさまざまなサブクラスにします。
反省せずに解決策を考えてみてください。たとえば、 enums のようになります。