【问题标题】:Incrementing two indexes instead of one [duplicate]增加两个索引而不是一个[重复]
【发布时间】:2019-12-31 20:55:29
【问题描述】:

我正在尝试制作一个蛇游戏。为了移动蛇,我有一个二维数组,可以帮助我在正确的位置填充画布,所以为了让它向前移动,我的逻辑是给蛇身体的每个部分(=每个索引)在索引中的位置下一个,如果我试图向右走,头部的 x 位置会在 if 语句中“手动”递增。

这里我从长度为 3 的蛇开始([3,3] 和 [4,3] 是身体的部分,[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 之后:

【问题讨论】:

    标签: javascript arrays increment


    【解决方案1】:

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

    替换:

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

    与:

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

    在数组上使用.slice(0) 是一种克隆数组的shallow copy 的方法(这对于您的代码来说就足够了),因此每个数组实际上都有自己的值。

    【讨论】:

    • 哇,它非常聪明!非常感谢!
    • 没问题!如果这是您正在寻找的答案,您介意用赞成和接受的复选标记标记它吗?它会让人们知道你对答案很满意,并给我一些分数。
    猜你喜欢
    • 1970-01-01
    • 2021-04-15
    • 2017-04-09
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 2020-02-19
    相关资源
    最近更新 更多