我相信我的循环对象文字和数组存在问题。 我正在尝试使用对象文字作为之前使用过数组的'map'。我想使用对象文字的原因是因为我想要一个变量来显示它所在位置的名称。截至目前,我总是遇到loc [2] [1] = player;。
var room0 = [
[blank, blank, blank, blank],
[blank, blank, blank, blank],
[blank, player, blank, doorRight],
[blank, blank, blank, blank]
];
var room1 = [
[blank, blank, blank, blank],
[blank, blank, blank, blank],
[blank, blank, blank, blank],
[blank, blank, blank, blank]
];
var loc = room0;
var map = {
"living room": room0,
"Bedroom": room1,
"Outside": room2
};
function moveRight() {
for (var y = 0; y < loc.length; y++) {
var posX = loc[y].indexOf(player);
if (posX <= -1) continue;
// if going to the next room to the right
if (loc[y][posX+1] == doorRight) {
for (var name in map) {
if (loc == map[name]) {
var rightLoc = map[name+1];
}
}
loc[y][posX] = blank;
loc = rightLoc;
loc[2][1] = player;
break;
}
if (loc[y][posX+1] != blank) break;
if (posX < loc[y].length - 1) {
loc[y][posX] = blank;
loc[y][posX + 1] = player;
}
break;
}
}
答案 0 :(得分:3)
您只需要在地图中保留不同的内容,因为map[name+1]
并没有神奇地指向由name
标识的下一个房间。
var map = {
"living room": 0,
"Bedroom": 1,
"Outside": 2
};
var rooms = [room0, room1, room2];
现在,map['living room']
会将索引保存在rooms
中,因此您仍然可以使用数字加法“移动”到下一个房间。您的代码将变为:
var rightLoc;
for (var name in map) {
if (loc == map[name]) {
rightLoc = map[name] + 1;
}
}
loc = rooms[rightLoc];
此代码仍缺少一些检查以确保您始终有进入的空间,但我相信您可以自己解决这个问题:)
答案 1 :(得分:2)
在达到该行代码时, rightLoc 似乎未定义。
变量 rightLoc 设置为map[name + 1]
由于 map 的属性是字符串,name + 1
将是以1
结尾的字符串。
因此, map [name + 1] 未定义且无法取消引用。
关键是你的for循环正在迭代你对象的属性。
对于循环的每次迭代,name都是一个字符串。
这是展示问题的fiddle:
var map = {
"living room": 'room0',
"Bedroom": 'room1',
"Outside": 'room2'
};
for (var name in map) {
if (name === 'Bedroom') {
var badKey = name + 1;
var theType = typeof map[badKey];
alert('key: ' + badKey + ' type: ' + theType);
}
}
输出:
key: Bedroom1 type: undefined
如果您阅读MDN documentation,您会看到 for in循环以任意顺序迭代对象属性,这意味着此技术不会工作
两个重要的工具可以帮助您更快地找到这样的错误: