Javascript Conway'中的错误;s生命游戏算法(即复制二维数组的问题)

Javascript Conway'中的错误;s生命游戏算法(即复制二维数组的问题),javascript,html,conways-game-of-life,Javascript,Html,Conways Game Of Life,花了一些时间使用Javascript在HTML画布中实现Conways生活游戏 我的细胞没有发挥预期的作用。它似乎拾取了比实际更多的相邻细胞,并移除了不应该移除的细胞。任何帮助都将不胜感激 //全局 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

花了一些时间使用Javascript在HTML画布中实现Conways生活游戏

我的细胞没有发挥预期的作用。它似乎拾取了比实际更多的相邻细胞,并移除了不应该移除的细胞。任何帮助都将不胜感激

//全局
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=电流单元;
var lastGrid=当前单元格;
var cellsX=currentCells[1]。长度;
var cellsY=currentCells.length;
var canvas_id=“gameGrid”;
var gridWidth=100;
var-gridHeight=50;
var c=document.getElementById(“gameGrid”);
var ctx=c.getContext(“2d”);
var cellWidth=gridWidth/cellsX;
var cellHeight=网格高度/单元高度;
ctx.fillStyle=“黄色”;
设置间隔(步骤1000);
函数move(){
对于(var a=0;a0&&a3 | |当前邻居<2){
currentGrid[a][b]=0;
//console.log(“已触发”+当前邻居);
}
}
}
}
}
lastGrid=currentGrid;
}  
函数邻域计数(a,b){
var=0;
如果(lastGrid[a-1][b]==1{//
CurrentNeights=CurrentNeights+1;
}
如果(lastGrid[a+1][b]==1){//
CurrentNeights=CurrentNeights+1;
}
如果(lastGrid[a][b-1]==1{//
CurrentNeights=CurrentNeights+1;
}
如果(lastGrid[a][b+1]==1{//
CurrentNeights=CurrentNeights+1;
}
如果(lastGrid[a-1][b-1]==1){//
CurrentNeights=CurrentNeights+1;
}
如果(lastGrid[a+1][b+1]==1){//
CurrentNeights=CurrentNeights+1;
}
如果(lastGrid[a-1][b+1]==1){//
CurrentNeights=CurrentNeights+1;
}
如果(lastGrid[a+1][b-1]==1){//
CurrentNeights=CurrentNeights+1;
}
//console.log(当前邻居);
返回邻居;
}
函数绘图(){
clearRect(0,0,ctx.canvas.width,ctx.canvas.height);

对于(var a=0;a这里的问题是
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()

…因为,如上所述,该方法创建了一个具有相同值的新数组,并返回对该数组的引用。该方法遍历每个顶级数组项并执行请求的函数

通常,要复制一维数组,您可以通过以下方式使用
.slice()

newArray = oldArray.slice();
但是这种方法在二维数组上不起作用,因为它只会为您提供一个新数组,其中包含指向与
oldArray
中引用的子数组相同的子数组的指针


因此,您必须一次一个地遍历每个顶级数组和
.slice()
它们的子数组
method.

与您的问题不太相关,但是
neightourcount
函数不是太复杂了吗?为什么不简单地添加相邻单元格的值呢?根据您的建议,@JonathanM,我已经删除了我的答案并编辑了OP。@JonathanM我认为这不是一个问题,因为
m中的外部for循环ove
明确排除“边缘”单元格(请参见检查
a
b
必须分别大于0和小于其各自的界限减去1)。这是一种享受!谢谢!
newArray = oldArray.slice();