0

私はJavaプログラミングクラス用のテキストアドベンチャーゲームを書いています。abstract各部屋が継承して構成する親部屋クラスを使用して部屋を設定しています。

出口の場合、ルームはメソッドを呼び出して.addExit()出口オブジェクトを渡すだけです。ゲームには、すべての部屋のインスタンスを1つだけ含める必要があります。出口オブジェクトには、コンストラクターで初期化されるゲームの部屋の1つを指すターゲットフィールドが必要です。

私の問題は、出口コンストラクターに、新しい部屋オブジェクトではなく、既存の部屋参照を渡す方法がわからないことです。私の見方では、2つの方法が考えられます。

  1. 出口コンストラクターに部屋インスタンスへの参照を直接渡します。
  2. すべての部屋のインスタンスを追跡し、文字列名やクラスなどからインスタンスを返すメソッドを持つ静的クラスを用意します。
    次に、出口オブジェクトのコンストラクターに、オブジェクトが一意の文字列名など、ターゲットの部屋を識別する方法が渡されます。次に、コンストラクターは、ルームインスタンスを返す静的クラスのメソッドの1つを呼び出すために使用します。

どちらが最良のオプションであるか、どちらのオプションを実装するか、または完全にもっと良い方法があるかどうかはわかりません。

4

2 に答える 2

3

部屋ごとに別々のクラスを設けるのは良い考えではないと思います。Room各インスタンスが別々の部屋を表す単一のクラスを使用する方がおそらく良いでしょう。(MUDがこのようにコーディングされていることは知っていますが、そこにも「仮想」があります)

しかし、それとは別に、問題は次のとおりです。Exit部屋の所有物ですか、それとも個別に管理できるものであり、管理する必要があるものですか。

答えは、それらを使って正確に何をしたいかによって異なりますExit。たとえば、双方向の出口を強制する場合(つまり、部屋AからBへの出口がある場合は、BからAへの出口があるはずです)、別の出口管理クラスが適切な場合があります。ただし、部屋のすべての出口を一覧表示し、そのうちの1つを介して別の出口に移動できるようにするだけでよい場合は、のプロパティにすることができますRoom

事前にわからない場合は、単純なものから始めてください(出口は各部屋に個別に追加されます)。それが機能しない場合は、いつでもより複雑なソリューションに切り替えることができます。

于 2012-04-16T15:05:42.540 に答える
1

あなたはこれを過度に複雑にしています

これを行う方法の例を次に示します


    public abstract static class Room {
        List exits = new ArrayList();
        public void addExit(Room r) {
           exits.add(r);
        }
    }

于 2012-04-16T15:04:26.857 に答える