dicem
@dicem

Почему иногда выходит ошибка « Uncaught TypeError: Cannot read property '3' of undefined »?

Суть:
Делаю "Морской бой", запиливаю генерацию расстановки кораблей.
function getRandom(from, to) {
		return Math.floor(Math.random() * (to - from + 1)) + from;
	}

	$('#test').click( () => randomShips())
function randomShips(){

		var smallShips = 4
		var mediumShips = 3
		var bigShips = 2
		var largeShips = 1

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

		// Расстановка кораблей 1*1
		for (var i = 0; i < 4; i++) {
			var lat = getRandom(1, 10)
			var lon = getRandom(1, 10)
			
			while ( map[lon][lat] == 's' ){
				lat = getRandom(1, 10)
				lon = getRandom(1, 10)
				console.log('Есть совпадение!')
			}
			map[lon][lat] = 's'
		}

		for (var i = 0; i < map.length; i++) {
			console.log( map[i] )
		}

	}

Собственно, делаю "болванку" var map[]; и вставляю в рандомное место корабль 1*1.
И бывает дело когда тесты проваливаются и выскакивает ошибка:
5b2ba109b327f378224697.png5b2ba1118e2d4039084125.png

Плюс ко всему иногда даже умудряется вставлять новый элемент в массив, то есть получается в ряду 11 элементов, вместо 10ти.

JSFIDDLE: https://jsfiddle.net/muen4c8g/1/
  • Вопрос задан
  • 6883 просмотра
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Кажется, кто-то не в курсе, что индексация массивов начинается с нуля.

Ну нет у вас ни в одном из массивов элемента с индексом 10, нет. Соответственно, когда lon принимает значение 10, map[lon] оказывается undefined, отсюда и ошибка.
Ответ написан
Vlad_IT
@Vlad_IT Куратор тега JavaScript
Front-end разработчик
У вас рандом начинается с 1 до 10 включительно, а элементов у вас 10 (с нуля по 9).
Вот так https://jsfiddle.net/j1qxmbf7/
// Расстановка кораблей 1*1
		for (var i = 0; i < 4; i++) {
			var lat = getRandom(0, 9)
			var lon = getRandom(0, 9)
			
			while ( map[lon][lat] == 's' ){
				lat = getRandom(0, 9)
				lon = getRandom(0, 9)
				console.log('Есть совпадение!')
			}
			map[lon][lat] = 's'
		}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы