细胞自动机检查邻居



我有一个非常简单的问题,但我似乎无法解决。我认为这是一个逻辑错误,与元胞自动机中邻居的检查有关。以下是我的代码,它每秒运行一次,用于增长和检查邻居:

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出生规则。

相关内容

  • 没有找到相关文章

最新更新