如何将数组卸载到对象的每个属性中?

时间:2016-02-21 19:37:49

标签: javascript arrays

我试图制作一个简单的蛇游戏,但是当它吃掉一块食物时,它不会在蛇上添加一个块,而是增加了多个块。我正在处理一些示例代码。原始代码使用unshift()方法将蛇的尾部块放在蛇的头部。

tail = {x: head_x , y: head_y};

snake_array.unshift(tail);

将对象尾部移入snake_array,将新的x和y坐标添加到蛇的前部。我想将两个x值和两个y值移到snake_array中,这样蛇每次吃食物时都会增长两个单位。我以为我可以为每个"尾部"使用一个数组。对象属性,但每次我这样做,蛇就会消失在遗忘状态。

if(head_x == food.x && head_y == food.y){
   if (direction == "right") var tail = {x: [head_x+1,head_x] , y: [head_y,head_y]};
snake_array.unshift(tail);

我不明白为什么会发生这种情况,我是否无法在对象参数中取消移位数组?

这是我的完整代码,我将head_x更改为nx,将head_y更改为ny以便于阅读。我只关注当时蛇向左移动的方向,一旦我理解了非移位方法如何工作,我可以弄清楚其他方向。

if(nx == food.x && ny == food.y){
     var tail;
      if (d == "right") tail = {x: [nx+1,nx] , y: [ny,ny]}; //incremented to get new head position
    else if(d == "left") tail = {x: nx-1,y: ny};
    else if(d == "up") tail = {x: nx,y: ny-1};
    else if(d == "down") tail = {x: nx,y: ny+1};
      //Create new food
      score++;
      create_food();
    }     
    else{
      var tail = snake_array.pop();//pops out last cell
      tail = {x: nx,y: ny};
    }

    snake_array.unshift(tail); //Puts back the tail as the first cell

1 个答案:

答案 0 :(得分:0)

正如我在评论中所描述的那样,问题中的代码不起作用,因为数组没有正确转换为snake_array。相反,我创建了一个名为" tail"的1x2数组,每个索引包含对象的各个属性及其值。然后我使用了MinusFour推荐的concat()方法。我还将unshift()方法移动到if语句的else部分。我计划清理代码,这样如果我想为每个食物或10个块添加5个块,我可以使用for循环轻松完成。感谢trincot指出如何使用控制台进行打印。

if (nx == food.x && ny == food.y) {

  if (d == "right") tail = [{x: nx+1,y: ny},{x: nx,y: ny}];
  else if (d == "left") tail = [{x: nx - 1,y: ny},{x: nx,y: ny}];
  else if (d == "up") tail = [{x: nx,y: ny - 1},{x: nx,y: ny}];
  else if (d == "down") tail = [{x: nx,y: ny + 1},{x: nx,y: ny}];
  //Create new food
  create_food();
  snake_array = tail.concat(snake_array);
} else {
  var tail = snake_array.pop(); //pops out last cell
  tail = {x: nx,y: ny};
  console.log(JSON.stringify(tail));
  snake_array.unshift(tail); //Puts back the tail as the first cell
}