因此,我正在制作一个模拟类似生命的细胞自动机的程序,但我在计算细胞活的邻居时使用了一些方法。问题是我希望能够改变网格如何环绕 - 也就是说,它是否从左到右包围从左到右(即圆柱形),从顶部到底部和从左到右(即环形)或根本不是(即,平坦的) - 我无法弄清楚如何使我的方法说明。这是我到目前为止有:如何使用环绕计数细胞自动机中的细胞邻居
public int getLiveNeighbors(int row, int col)
{
int count = 0;
// "topology" is an int that represents wraparound:
// 0 = flat; 1 = cylindrical; 2 = toroidal
int top = topology != 2 ? row - 1 : (row + ROWS - 1) % ROWS;
int bottom = topology != 2 ? row + 1 : (row + 1) % ROWS;
int left = topology != 0 ? (col + COLS - 1) % COLS : col - 1;
int right = topology != 0 ? (col + 1) % COLS : col + 1;
for (int r = top; r < bottom + 1; r++)
for (int c = left; c < right + 1; c++)
if (!(r == row && c == col) && getCell(r, c).equals(LIVE))
count++;
}
的关键,我认为,是for
-loop的if
语句来 - 必须有某种方式来检查r
和c
是否的边界内网格,同时牢记“边界”的定义将根据网格是否/如何环绕而变化。在过去,我已经通过对八个不同的if
-陈述分别检查由原始细胞的邻域组成的八个细胞中的每一个而有三个不同的组(每个环绕设置一个)正如你可以想象的那样,它不是很漂亮,但至少它工作。
我不是很擅长解释我自己的代码,所以我希望这不是太混乱 - 我自己感觉有点傻(哈哈)。如果有人有任何问题,随时问!
好,我也去了快这里是因为x和y的负指数情况(网格从0,0开始)。另外,事实证明Java%操作符返回一个余数而不是一个合适的模数。这与负数有关(例如-1%4 = -1而不是3)。 Math.floorMod会产生正确的行为。请参阅上面的替换案例声明。 – stegzzz