0

我创建的算法(康威生命游戏规则的实现)与康威的 GoL 不匹配。我已经尝试了我能做的所有事情,但它就是不匹配。

此外,如果有人知道如何将它变成一个无限平面或自行包裹,我很想看到它用我的代码实现!

运行 JSFiddle:http: //jsfiddle.net/jGkKF/2/

相关代码:

检查周围细胞是否有活细胞:(第 28 行)

var   x2 = x+1,   x3 = x-1,   y2 = y+1,   y3 = y-1;     // Math
if(tC[x][y3] !== undefined && tC[x][y3]) ne++;          // T
if(tC[x][y2] !== undefined && tC[x][y2]) ne++;          // TR
if(tC[x2] !== undefined) {
    if(tC[x2][y]) ne++;                                 // R
    if(tC[x2][y3] !== undefined && tC[x2][y3]) ne++;    // BR
    if(tC[x2][y2] !== undefined && tC[x2][y2]) ne++;    // B
}
if(tC[x3] !== undefined) {
    if(tC[x3][y]) ne++;                                 // BL
    if(tC[x3][y3] !== undefined && tC[x3][y3]) ne++;    // L
    if(tC[x3][y2] !== undefined && tC[x3][y2]) ne++;    // TL
}

算法:(第 50 行)

if(cell && (ne < 2 || ne > 3)) cell = 0; // Over- or under- populated?
else if(!cell && ne == 3) cell = 1;      // Give life?
4

2 回答 2

1

几个项目:

  1. 游戏规则说要检查所有 8 个周围的方格。根据您的代码,您似乎只检查了其中的 6 个。编辑:OP 正在检查所有 8。我仍然推荐第 2 点,它允许一致地处理每个被检查的单元格。
  2. 处理它的最简单方法是设置需要检查的单元格列表,然后在该列表上运行循环以进行计数。
  3. 要设置包装列表,请在设置单元格列表时使用边界检查代码,例如
    • 如果 cellIndex < 0 那么 cellIndex == maxIndex
    • 如果 cellIndex >= maxIndex 那么 cellIndex = 0
  4. 如果在尝试计算“下一代”时更新表示“此”代的值,您需要警惕可能发生的“扫描线”效应。两者需要独立存储。请注意,如果您使用的是整数数组,这可能只是意味着将“这一代”存储为 0 和 1,并且可以通过添加 8 等来指示“下一代”活细胞。处理当前一代后,更改所有内容 > = 8 到 1,任何小于 8 的单元格变为 0。
于 2014-04-09T14:09:00.793 回答
0

该声明

tC = cells;

不会复制元胞数组。它只是创建了对完全相同数组的第二个引用。因此,稍后,当您执行此操作时:

cells[x][y] = cell; // Setting the cell

这正在修改循环正在查看的同一数组。

此外,在检查邻居的循环中,您编写了与undefined. 但是,您的其余代码似乎用0.

于 2014-04-09T14:03:48.027 回答