在JS中编写Conway编程的“生命游戏”

时间:2016-10-26 23:52:49

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

我们必须为一个学校项目编写Conway的生命游戏的JavaScript版本,但我们仍然坚持循环边缘。整个工作正常,但计算邻居数的函数不适用于边上的单元格(因为它必须评估数组之外的值,这是未定义的)。我们已经尝试了几种选择,但它们都改变了程序其余部分的功能。

我们应该添加什么才能在网格的边缘上工作?

watir-webdriver

谢谢!

1 个答案:

答案 0 :(得分:3)

我会选择更像这样的东西:
正如你所看到的,我重构了一点。

var isvalid = function(x, y) {
        /*
         * This returns 1 if cells[x][y] == 1.
         * Otherwise, we return 0.
         * NOTE: If cells[x, y] is out of bounds, we return 0.
         * GLOBALS USED: cells, width, and height.
         */

        //This returns true if (index < size && index >= 0)
        //Used to check that index is not an invalid index.
        var inbounds = function (size, index) {
                return (index >= 0 && index < size);
        };

        //given point is out of bounds
        if (!inbounds(width, x) || !inbounds(height, y)) {
                return 0;
        }

        //everything is good
        return (cells[x][y] === 1) ? 1 : 0;
    };

var totalNeighbors = function(x, y) {
    var total = 0;

    //cells[x-1][y]
    total += isvalid(x-1, y);

    //cells[x + 1][y]
    total += isvalid(x+1, y);

    //cells[x][y - 1]
    total += isvalid(x, y-1);

    //cells[x][y + 1]
    total += isvalid(x, y+1);

    //cells[x - 1][y - 1]
    total += isvalid(x-1, y-1);

    //cells[x + 1][y - 1]
    total += isvalid(x+1, y-1);

    //cells[x - 1][y + 1]
    total += isvalid(x-1, y+1);

    //cells[x + 1][y + 1]
    total += isvalid(x+1, y+1);

    return total;
};

PS:您的原始代码示例是37行没有注释。我的代码示例是52行注释,33行没有注释。

尽可能接近,这种方式更清洁,更短。 ;)