2013-04-03 22 views
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; 
    } 
} 
+0

当你想声明一个变量(比如'y'或'x')时,你应该在它前面放一个'var'。你的'y'和'x'正在泄漏到全球范围内。 – thejh

回答

2

你在外环yx在内部一个写你的循环方式,地图需要通过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; 
} 
+0

谢谢,这是有帮助的。但是我不明白的一点是x变量在你创建的最后一个版本中仍然有效。当var x = map [x] [y],如果没有var x循环,map [x]如何知道是什么值? –

+0

@AlphaCentauriAB哎呀,这是一个错字。修复该行。 –

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