我们必须为一个学校项目编写Conway的生命游戏的JavaScript版本,但我们仍然坚持循环边缘。整个工作正常,但计算邻居数的函数不适用于边上的单元格(因为它必须评估数组之外的值,这是未定义的)。我们已经尝试了几种选择,但它们都改变了程序其余部分的功能。
我们应该添加什么才能在网格的边缘上工作?
watir-webdriver
谢谢!
答案 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行没有注释。
尽可能接近,这种方式更清洁,更短。 ;)