Я пытаюсь сделать классическую игру со змеями в p5.js. У меня есть объект-змея, и я храню местоположения его тела в 2-мерном массиве this.data, где каждый элемент хранит значение x и значение y (с индексами 0 и 1 соответственно). Когда змея движется, я вставляю новые позиции в массив.
Я столкнулся с проблемой, когда попытался определить, столкнулась ли змея сама с собой. Я попытался проверить, была ли его текущая позиция уже в массиве, используя indexOf, мотивируя это тем, что если бы новое местоположение было открыто, это происходило бы только один раз в массиве, при индексе на единицу меньше, чем длина массива. В противном случае, если местоположение уже существует в другом месте массива (что указывает на то, что змея столкнулась с самим собой), оно вернет значение, меньшее длины минус единица.
Однако, похоже, этого не происходит.
function Snake()
{
this.x; //x-coordinate of head
this.y; //y-coordinate of head
this.dx; //velocity in x-direction
this.dy; //velocity in y-direction
this.length; //length of snake
this.data; //stores all locations snake occupies
this.alive = 1; //is the snake alive?
this.update = function(board)
{
if (this.alive)//update head position
{
this.x += this.dx;
this.y += this.dy;
let tempCoords = [this.x,this.y];
this.data.push(tempCoords);
while (this.data.length > this.length) //janky
{
this.data = this.data.slice(1);
}
if (this.data.indexOf(tempCoords) + 1 != this.data.length) //make sure snake hasn't hit itself
{
this.alive = 0;
}
}
}
}
Последний оператор if всегда оценивает false, даже если змея пересекает себя. Судя по проведенному мною тестированию, эта проблема возникает при использовании indexOf для многомерных массивов. Какие есть решения этой проблемы?