2011-12-04 13 views
0

私はJavaでコマンドラインゲームを作成しています。 GameクラスとRoomクラスがあるという基本的な前提:正しい部屋に着き、ゲームが終了します。ユーザーが方向を移動させることができ、各部屋からnullを返すHashMap

public void move (String direction) { 
    Room nextRoom = currentLocation.getNeighbor(direction); //this is the problem, always nil 
    if (nextRoom == null){ 
     msg = "You can't go in that direction"; 
     }else{ 
     currentLocation = nextRoom; 
     msg = currentLocation.getLongDescription(); 
    } 
    } 

問題は、この.getNeighborメソッドはnilを返すされているので、問題はどのように私と私のルームクラス内または多分私のgetNeighbor方法でありますお部屋をつくっています。これは私の文字列を受け取り、と私はその方向キーで部屋が自分であるかどうかを確認するために作成したHashMapのマップを見

public Room getNeighbor(String rDirection){ 
     Room next = map.get(rDirection); 
     return next; 
    } 

:ここではルームクラス内で私のgetNeighborの方法があります。私は私のゲームを初期化するとき、私は呼んで自分の部屋クラスの作成マップ・メソッドを持っている

private HashMap<String , Room> map = new HashMap<String , Room>(); 

:私のルームクラスで

:私は、問題は、私は私の部屋の方向HashMapを作成していますどのように怖いです。ここで方向性を追加するための方法だと、私は私のゲームのクラスで呼んでいるものを:

// Room Class Method 

    public void addNeighbor(String rDirection, Room r){ 
     map.put(rDirection, r); 
    } 

// Game Class - Initializing the Rooms 

kitchen.addNeighbor("east", foyer); 
kitchen.addNeighbor("north", library); 

は、私が見てどの部屋から部屋への隣人を見つけることができません。エラーはコメント行で発生しますが、実際には私のルームクラスのメソッド、またはHashMapを作成している方法と思っています。とにかく、誰かが私が見逃しているように見えることを指摘できるかどうか、私の部屋には私の地図にどんな隣人がいなくても何故問題になるのか不思議に思っていました。ありがとう、トン。

+0

すぐに役立つように:1)[SSCCE](http://sscce.org/)を投稿してください。 2)質問をする。 –

答えて

1

スニペットで明らかに間違ったことはありません。デバッガを使ってコードを実行し、それぞれのオブジェクトの状態を調べることをお勧めします。

(および場合のみ)場合FWIW、HashMap<String,Room>.get(x)への呼び出しは、次のいずれかをnullを返します。

  • xのためのマップエントリがない、またはxため
  • マップエントリがnullです。

私は推測を作ることだった場合、それはあなたが適切currentLocationが参照するRoomインスタンスを初期化していないということでしょう。たとえばcurrentLocationがキッチンを指している場合は、"south"、またはfoyerのいずれかがnullになる可能性があります。

もう1つの可能性は、文字列に間違ったスペルや大文字が含まれているため、設定した方向の1つに一致しない可能性があります。

(認識されたルートを表すようにenumを宣言し、それを地図のキータイプとして使用すると、プログラムの残りの部分でより堅牢になります)

+0

この問題は、その部屋の値を生成する前に、現在の場所を部屋に開始していたスコープ/オーダーの問題でした。私は本当にすべての助けに感謝します。 – Kombo

1

これは実際には「回答」よりも「コメント」のほうが多いですが、コメントには収まらないので、ここに入ります。 。 。

あなたの質問に含まれているコードに間違いはありません。問題は多分他の場所にあります。何directionで正確あなたを教え、そして正確direction缶ます

if(nextRoom == null) 
{ 
    System.out.println("Illegal direction '" + direction + "' requested from" + 
         " room '" + currentLocation.getDescription() + "'."); 
    System.out.println("(map is: " + map + ")"); 
    msg = "You can't go in that direction"; 
} 

:このような何かに

if (nextRoom == null){ 
    msg = "You can't go in that direction"; 
    } 

:あなたがデバッグするのに役立ちます一つは、あなたがこれを変更した場合でありますさあ。外を見るためにいくつかの点:

  • 場合、感度、directionは、(例えば)"East"いうより"east"ある場合。
  • 空白の場合、directionは、"east"ではなく、"east "となります。
  • マップエントリは存在しますが、値はnullです。 (あなたが挿入を行うときfoyernullある場合kitchen.addNeighbor("east", foyer);は何も助けにはなりません。)
1

これは、直接(他の人のように、私は大文字と小文字の区別以外の飛び出し何も表示されませんでしたし、あなたの質問には対応していません。そのような)しかし、私は列としてではなく、あなたのキーとしてenumを使用することをお勧めします。文字列はテキストを説明するのには適していますが、他のもの(方向など)の代わりに不完全な傾向があります。

列挙型は、この場合には文字列の上にいくつかの利点を持っているでしょう:

  • これは、コードの自己文書化します。メソッドがどのような値を期待しているかを簡単に確認できます
    • たとえば、「NORTH」、「北」、「北」または「上」のいずれかを覚えておく必要はありません。それはちょうどDirection.NORTHだし、あなたが取得しない場合、それはコンパイルされませんそれ右
    • これはあなたの代わりにHashMapのEnumMapとして、あなたの地図を作成することができます発信者だけでなく、実装
  • のために有用です、 (これはあなたのアプリケーションでは問題ではないかもしれませんが)より効率的です。