这里的问题是 lastGrid
和 currentGrid
都引用同一个数组及其子数组。当您编写以下代码时:
var currentCells = [
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,1,1,1,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
];
var currentGrid = currentCells;
var lastGrid = currentCells;
...您仅创建了一个数组,并有三个名称引用它。因此,当您操作 currentGrid
时,您实际上也在操作 lastGrid
。
而是这样做:
var currentCells = [
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,1,1,1,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
];
var currentGrid = currentCells.map(function(arr){return arr.slice()});
var lastGrid = currentCells.map(function(arr){return arr.slice()});
...这是您的 move()
的最后一行:
lastGrid = currentGrid.map(function(arr){return arr.slice()});
...因为,如所述 here ,.slice()
方法创建一个具有相同值的新数组并返回对其的引用。 .map()
方法遍历每个顶级数组项并执行请求的功能。
通常,要复制一维数组,您可以这样使用.slice()
:
newArray = oldArray.slice();
但是此方法不适用于二维数组,因为它只会为您提供一个新数组,其中充满了指向 oldArray
中引用的相同子数组的指针。
因此,您必须一次遍历每个顶级数组及其子数组的 .slice()
。这是通过 .map()
方法完成的。
我是一名优秀的程序员,十分优秀!