1
else if(po==true){
        snake_array.reverse();
        var i=0;
        var c=snake_array[i];
        //paints head
        paint_head(c.x,c.y);
        for(i=1;i<snake_array.length;i++){
            //paints body
            var c=snake_array[i];
            paint_body(c.x,c.y);
            if(snake_array[i].x<snake_array[i-1].x){
                d="right";
            }
            else if(snake_array[i].x>snake_array[i-1].x){
                d="left";
            }
            else if(snake_array[i].y>snake_array[i-1].y){
                d="up";
            }
            else if(snake_array[i].y<snake_array[i-1].y){
                d="down";
            }
        }
        //poison status false
        po=false;
    }

po 是中毒状态的变量。每当蛇吃这种食物时。应该倒过来,回到之前的轨迹。。是的,蛇会回复,但问题是蛇没有回到之前的轨迹。,而是在吃毒之前与之前的方向相反……

      x  <-food
      ^  <-head            v  <-tail                v <-tail
      |                    |                        | 
      |   >-becomes->      |    >-instead of->      |
>.....|             .......|                  <.....|
^                   |                         ^ 
|_tail              V  <-head                 |_head  
4

2 回答 2

0

你的新方向是基于尾部而不是头部。 d在循环的每次迭代中设置,这意味着唯一重要的是最后一次。因此,由于您的尾巴在示例中朝下,d因此设置为向下。

您要么需要在反转之前检查尾部,然后反转d或检查头部而不是尾部。

假设蛇的长度至少为 2,请在循环之外执行以下操作:

if(snake_array[0].x<snake_array[1].x){
    d="left";  // left or right depending on how your coordinate system works
} ...

这将只看头部的正面。您可能需要检查蛇的长度是否仅为 1,然后只需反转您当前的方向。

于 2013-03-18T14:10:21.880 回答
0

这里的问题是,你如何确定头部的方向?尾巴在哪里画?根据您的答案,这可能是由于不同的问题造成的。在我看来,要知道尾巴的正确方向 (d),您不仅需要存储蛇当前段的所有坐标,还需要存储最后占用和现在释放的位置。您是否也将其保存在数组中?如果是这种情况,那么 .reverse() 函数会给你一个错误的结果,因为它不会把头放在尾巴的位置,而是放在尾巴之前的点,也就是尾巴占据的点在上一回合。

Another thing that could be failing here is your updating mechanism. Maybe after the reversal, there's an update so that the head automatically advances by one space (but does so in the wrong direction)? Again, we need to know more of your code.

于 2013-03-18T16:48:42.547 回答