2013-04-03 83 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