2013-05-02 101 views
1

我相信我對循環對象文字和數組有問題。 我想使用一個對象字面值''地圖'我之前使用過一個數組。我想使用對象文字的原因是因爲我想要一個變量來顯示它所在位置的名稱。現在我總是遇到loc [2] [1] = player;的問題。遍歷對象文字和數組

var room0 = [ 
     [blank, blank, blank, blank], 
     [blank, blank, blank, blank], 
     [blank, player, blank, doorRight], 
     [blank, blank, blank, blank] 
]; 
var room1 = [ 
     [blank, blank, blank, blank], 
     [blank, blank, blank, blank], 
     [blank, blank, blank, blank], 
     [blank, blank, blank, blank] 
]; 

var loc = room0; 

var map = { 
    "living room": room0, 
    "Bedroom": room1, 
    "Outside": room2 
}; 

function moveRight() { 
    for (var y = 0; y < loc.length; y++) { 
     var posX = loc[y].indexOf(player); 
     if (posX <= -1) continue; 

     // if going to the next room to the right 
     if (loc[y][posX+1] == doorRight) { 

      for (var name in map) { 
       if (loc == map[name]) { 
        var rightLoc = map[name+1]; 
       } 
      } 


      loc[y][posX] = blank; 
      loc = rightLoc; 
      loc[2][1] = player; 
      break; 
     } 

     if (loc[y][posX+1] != blank) break; 
     if (posX < loc[y].length - 1) { 
      loc[y][posX] = blank; 
      loc[y][posX + 1] = player; 
     } 
     break; 
    } 
} 
+0

哪裏是房間2定義? – Piyuesh 2013-05-02 05:55:29

+0

這與實際問題無關,但是:這已經是我建議使用類的那種複雜性。這也會使得房間的命名更容易。 – 2013-05-02 05:55:36

+0

@IngoBürk:這有什麼用?那麼所有這些變量將是對象屬性,並...? – Bergi 2013-05-02 06:00:10

回答

2

看起來rightLoc達到該行代碼時是不確定的。

可變rightLoc得到由於地圖屬性是字符串設定爲map[name + 1]

值,name + 1將是與1結束的字符串。

因此,map [name + 1]未定義,無法解除引用。

關鍵是您的for循環遍歷對象的屬性。

對於循環的每次迭代,名稱都將是一個字符串。

這裏有一個fiddle演示該問題:

var map = { 
    "living room": 'room0', 
     "Bedroom": 'room1', 
     "Outside": 'room2' 
}; 

for (var name in map) { 
    if (name === 'Bedroom') { 
     var badKey = name + 1; 
     var theType = typeof map[badKey]; 
     alert('key: ' + badKey + ' type: ' + theType); 
    } 
} 

輸出:

key: Bedroom1 type: undefined 

如果你讀了MDN documentation,你會看到在循環迭代對象屬性任意順序,這意味着這種技術將不行。它可以幫助你找到象這樣的錯誤更快


兩個重要的工具:

  • 閱讀文檔(谷歌「JavaScript的MDN在循環」)
  • 學會使用調試器(檢查變量是SUPER容易與螢火蟲)
3

你只需要因爲map[name+1]不會神奇地指向由name標識的下一個房間。

var map = { 
    "living room": 0, 
    "Bedroom": 1, 
    "Outside": 2 
}; 

var rooms = [room0, room1, room2]; 

現在,map['living room']將持有該指數rooms,所以你仍然可以使用數字除了「移動」到隔壁房間。然後,您的代碼將變爲:

var rightLoc; 

for (var name in map) { 
    if (loc == map[name]) { 
     rightLoc = map[name] + 1; 
    } 
} 

loc = rooms[rightLoc]; 

此代碼還缺少一些檢查,以確保你總是有一個房間進入,但我相信你能明白這一點自己:)