我有一个非常简单的问题,但我似乎无法解决。我认为这是一个逻辑错误,与元胞自动机中邻居的检查有关。以下是我的代码,它每秒运行一次,用于增长和检查邻居:
public void grow(){
Cell[][] next = new Cell[100][100];
for(int row = 0; row < (SIZE_X/SIZE); row++){
for(int col = 0; col < (SIZE_Y/SIZE); col++){
Cell cell = grid[row][col];
Cell nCell = grid[row][col]; // gets
if(cell != null){
int amount = neighbors(row, col); // find out how many neighbors are ALIVE/ON
if(cell.isOn() == true && amount != 3) // if the current cell is on but doesnt have 3 alive neighbors, it gets turned off
nCell.onOff(false);
else if(cell.isOn() == false && (amount >= 1 && amount <= 4)) // if it is off and has 1-5 alive neighbors it gets turned on
nCell.onOff(true);
next[row][col] = nCell;
}
}
}
grid = next;
}
public int neighbors(int row, int col){ // checks the amount of neighbors that are ALIVE/ON
int amount = 0;
for(int r = row-1; r <= row+1; r++){ // stepping through a 3x3 area of the grid, which surrounds the selected block
for(int c = col-1; c <= col+1; c++){
// clamp
if((r > 0 && r < 99) && (c > 0 && c < 99)){
if(grid[r][c].isOn() == true && (r != row && c != col)) // checks if the current neighbor is ALIVE/ON
amount++; // if it is then add one to the count
}
}
}
return amount;
}
我在我的细胞自动机中使用了一个简单的12345/3(生存/出生(规则。
目前的问题是,我有一个100x100的网格,中心有10x10的ALIVE/ON单元空间。我的代码运行一次后,所有细胞都会死亡。
如果有人需要更多信息,请随时询问。提前感谢!
有一些问题,但我不确定结果是什么。
第一个问题:
if(cell.isOn() == true && amount != 3) // if the current cell is on but doesnt have 3 alive neighbors, it gets turned off
cell.onOff(false);
if(cell.isOn() == false && (amount >=1 && amount <= 5)) // if it is off and has 1-5 alive neighbors it gets turned on
cell.onOff(true);
让我们假设这个小区有一个活着的邻居。然后第一个子句关闭它,然后第二个子句重新打开它。所以"死亡"规则不起作用。解决方案:使用else if
。
第二个问题:
你在同一个地方检查所有东西。例如,字段为:
**.
*.*
我们检查单元格(0,0)
,然后字段为:.*。
然后,在检查完所有第一行之后,字段为:。。。然后所有人都死了。:(解决方案:首先检查每个小区的邻居号码,并将其存储在每个小区中。只有在那之后,才能按照规则打开和关闭它们。
第三个问题:在场边上,一些邻居被检查了两次。例如,小区(0,0)
开启并且我们检查小区(0,1)
的邻居。首先,我们尝试将(-1, 0)
更改为(0,0)
并添加到amount中。稍后CCD_ 7再次被检查为左邻居并再次被添加到量中。
if(grid[r][c].isOn() == true && (r != row && c != col))
在这里,您将只考虑与中心单元格不在同一行AND列上的邻居。因此,您需要考虑4个单元格,而不是8个。你可能是这个意思:
if(grid[r][c].isOn() == true && (r != row || c != col)
所以我实施了一些改变,解决了你所说的问题关于然而,另一个问题突然出现了,那就是现在起点右侧的巨大金字塔并缓慢增长似乎没有韵律或理由。Iv更新了我的代码
Cell是一个类吗?因为可以直接从栅格中指定nCell。如果通过引用执行此操作,还可以更改旧网格视图中单元格的值。这样做将创建有蔓延到网格右下角趋势的图案。
编辑:刚刚意识到这是Java,上面可能不是真的。如果是这样的话,就不管它了。
第2版:同时:
if(cell.isOn() == true && amount != 3) // if the current cell is on but doesnt have 3 alive neighbors, it gets turned
off
nCell.onOff(false);
else if(cell.isOn() == false && (amount >= 1 && amount <= 4)) // if it is off and has 1-5 alive neighbors it gets turned on
nCell.onOff(true);
这不符合1-5存活3出生规则。