有嵌套循环的问题

时间:2013-04-03 17:53:28

标签: javascript nested-loops

当运行moveRight()函数时,我收到错误,因为它没有识别map [x] [y],说这是未定义的。仅当“Player”位于最后一个y循环中时才会发生这种情况。我不明白为什么会这样,有人可以帮忙解释一下吗?

var map = [
    ["Blank", "Blank", "Blank", "Blank"],
    ["Blank", "Blank", "Blank", "Blank"],
    ["Blank", "Blank", "Blank", "Blank"],
    ["Blank", "Player", "Blank", "Blank"],
    ["Blank", "Blank", "Blank", "Blank"],
    ["Blank", "Blank", "Blank", "Blank"],
    ["Blank", "Blank", "Blank", "Blank"]
];

function moveRight() {
    var breakLoop = false;
    for (y = 0; y < map.length; y++) {
        for (x = 0; x < map[y].length; x++) {

            var posX = map[x][y].indexOf("Player");
            if (posX <= -1) continue;
            if (y >= map[y].length-1) {
                breakLoop = true;
                break;
            }

            breakLoop = true;
            console.log("x: " + x);
            console.log("y: " + y);

            map[x][y] = "Blank";
            map[x][y+1] = "Player"; 
            break;
        }
        if (breakLoop) break;
    }
}

2 个答案:

答案 0 :(得分:2)

您在外部循环中使用y编写循环并在内部循环中编写x的方式,首先需要y访问地图,然后{{1 }}

x

然后var posX = map[y].indexOf("Player"); 边界检查应该检查y,这是有道理的,因为这是一个水平移动。

x

运动线应为:

if (x >= map[y].length - 1) {

此外,最好将map[y][x] = "Blank"; map[y][x+1] = "Player"; 添加到本地变量声明中,这样它们就不会泄漏到全局范围内。

var

最后,它看起来不像你需要内循环。您正在使用for (var y = 0; y < map.length; y++) { for (var x = 0; x < map[y].length; x++) { 搜索每一行,因此无需迭代行中的每个单独的正方形。这意味着indexOf可以成为posX


应用所有这些想法,这是最终的代码。注意一些仔细的重构如何让我们摆脱x变量。

breakLoop

答案 1 :(得分:1)

循环的结构使y成为第一个索引,x成为第二个索引。在以下两行中,虽然您使用的顺序错误

map[x][y] = "Blank";
map[x][y+1] = "Player"; 

应该是

map[y][x] = "Blank";
map[y + 1][x] = "Player"; 

此外,y + 1索引是可疑的。在循环的最后一次迭代中,它将在数组的边界之外。您的意思是将条件循环更改为y + 1 < map.length吗?