2

运行 moveRight() 函数时,我收到一个错误,它无法识别 map[x][y],说这是未定义的。这只发生在“播放器”在最后一个 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;
    }
}
4

2 回答 2

2

y在外部循环和x内部循环中编写循环的方式,需要先访问地图y,然后访问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变量。

for (var y = 0; y < map.length; y++) {
    var x = map[y].indexOf("Player");

    if (x <= -1) {
        continue;
    }

    if (x < map[y].length - 1) {
        console.log("x: " + x);
        console.log("y: " + y);

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

    break;
}
于 2013-04-03T17:56:41.720 回答
1

循环被构造为具有y第一个索引和x第二个索引。在以下 2 行中,尽管您以错误的顺序使用它们

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

它应该是

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

此外,该y + 1指数是可疑的。在循环的最后一次迭代中,它将超出数组的范围。您的意思是将循环条件更改为y + 1 < map.length

于 2013-04-03T17:56:41.397 回答