我正在努力用Java创建一个命令行游戏。有一个Game类和Room类的基本前提:到达正确的房间,游戏结束。
用户可以从每个房间移动方向:
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,所以问题在于我的Room类中的getNeighbor方法,或者可能与我如何创建房间有关。这是Room Class中的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);
我无法从我看的任何房间找到我房间的邻居。错误发生在注释行上,但我认为它实际上是我的Room Class方法,或者我正在创建HashMap的方式(我之前从未使用过)。无论如何,我想知道是否有人可以帮助指出我似乎缺少的东西,以及为什么无论我的房间在我的地图中没有任何邻居。非常感谢。
答案 0 :(得分:1)
我在片段中看不到任何明显的错误。我建议您使用调试器运行代码,检查相应对象的状态。
FWIW,如果(且仅当)以下某项内容,对HashMap<String,Room>.get(x)
的调用将返回null
:
x
或x
的地图条目为null
。如果我要猜测,那就是您没有正确初始化Room
引用的currentLocation
实例。例如,如果currentLocation
提到了厨房,那么您可能想要"south"
或foyer
null
{。}}。
另一种可能性是direction
String的拼写或大小写错误,因此不符合您配置的其中一个方向。
(并且就此而言,如果您声明enum
来表示已识别的路线,并且将其用作地图的关键类型......以及整个程序的其余部分,您的程序将更加强大。)
答案 1 :(得分: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);
在您插入时foyer
为null
时无效。)答案 2 :(得分:1)
这并不能直接解决您的问题(就像其他人一样,除了区分大小写之外,我没有看到任何跳出来的内容等),但我建议您使用枚举作为密钥,而不是一个字符串。字符串很适合描述文本,但它们往往不能替代其他东西(如方向)。
在这种情况下,枚举比String更有优势: