我们必须为学校项目编程Conway的《人生游戏》的JavaScript版本,但是我们一直陷于循环边缘。整个过程工作正常,但是计算邻居数量的函数在边缘的单元格上不起作用(因为它必须评估数组外部的值(未定义))。我们已经尝试了几个选项,但是它们都改变了程序其余部分的功能。

我们应该添加什么使其在网格边缘上工作?

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

    if (x > 0 && cells[(x - 1)][y] == 1) {
        total++;
    }

    if (x < (width - 1) && cells[x + 1][y] == 1) {
        total++;
    }

    if (y > 0 && cells[x][y - 1] == 1) {
        total++;
    }

    if (y < (height - 1) && cells[x][y + 1] == 1) {
        total++;
    }

    if (y > 0 && x > 0 && cells[x - 1][y - 1] == 1) {
        total++;
    }

    if (y > 0 && x < (width - 1) && cells[x + 1][y - 1] == 1) {
        total++;
    }

    if (y < (height - 1) && x > 0 && cells[x - 1][y + 1] == 1) {
        total++;
    }

    if (y < (height - 1) && x < (width - 1) && cells[x + 1][y + 1] == 1) {
        total++;
    }

    return total;
};


谢谢!

最佳答案

我会选择这样的东西:
如您所见,我重构了一点。

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行(不带注释)。

据我所知,这种方式更干净,更短。 ;)

10-07 23:01