未正确计算活动的邻居小区

时间:2018-02-19 15:18:20

标签: c++ conways-game-of-life

我知道我的头衔并不是非常具体,但那是因为我不知道问题来自哪里。我从2或3个小时就遇到了这个问题,理论上一切都应该有效,但事实并非如此。 这段代码:

for ( int x = -1; x <= 1; x++ ) {       //Iterate through the 8 neighbour cells plus the one indicated
    for ( int y = -1; y <= 1; y++ ) {

        neighbour = coords(locX + x, locY + y, width);      //Get the cell index in the array

        if (existsInOrtho(ortho, neighbour)) {      //If the index exists in the array

            if (ortho[neighbour] == 0) {        //Cell is dead
                cnt--;      //Remove one from the number of alive neighbour cells
            }

        } else {        //Cell is not in the zone
            cnt--;      //Remove one from the number of alive neighbour cells
        }

    }
}

遍历所有邻居单元格以获取它们在数组中的值(1表示活着,0表示死亡)。 &#34; coords&#34;功能,如下所示:

int coords(int locX, int locY, int width)
{
    int res = -1;

    locX = locX - 1;    //Remove one from both coordinates, since an index    starts at 0 (and the zone starts at (1;1) )
    locY = locY - 1;

    res = locX * width + locY;      //Small calculation to get the index of the pixel in the array

    return res;
}

获取数组中单元格的索引。但是当我运行代码时,它不起作用,相邻单元的数量是不正确的(它就像一个单元格,每次在附近有一些活着的时候都没有计算)。我尝试手动分解所有内容,但它确实有效,所以我不知道什么会破坏最终代码中的所有内容...... Here is the complete code.抱歉,如果我犯了任何英文错误,那就不是我的母语

1 个答案:

答案 0 :(得分:2)

此代码......

for ( int x = -1; x <= 1; x++ ) {       //Iterate through the 8 neighbour cells plus the one indicated
    for ( int y = -1; y <= 1; y++ ) {

实际检查 9 单元格。也许你忘了它检查(x,y)=(0,0)。那将包括细胞本身以及它的邻居。

一个简单的解决方法是:

for ( int x = -1; x <= 1; x++ ) {       //Iterate through the 8 neighbour cells plus the one indicated
    for ( int y = -1; y <= 1; y++ ) {
        if (x || y) {

此外,simulate函数(来自您的链接)会导致在处理其旁边的单元格所需的状态更改之前更新同一数组中的单元格值的常见错误。最简单的解决方法是保留两个数组 - 代码中两个完整的网格副本(两个ortho数组)。从orthoA读取时,更新orthoB。然后在下一代,翻转。从orthoB读取并写入orthoA。