1

我相信我的对象文字和数组循环存在问题。我正在尝试在我之前使用过数组的“地图”中使用对象文字。我想使用对象文字的原因是因为我想要一个变量来显示它所在位置的名称。到目前为止,我总是遇到 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;
    }
}
4

2 回答 2

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];

这段代码仍然缺少一些检查来确保你总是有空间进入,但我相信你可以自己弄清楚:)

于 2013-05-02T07:35:31.297 回答
2

当到达那行代码时,看起来rightLoc将是未定义的。

变量rightLoc被设置为map[name + 1]

因为map的属性是字符串,name + 1所以会是一个以 . 结尾的字符串1

因此,map[name + 1]是未定义的,不能被取消引用。

关键是您的 for 循环正在遍历对象的属性。

对于循环的每次迭代,名称将是一个字符串。

这是一个演示问题的小提琴

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 文档,您会看到for in 循环以任意顺序迭代对象属性,这意味着该技术将不起作用。


两个重要的工具可以帮助您更快地发现此类错误:

  • 阅读文档(谷歌“ javascript mdn for in loop ”)
  • 学习使用调试器(使用 Firebug 检查变量非常容易
于 2013-05-02T07:03:42.840 回答