2015-07-23 4 views
-1

Теперь это странно, я в основном вызываю функцию «sortTiles()» дважды, в первый раз, она проходит через и возвращает красивый массив, так же, как это предполагается делать. Но второй раз, когда я его вызываю, он не работает и выдает ошибку, указанную в заголовке, в определенную строку: плитки [y] [x] = tile;.Uncaught TypeError: Невозможно установить свойство '1' undefined

В первый раз возвращенный массив из «sortTiles()» помещается в глобальный массив, называемый «решением». Во второй раз, когда функция вызывается, она получит координаты X и Y фрагментов из массива решений.

Что я здесь делаю, это в основном сканирование раздвижной головоломки с помощью холста html5 и prnt_scrn + вставить на сайт. И как сказано, в первый раз, когда вы это делаете, вы делаете снимок экрана с решением, вставляете его и отлично отмечаете все координаты. Второй раз, он выдает ошибку :(

function getTile(x, y) { 
    var id = 0; 
    for (i = 0; i < 2; i++) { 
     for (i2 = 0; i2 < 2; i2++) { 
      var data = context.getImageData(x + i * 48 + 5 - (i * 10), y + i2 * 48 + 5 - (i2 * 10), 1, 1).data; 
      id += data[0] + data[1] + data[2]; 
     } 
    } 
    return id; 
} 

function findTile(number) { 
    for (y = 0; y < 5; y++) { 
     for (x = 0; x < 5; x++) { 
      if (solution[y][x] == number) { 
       return [x, y]; 
      } 
     } 
    } 
} 

function sortTiles() { 
    context.font = "20px Georgia"; 
    var tiles = []; 
    tiles.length = 0; 
    for (y = 0; y < 5; y++) { 
     tiles[y] = []; 
     for (x = 0; x < 5; x++) { 
      var tile = getTile(108 + x * 56, 34 + y * 56); 
      tiles[y][x] = tile; 
      if (solution.length != 0) { 
       var coordinate = findTile(tile); 
       context.fillText(coordinate[0] + ", " + coordinate[1], 108 + x * 56 + 12, 34 + y * 56 + 36); 
      } else { 
       context.fillText(x + ", " + y, 108 + x * 56 + 12, 34 + y * 56 + 36); 
      } 
     } 
    } 
    return tiles; 
} 
+0

'tiles' должен быть вытолкнут в, а не только назначенный. –

ответ

2

Ваших x и y переменных являются глобальными и противоречивыми между sortTiles и findTile. Заставьте их местное применение var.

function getTile(x, y) { 
    var id = 0; 
    for (var i = 0; i < 2; i++) { 
     for (i2 = 0; i2 < 2; i2++) { 
      var data = context.getImageData(x + i * 48 + 5 - (i * 10), y + i2 * 48 + 5 - (i2 * 10), 1, 1).data; 
      id += data[0] + data[1] + data[2]; 
     } 
    } 
    return id; 
} 

function findTile(number) { 
    for (var y = 0; y < 5; y++) { 
     for (var x = 0; x < 5; x++) { 
      if (solution[y][x] == number) { 
       return [x, y]; 
      } 
     } 
    } 
} 

function sortTiles() { 
    context.font = "20px Georgia"; 
    var tiles = []; 
    tiles.length = 0; 
    for (var y = 0; y < 5; y++) { 
     tiles[y] = []; 
     for (var x = 0; x < 5; x++) { 
      var tile = getTile(108 + x * 56, 34 + y * 56); 
      tiles[y][x] = tile; 
      if (solution.length != 0) { 
       var coordinate = findTile(tile); 
       context.fillText(coordinate[0] + ", " + coordinate[1], 108 + x * 56 + 12, 34 + y * 56 + 36); 
      } else { 
       context.fillText(x + ", " + y, 108 + x * 56 + 12, 34 + y * 56 + 36); 
      } 
     } 
    } 
    return tiles; 
} 
+0

Спасибо за быстрый ответ! – user1768788

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