Задать вопрос

Почему змейка тупит?

Заранее всем искреннее спасибо! Мучаюсь над проблемой уже второй день и всё-таки решил попросить помощи. Постарался максимально упростить для того, чтобы не выносить вам мозг.

Есть функция, которая принимает в параметрах змейку(змейка - это объект) и двигает ее следующим образом:
console.log разберём ниже

1. washCells - Стираются квадратики змейки на поле.

2. Создаётся переменная oldcells для запоминания координат змейки, так как после их изменения они нам понадобятся.

3. "snake.cells[0][0] += 1" Так как движение вправа, то меняется координата икса, в нашем случае увеличивается на один. Координаты cells - это двумерный массив, который содержит вначале квадратики cells[0], cells[1]..., где cells[0] это голова, cells[1] второй квадратик после головы. Cells[0][0] - это координата головы по иксу, а cells[0][1] по игрику.

4. Цикл, который изменяет расположение всех квадратиков (кроме головы(мы ее уже изменили)) так, чтобы каждому квадратику соответсвовало располежение oldcells[<номер квадратика>-1], то есть стало как у переднего квадратика в прошлом.

5. renderCells - отображает изменившиеся квадратики на поле.

function moveRight(snake) {
	console.log(snake.cells);
	washСells(snake, snake.cells, snake.length);
	var oldcells = snake.cells;
	snake.cells[0][0] += 1;
	for (var i=1; i<snake.length; i++) {
		snake.cells[i] = oldcells[i-1];
	}
	renderCells(snake, snake.cells, snake.length);
};


Проблема в том, что после вызова функции moveRight(snake) у всех квадратиков змейки становится одна координата, как у головы(snake.cells[0]==snake.cells[1]==snake.cells[3]...) и змейка длиной 3 квадратика превращается в длину одного. И ДЕЛО В ТОМ, ЧТО первый оператор функции console.log(snake.cells) уже возвращает одинаковые координаты, то есть до того, как я их вообще трогал. Я могу написать в отладчике браузера console.log(snake.cells) и все змейки ровно по местам, но после вызова функции moveRight они становятся одинаковыми. Что за бред ?
  • Вопрос задан
  • 241 просмотр
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
ОМГ! Вы про наследование свойств объектов - слышали что-нить?
Чтобы сделать змейку - нужна ТОЛЬКО ГОЛОВА ЗМЕИ! (остальное - объекты наследования)
Ответ написан
abyrkov
@abyrkov
JavaScripter
Вам к экстасенсам.
Ответ написан
Комментировать
k12th
@k12th
console.log(`You're pulling my leg, right?`);
for (var i=1; i<snake.length; i++) {
    snake.cells[i] = oldcells[i-1];
  }

Получается, вы следующему элементу присваиваете значение предыдущего. Немудрено, что в итоге у всех одинаковое значение. Рискну предложить перебирать массив с конца, типа такого:
for (var i = snake.length - 1; i > 1; i--) {
    snake.cells[i] = oldcells[i-1];
  }
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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