когда я устанавливаю значение массива, отличное от 0, возвращается «Uncaught TypeError: Невозможно установить свойство« 1 - 15 »« неопределено » - PullRequest
1 голос
/ 08 марта 2020

В настоящее время я пытаюсь создать генератор карт, но в разделе, где я случайным образом выставляю фигуры на землю, если я устанавливаю для них значение, отличное от 0 или "", он возвращает

"Uncaught TypeError: Невозможно установить свойство "1 - 15" 'undefined "

(не возвращает" 1-15 ", просто возвращает число от 1 до длины массива (равной 15) при запуске )

//lets every block surrounding a land peice have a 1 in 3 chance of making more land
for(let y = 0; y < proxy.length; y++){
    for(let x = 0; x < proxy[y].length; x++){
        if(proxy[y][x] != 0){

            for(let i = -1; i <= 1; i++){
                for(let j = -1; j <= 1; j++){

                    let run = Math.floor(Math.random() * 3)

                    if(run == 0){
                        proxy[y + i][x + j] = "o"
                    }

                }
            }   

        }
    }
}

(полный код) https://jsfiddle.net/2q9rz38x/1/

1 Ответ

2 голосов
/ 08 марта 2020

Давайте упростим эту проблему на секунду. Фактическая ошибка, которую вы видите, заключается в том, что вы обращаетесь к proxy[A][B], где proxy[A] не определено, и, следовательно, вы получаете Cannot set property B of undefined.

Подумайте на секунду, какие возможные значения A могут получить. A - это y + i в вашем коде. Вы цикл y с 0 до proxy.length - 1, и цикл i с -1 до 1.

Итак, возможный диапазон для y + i будет -1 до proxy.length. Это на 1 пункт больше в обоих направлениях, чем должно быть! (Вы согласитесь, что proxy[-1], вероятно, не определено, то же самое для proxy[proxy.length] ...)

Конечно, то же самое относится и к x + j, но это не выдаст ошибку, потому что просто напишет например, новые свойства в proxy[something][-1], которые, вероятно, не предназначены, но допустимы JavaScript.

Поэтому вам придется либо изменить значение l oop, либо ограничить значения. Поскольку это генератор карт на карте фиксированного размера, я думаю, более логично ограничить результат. Итак, вы бы сделали что-то вроде этого:

if (
  y + i >= 0 &&
  y + i < proxy.length &&
  x + j >= 0 &&
  x + j < proxy[y + i].length
) {
  proxy[y + i][x + j] = "o"
}

... или, альтернативно:

if ((y + i) in proxy && (x + j) in proxy[y + i]) {
  proxy[y + i][x + j] = "o"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...