dicem
@dicem

Почему вылезает ошибка «Uncaught TypeError: Cannot read property '0' of undefined»?

Здравствуйте, вот пишу очередную свою проблему в проекте игры "Морской Бой".
Проблема опять в расстановке кораблей, я полностью поменял логику генерации. Код теперь выглядит следующим образом:
function randomShips(){

		var map = [
			['~','~','~','~','~','~','~','~','~','~'], // 0
			['~','~','~','~','~','~','~','~','~','~'], // 1
			['~','~','~','~','~','~','~','~','~','~'], // 2
			['~','~','~','~','~','~','~','~','~','~'], // 3
			['~','~','~','~','~','~','~','~','~','~'], // 4
			['~','~','~','~','~','~','~','~','~','~'], // 5
			['~','~','~','~','~','~','~','~','~','~'], // 6
			['~','~','~','~','~','~','~','~','~','~'], // 7
			['~','~','~','~','~','~','~','~','~','~'], // 8
			['~','~','~','~','~','~','~','~','~','~']  // 9
			//0   1   2   3   4   5   6   7   8   9
		]

		// Расстановка кораблей 1*1
		for (var i = 0; i < 4; i++) {
			var lat = getRandom(0, 9)
			var lon = getRandom(0, 9)
			console.log('Начальные значения lat='+lat+' lon='+lon)
			
			var checker = false
			while ( checker == false ){ // Проверка выбранной и соседних ячеек
				lat = getRandom(0, 9)
				lon = getRandom(0, 9)
				console.log('Чет оно замкнулось')
				for (var x = -1; x < 2; x++){ 
					for (var y = -1; y < 2; y++){
						if ( (lat + x != -1) && (lat + x != 11) && (lon + y != -1) && (lon + y != 11) ) { // Проверка не уйдут ли соседние клетки за пределы массива
							if ( (map[lat + x][lon + y] == 's') || (map[lat + x][lon + y] == 'w') ) {
								checker = false
								break
							}
							checker = true
						}
					}
					if (checker == false) break
				}
				if (checker == false) continue
			}
			
			for (var x = -1; x < 2; x++){ // Ну теперь собсна можно и проставить s и w
				for (var y = -1; y < 2; y++){
					if ( (x == 0) && (y == 0) ){ map[lat + x][lon + y] = 's' }
					else if ( (lat + x != -1) && (lat + x != 11) && (lon + y != -1) && (lon + y != 11) ){
						map[lat + x][lon + y] = 'w'
					}					
				}
			}
		}

Очень часто таким макаром я начал получать ошибку следующего характера:
5b2cf64c03cf3467214463.png
И если в моем предыдущем вопросе я получал ошибку с разными значениями, то сейчас "Cannot read property '0'" и только 0.
5b2cf6a8434df751108810.png5b2cf6b5cdda4574945005.png
Кстати массив опять стал произвольно расширяться, хотя я вроде как замутил адекватную проверку.
5b2cf74ab8b36052357964.png

Может я опять поскользнулся на самом простом? Подскажите мне пожалуйста.
  • Вопрос задан
  • 16244 просмотра
Решения вопроса 2
Vlad_IT
@Vlad_IT Куратор тега JavaScript
Front-end разработчик
Дам вам наводку. Во время ошибки, map[lat + x] равен undefined. И вы пытаетесь обратиться по индексу к undefined, и получаете ошибку, которая как раз и говорит
Uncaught TypeError: Cannot read property '1' of undefined
Что значит: не могу прочитать свойство '1' из undefined
Ответ написан
0xD34F
@0xD34F Куратор тега JavaScript
lat + x != 11

lon + y != 11

А 10, стало быть, является допустимым значением, да? И это значение вы используете в качестве индекса массива, чей размер - тоже 10. Толково придумано, ничего не скажешь.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы