我正在为一个个人项目编写Conway的生命游戏细胞自动机的JavaScript实现的一些代码,我已经达到了对规则进行编码的程度.我将规则应用到每个单元格,然后将新版本存储在网格的副本中.然后,当我计算完每个单元格的下一个状态时,我将第一个网格的状态设置为第二个网格的状态,清空第二个网格,然后重新开始.这是我在规则中使用的代码:
//10x10 grid
let ecells = [[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, 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, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]];
let cells = empty_cells;
let new_cells = cells;
let paused = true;
function Cell(x, y) {
return cells[y][x];
}
function Nsum(i, j) {
if (i >= 1 && j >= 1) {
return Cell(i - 1, j) + Cell(i + 1, j) + Cell(i, j - 1) + Cell(i - 1, j - 1) + Cell(i + 1, j - 1) + Cell(i, j + 1) + Cell(i - 1, j + 1) + Cell(i + 1, j + 1);
}
}
//One can manually change the state of the cells in the "cells" grid,
//which works correctly. Then, one can run the CA by changing the "paused"
//value to false.
function simulation() {
for (i = 0; i < cells[0].length; i++) {
for (j = 0; j < cells.length; j++) {
if (Cell(i, j)) {
ctx.fillRect(20*i - 0.5, 20*j, 20, 20);
if (!paused) {
if (Nsum(i, j) == 2 || Nsum(i, j) == 3) new_cells[j][i] = 1;
else new_cells[j][i] = 0;
}
}
else {
ctx.clearRect(20*i - 0.5, 20*j, 20, 20);
if (!paused) {
if (Nsum(i, j) == 3) new_cells[j][i] = 1;
else new_cells[j][i] = 0;
}
}
}
}
if (!paused) cells = new_cells;
new_cells = empty_cells;
requestAnimationFrame(simulation);
}
simulation();
规则逻辑在嵌套的for循环内部,Nsum是计算当前单元格的邻域和的函数.我说ncell [j][i]而不是ncell [i][j],因为在一个2d数组中,你首先寻址行.
我没有try 太多,但我想不出解决办法.救命啊