因此,我正在製作一個模擬類似生命的細胞自動機的程序,但我在計算細胞活的鄰居時使用了一些方法。問題是我希望能夠改變網格如何環繞 - 也就是說,它是否從左到右包圍從左到右(即圓柱形),從頂部到底部和從左到右(即環形)或根本不是(即,平坦的) - 我無法弄清楚如何使我的方法說明。這是我到目前爲止有:如何使用環繞計數細胞自動機中的細胞鄰居
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