Game of Life自定义算法无法正常工作

时间:2016-05-11 18:23:35

标签: javascript algorithm conways-game-of-life

出于某种原因,我的JavaScript生命游戏算法不起作用。我试着用Blinker测试它

blinker

但它很快就无法正常工作

broken blinker

(注意,这是一个无限平面,所以底部的2个实际上位于顶部之上。)

这是一个非常有趣的设计,但它不是生命的游戏。

我的代码以

运行
var RxC = []; //the array to hold information about the plane
var drawGame = function(first) {
    for (var i=0;10000>i;i++) {//for each box
        var x = i%100;//gets what x block it is
        var y = Math.floor((i-x)/100);//gets what y block it is
        var box = canvas.getContext('2d');

        if (first) {
            if (!RxC[y]) RxC[y] = [];
            RxC[y][x] = Math.round(Math.random()) === 1;//random alive or dead
        }else {

            //get all neighbors

            //I am using 99 because the plane is 100 wide and 100 tall, but since arrays count from 0, I have to use 99 instead of 100
            var neighbors = 0;
            var topY = (y-1 < 0) ? 99 : y-1;
            var bottomY = (y+1 > 99) ? 0 : y+1;
            var leftX = (x-1 < 0) ? 99 : x-1;
            var rightX = (x+1 > 99) ? 0 : x+1;
            //N
            if (RxC[topY][x]) neighbors++;
            //NE
            if (RxC[topY][rightX]) neighbors++;
            //E
            if (RxC[y][rightX]) neighbors++;
            //SE
            if (RxC[bottomY][rightX]) neighbors++;
            //S
            if (RxC[bottomY][x]) neighbors++;
            //SW
            if (RxC[bottomY][leftX]) neighbors++;
            //W
            if (RxC[y][leftX]) neighbors++;
            //NW
            if (RxC[topY][leftX]) neighbors++;

            if (RxC[y][x]) {//if block is alive
                if (neighbors === 0 || neighbors >= 4) //kill block?
                    RxC[y][x] = false;
            }else {//block is dead
                if (neighbors === 3) //revive block?
                    RxC[y][x] = true;
            }
        }

        if (RxC[y][x]) {//block is alive
            box.fillStyle = '#000';
        }else {//block is dead
            box.fillStyle = '#eee';
        }
        box.fillRect(5*x,5*y,5,5);
        box.strokeRect(5*x,5*y,5,5);
    }
};
drawGame(true);//run game for first time, this will create the board originally
setInterval(drawGame, 25);

代码基本上是

  1. 随机制作棋盘
  2. 运行规则
    • 如果块是活动的,并且它有0个邻居或4个或更多邻居,它将会死亡
    • 如果该块已经死亡,并且它有3个邻居,它将恢复
  3. 我从here获得了规则,但规则似乎根本不起作用。

    我试图删除无限平面(邻居部分中的简写if else语句),重复检查我的代码,并且我尝试使用Google和维基百科等来查看我使用的规则是否不正确,但我找不到任何不同的东西。

    所以我的问题是,我使用的规则是否正确?如果它们是正确的,我的代码中是否有明显不正确的内容?

1 个答案:

答案 0 :(得分:0)

您的规则是错误的。娱乐生活。

y