2011-12-04 209 views
0

我正在用Java创建一个命令行游戏。有一个游戏课堂和课堂课程的基本前提:进入正确的房间,游戏结束。HashMap返回null

从每个房间的用户可以通过移动方向:

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方法我的房类中或可能与我怎么创造房间。这里是客房类中我getNeighbor方法:

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

这需要我的字符串,并期待在我创建,看看他们是朝着这一方向键一个房间一个HashMap的地图。恐怕这个问题是我如何创建我的房间的方向的HashMap:

在我的房间类别:

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

我有一个创建地图的方法在我的房间类,我初始化我比赛的时候调用。下面是增加方向的方法,然后我在我的游戏类我打电话:

// 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

如果我是做一个猜测,这将是你没有正确初始化的Room实例currentLocation指。例如,如果currentLocation提到厨房,那么也许你试图去"south"或者foyernull

另一种可能性是direction字符串拼写或大写错误,因此与您配置的某个方向不匹配。 (并且就此而言,如果您宣布enum表示已识别的方向,并将其用作地图的关键类型以及您的程序的其余部分,则程序将更加稳健。)

+0

这个问题是一个范围/顺序的问题,我在创建该房间的值之前将当前位置启动到一个房间。我真的很感谢所有的帮助。 – Kombo

1

这实际上比“答案”更像是一个“评论”,但它不适合评论,所以在这里。 。 。

您的问题中包含的代码没有任何明显错误。问题可能在其他地方。有一两件事,这将有助于你调试是,如果你改变了这个:

if (nextRoom == null){ 
    msg = "You can't go in that 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"; 
} 

,将告诉你究竟是什么direction,并且正是什么direction能是。有些事情看出来的:

  • 区分大小写,如果direction是(比方说)"East",而不是"east"
  • 空格,如果direction是(说)"east "而不是"east"
  • 映射条目存在,但值为null。 (kitchen.addNeighbor("east", foyer);不会帮助任何东西,如果foyernull当你插入。)
1

这并不直接解决您的问题(与其他人一样,我没有看到任何跳出除了大小写和这样),但我建议使用枚举作为你的关键,而不是一个字符串。字符串对描述文本很有用,但它们往往不能替代其他的东西(如方向)。

枚举将有超过字符串一些优势在这种情况下:

  • 这使得代码自记录文件;你可以很容易地看到方法可能会出现哪些值
    • 例如,你不需要记住它是否被称为“北”,“北”,“北”或“向上”。这只是Direction.NORTH,如果你不明白这一点不会编译正确
    • 这是来电者以及实施者
  • 你可以创建你的地图作为一个EnumMap的,而不是HashMap中有用, (尽管这在您的应用中可能不是问题)