康威的生命游戏 - 不正确的算法?

时间:2014-04-09 13:40:05

标签: javascript algorithm canvas conways-game-of-life cellular-automata

我创建的算法(实现Conway的生命游戏规则)与Conway的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?

2 个答案:

答案 0 :(得分:1)

一些项目:

  1. 游戏规则说要检查所有8个周围的方块。根据您的代码,您似乎只检查其中的6个。编辑:OP正在检查所有8.我仍然建议使用第2点,它允许对要检查的每个单元格进行一致处理。
  2. 最简单的方法是设置需要检查的单元格列表,然后在该列表上运行循环以进行计数。
  3. 要设置包装列表,请在设置单元格列表时绑定检查代码,例如
    • if cellIndex&lt; 0然后是cellIndex == maxIndex
    • if cellIndex&gt; = maxIndex then cellIndex = 0
  4. 您需要警惕&#34;扫描线&#34;如果更新代表&#34;这个&#34;在尝试计算&#34; next&#34;代。这两者需要独立存储。请注意,如果您使用的是整数数组,这可能只是意味着存储&#34;这个&#34;生成为0和1,&#34; next&#34;可以通过添加8等来指示活细胞的生成。在处理当前生成之后,将所有&gt; = 8更改为1,并将任何单元格&lt; 8变为0。

答案 1 :(得分:0)

声明

tC = cells;

不会制作单元格数组的副本。它只是创建了对完全相同的数组的第二个引用。因此,稍后,当你这样做时:

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

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

此外,在您检查邻居的循环中,您已经编码了与undefined的精确比较。但是,您的其余代码似乎用0填充空单元格。