c++ - 康威的生命游戏板未正确更新

标签 c++

如果我搞砸了,再次抱歉。当您运行代码时,它应该执行康威的人生游戏。第一个面板正常工作,显示 X`s 和 .`s 但以下所有帧都只是 .`s

我相信问题会出现在 nextL 但我不确定...

#include <iostream>
#include <cstdlib>
#include <unistd.h>

int C = 0, R = 0;

void initL(char L[22][22])
{
    for(C = 0; C < 22; C++)
        L[C][0] = '0';

    for(R = 0; R < 22; R++)
        L[0][R] = '0';

    for(C = 0; C < 22; C++)
        L[C][21] = '0';

    for(R = 0; R < 22; R++)
        L[21][R] = '0';


    for(C = 1; C < 21; C++)
        for(R = 1;R < 21; R++)
            L[C][R] = '.';

    for(C = 1; C < 21; C++)
        for(R = 1; R < 21; R++)
            L[C][R] = (rand() % 2) ? '.': 'x';
}

void printL(char L[22][22])
{
    int C, R;

    for(C = 1; C < 21; C++)
    {
        std::cout << "\n";
        for(R = 1; R < 21; R++)
            std::cout << " " << L[C][R];
    }

    std::cout << "\n\n";
}

void nextL(char L[22][22])
{
    for(C = 1; C < 21; C++)
    {
        for(R = 1; R < 21; R++)
        {
            int LiveCnt = 0;

            if(L[C - 1][R-1] == 'X')
                LiveCnt++;

            if(L[C - 1][R] == 'X')
                LiveCnt++;

            if(L[C - 1][R + 1] == 'X')
                LiveCnt++;

            if(L[C][R - 1] == 'X')
                LiveCnt++;

            if (L[C][R + 1] == 'X')
                LiveCnt++;

            if (L[C + 1][R - 1]=='X')
                LiveCnt++;

            if(L[C + 1][R + 1] == 'X')
                LiveCnt++;

            if(L[C + 1][R] == 'X')
                LiveCnt++;

            L[C][R] = '.';

            if(L[C][R] == 'X' && LiveCnt < 2) //rule 1
                L[C][R] = '.';
            else if(L[C][R] == 'X' && (LiveCnt == 2 || LiveCnt == 3)) //rule 2
                L[C][R] = 'X';
            else if(L[C][R] == 'X' && LiveCnt > 3 ) //rule 3
                L[C][R] = '.';
            else if(L[C][R] == '.' && LiveCnt == 3) //rule 4
                L[R][C]='.';
        }
    }
}

int main()
{
    char L[22][22];
    int T;

    initL(L);
    for (T = 0; T < 4; T++)
    {
        printL(L);
        nextL(L);
    }
}

最佳答案

您的问题源于您在遍历数组时更改了每个单元格的值。这样做的问题是您会得到不准确的邻居计数,因为像元的值在错误的时间发生变化。您需要计算每个单元格将在下一帧更改为什么,并将该信息存储在一个临时位置,然后在计算每个单元格的所有新值之后,您需要将所有值更改为其新值。

例子: 你的方法:

001
100
110

如果您将算法应用于上述网格,从左上角开始,它将保持不变(正确)。从左到右再向下移动,第二个细胞没有变化(正确),第三个细胞死亡(正确),第四个细胞存活(正确),第五个细胞复活(错误)因为第三个细胞之前死亡第五个单元格可以计算它的邻居。

您需要编写一个算法来计算每个单元格邻居的数量,而不更改它们,然后在计算完所有邻居后更新值。

像这样:

calcNeighbors(); //loop through and find the neighbors of each cell storing them in a temporary array or class
updateCells(); //use temporary neighbor array and current cell value to change cell values to the correct value for next iteration

关于c++ - 康威的生命游戏板未正确更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36660343/

相关文章:

c++仅从ostringstream中提取数字

c++ - 如何在 wxWidgets 中将键盘焦点设置为 NULL 窗口?

c++ - 断言失败 : calling a list's node deconstructor

c++ - zlib gzopen() 返回压缩文件流。它会解压缩文件吗?

c++ - Visual Studio 2015 是否允许使用 GCC 编译普通的 C++ 项目?

c++ - QSqlDriver::close 使应用程序崩溃

c++ - 在 C++ 中是否有等效的 Java equals 方法?

c++ - 使用 C 或 C++ 在大型二进制文件中查找模式?

c++ - C/C++ 中的对象/结构对齐

c++ - boost 标记图,内部图尺寸错误