Пожалуйста, я следил за учебником о том, как сделать игру со змеей, и я понял все о коде вплоть до того, куда змея должна двигаться. Я просто не понимаю логики движения змеи. Фрагмент кода показан ниже:
. . . //the code block to setup the canvas and other basic stuff for the game
//creating the snake
var snake_array; //an array of cells to make up the snake
function create_snake(){
var length = 5; //length of the snake
snake_array = [] //starting with an empty array
for (var i = 0; i < length; i++) {
//this will create a horizontal snake starting from top left
snake_array.push({x:i,y:0});
}
}
create_snake() // invoking the method
//painting the snake
function paint(){
. . . // code block to clear the trail of the snake on the canvas before the snake moves
var nx = snake_array[0].x;
var ny = snake_array[0].y;
if(d == "right") nx++; //d is a variable updated by the keydown event listener code(not shown here)
else if(d == "left") nx--;
if(d == "up") ny--;
if(d == "down") ny++;
var tail = snake_array.pop(); // pops out the last cell
tail.x = nx;
tail.y = ny;
snake_array.unshift(tail)
. . . // code block to paint the snake cells
}
}
paint() // invoking the method
Моя проблема такова: как часть кода, которую я описал выше, выполняет работу по продвижению змеи, потому что, когда я пытался следовать коду с помощью консоли браузера, после вызова create_snake()
у меня есть массив из пяти объектов (которые представляют ячейки змеи ), которые имеют следующие свойства и значения: {x:0,y:0}
,{x:1,y:0}
,{x:2,y:0}
,{x:3,y:0}
,{x:4,y:0}
. После вызова метода рисования у меня все еще есть массив из пяти объектов, но со следующими свойствами и значениями: {x:1,y:0}
,{x:0,y:0}
,{x:1,y:0}
,{x:2,y:0}
,{x:3,y:0}
. Теперь, как змея движется вперед, когда d = "right"
так как свойство/координата x последней ячейки змеи после вызова paint()
на 1 меньше, чем ее исходное значение до вызова метода, и снова две ячейки теперь перекрываются, так как два объекта в змея_массив теперь имеет ту же координату ({x:1,y:0}
)
{x:5,y:0} but {x:1,y:0}
, потому что из кода, который я вставил выше в вопросе,nx = snake_array[0].x
который равен0
, и если мы предположим, что змея движется вправо направлении, выполняетсяnx++
в коде иnx
становится1
. Затем мыpop()
голову змеи возвращаем в массив, делая ее координаты равными координатамnx
иny
. 07.11.2015