Увеличение длины на элемента на JavaScript

162
15 марта 2019, 21:50

Пишу змейку на Javascript. Нужно чтобы после прохождения через ячейку где находится еда длина змеи увеличивалась. Каким образом это можно реализовать? Вот код:

const KEY_LEFT = 37; 
const KEY_UP = 38; 
const KEY_RIGHT = 39; 
const KEY_DOWN = 40 
var vendors = ["webkit", "moz", "o", "ms"]; 
for (var x = 0; x < vendors.length && !window.requestAnimationFrame; x++) { 
  window.requestAnimationFrame = window[vendors[x] + "RequestAnimationFrame"]; 
  window.cancelAnimationFrame = window[vendors[x] + "CancelAnimationFrame"] || 
    window[vendors[x] + "CancelRequestAnimationFrame"]; 
} 
var table = document.getElementById('table'); 
var rows = ''; 
for (var i = 0; i <= 15; i++) { 
  rows += '<tr class="row" + i'; 
  for (var j = 0; j <= 25; j++) { 
    rows += '<td></td>'; 
  } 
  rows += '</tr>'; 
} 
table.innerHTML = rows; 
var i = 0; 
var j = 0; 
 
function move(i, j) { 
  var old = document.querySelector("td.red"); 
  //console.log(i, j); 
  if (old) 
    old.classList.remove("red"); 
  table.rows[i].cells[j].classList.add("red"); 
} 
addEventListener("keydown", function(event) { 
  if (event.keyCode == KEY_UP) { // up 
    i--; 
    if (i < 0) 
      i = table.rows.length - 1; 
  } else if (event.keyCode == KEY_DOWN) { // down 
    i++; 
    if (i >= table.rows.length) 
      i = 0; 
  } else if (event.keyCode == KEY_RIGHT) { // right 
    j++; 
    if (j >= table.rows[0].cells.length) 
      j = 0; 
  } else if (event.keyCode == KEY_LEFT) { // left 
    j--; 
    if (j < 0) 
      j = table.rows[0].cells.length - 1; 
  } 
  move(i, j); 
}); 
move(i, j); 
 
function randomFood(i, j) { 
  var food = document.querySelector("td.green"); 
  if (food) 
    food.classList.remove("green"); 
  table.rows[i].cells[j].classList.add("green"); 
} 
randomFood(5, 8);
#table { 
  margin: 0 auto; 
} 
 
td { 
  width: 20px; 
  height: 20px; 
  border: 1px solid black; 
} 
 
td.red { 
  background: red; 
} 
 
td.green { 
  background: green; 
}
<table id="table"> 
  <tr class="row"> 
    <td></td> 
  </tr> 
</table>

Answer 1

Если вопрос по логике то вот несколько советов.

  1. Сохранить координаты из ф-ии randomFood() в отдельные переменные
  2. При каждом движении сравнивать координаты текущей клетки с координатами из ф-ии randomFood()
  3. Для того что бы змейка увеличивалась координаты текущей клетки лучше записывать в массив массивов и менять класс на "red" у всех ячеек таблицы с координатами из этого массива
  4. При поедании просто добавлять координаты но не удалять.
  5. При движении добавляя координаты новой клетки в начало(например) массива и удаляя последние.
  6. При каждом движении сравнивать новые координаты с имеющимися в массиве что бы предотвратить прохождение через себя.

если в процессе реализации возникнут вопросы по коду пиши.

READ ALSO
Как обработать события click правильно?

Как обработать события click правильно?

В блоке два одинаковых элемента, нужно обработать события клика так чтобы dropdown открывался только у элемента на который кликнули

209
Почему setInterval не работает?

Почему setInterval не работает?

Почему не выводится имя? Ведь стрелочная функция сохраняет контекст вызова, по идее все должно работать, но это не такЕсли заменить this

144
Опциональные параметры в js?

Опциональные параметры в js?

Мне требуется написать функцию на jsУ этой функции должны быть опциональные аргументы, делаю так

124