增加两个索引而不是一个

Incrementing two indexes instead of one

我正在尝试制作贪吃蛇游戏。为了移动蛇,我有一个二维数组,可以帮助我在正确的位置填充 canvas,所以为了让它向前移动,我的逻辑是给蛇的每个部分 body(= 每个索引) 位于下一个索引中的位置,如果我试图向右移动,则头部在 if 语句中增加其 x 位置 "manually"。

这里我从长度为 3 的蛇开始([3,3] 和 [4,3] 是 body 的部分,[5,3] 是头部)

这是我的代码:

var snake = [[3,3],[4,3],[5,3]];
var dir = "right";
function snakeGo(){
        eraseSnake();

        for(var i = 0; i < snake.length-1; i++){
            snake[i]=snake[i+1];
        }

        if(dir == "right"){
            snake[snake.length-1][0]++;
        }
        drawSnake();
    }

    snakeGo();

但是我在调​​试的时候,在程序进入if之前,'snake'是[[4,3],[5,3],[5,3]],在if结束的时候'snake' 是 [[4,3],[6,3],[6,3]]

不过我觉得应该是[[4,3],[5,3],[6,3]]..

snake.length-1 = 2 !为什么它递增 snake1[0] ?

if 之前:

if 之后:

中间数组与最后一个数组相同的数组。它只是一个 reference 到相同的精确值。假设有两个新闻播音员,每个人都报道同一个故事。如果故事发生变化,两位新闻播音员都会告诉您相同的更新。这就是这些阵列正在做的事情。当您说 arr1 = arr2 时,您只是在说 arr1 现在是同一个 story/value 的新闻播音员 - 因此更改与其中一个关联的值会同时更改它们两个。要更改此设置,您需要先克隆数组,然后再将其分配给新变量。

替换:

snake[i]=snake[i+1];

与:

snake[i]=snake[i+1].slice(0);

使用数组的 .slice(0) on the array is a method to clone a shallow copy(这对您的代码来说已经足够了)所以每个数组实际上都是它自己的值。