2015-07-29 3 views
0

я работаю над программой тральщика, и вот моя проблема:Ошибки Javascript при попытке получить доступ к элементу из массива

Так что я сделать сетку 10х10 полных объектов MineSquare, которое я определил ранее.

var grid = []; 
    for (var i=0; i<10; i++){ 
     grid.push([]); 
     for (var j=0; j<10; j++){ 
      grid[i].push(new MineSquare()) 
     } 
    } 

Затем я создаю массив «bomb_list», чтобы создать 20 уникальных мест, где будут находиться бомбы.

var bomb_list = []; 
var found; 
var rand; 
while (bomb_list.length < 20){ 
    found = false; 
    rand = Math.floor(Math.random() * 100); 
    for (var i=0; i<bomb_list.length; i++){ 
     if (bomb_list[i] === rand){found=true; break;} 
    } 
    if(!found){ 
     bomb_list.push(rand); 
    } 
} 

Затем я пытаюсь изменить значение этих MineSquare, чтобы указать, что они бомбы.

for(var x in bomb_list){ 
    grid[ x/10 ][ x % 10 ].touching = -1; 
} 

Я получаю сообщение об ошибке: «Uncaught TypeError: Не удается прочитать свойство„1“неопределенных», который я считаю, причиняется, когда я пытаюсь взять сетки [х/10].

По какой причине это происходит?

+0

Не знаю, если это * * причина, но я думаю, что 'х/10' должен быть' (х - x% 10)/10'. – GolezTrol

+0

другие ответили уже за исключением того, что вы также неправильно поняли, как работает Javascript для работы - нужно сделать что-то вроде: 'var i = bomb_list [x]' в этом цикле. Я сделал jsfiddle, где отлаживали и исправляли это тоже, с этим и Math.floor: https://jsfiddle.net/sg9dgpr0/ – antont

ответ

1

X/10 даст вам значение float, следует использовать Math.ceil или Math.floor, чтобы получить ближайшее int по вашей логике. Тогда это должно сработать.

+0

'Math.floor' является правильным. 'x/10', чтобы получить строку немного большую, потому что x также содержит ячейку в этой строке. 'Math.floor' округляется, что вам нужно в этом случае. B.t.w, это 'floor' и' ceil' в нижнем регистре. – GolezTrol

1

x/10 будет производить поплавок. Когда x будет 1, это будет 0.1. Индекс не указан в grid0.1, поэтому результат undefined. Вот почему вы получаете эту ошибку.

Вы можете Math.floor или parseInt в зависимости от того, что вы пытаетесь сделать:

for(var x in bomb_list){ 
    grid[ parseInt(x/10) ][ x % 10 ].touching = -1; 
} 
+0

'Math.floor' был бы наиболее очевидным, так как он плавает. 'parseInt' сначала преобразует float в строку, а затем попытается разобрать эту строку на int. – GolezTrol

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