当运行 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;
}
}
最佳答案
你用 y
编写循环的方式在外循环和 x
里面的 map 需要通过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
搜索每一行因此无需遍历行中的每个单独的方 block 。这意味着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;
}
关于javascript - 嵌套循环有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15794498/