2013-04-03 5 views
2

При запуске функции moveRight() я получаю сообщение об ошибке, не распознавая map [x] [y], заявив, что это не определено. Это происходит только тогда, когда «Player» находится в последнем цикле 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

, как вы написали ваши петли с 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; 
} 
+0

Спасибо, это было полезно. Одна вещь, которую я не понимаю, это то, как переменная x по-прежнему работает в последней версии, которую вы сделали. Когда var x = map [x] [y], как map [x] знает, какое значение должно быть, если нет цикла var 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?

Смежные вопросы