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

Conway's game of life board not properly updating

本文关键字:更新 生命 游戏 康威      更新时间:2023-10-16

如果我把事情搞砸了,再次抱歉。当你运行代码时,它应该做康威的人生游戏。第一块板正常工作,显示X和`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 << "nn";
}
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

对,问题在nextL中,实际上在应用规则之前的L[C][R] = '.';行中。该行无条件地将每个单元设置为.。删除它以获得正确的结果。

可以签入带有控制台输出的工作代码段http://cpp.sh/2egdu.

这是几年后的事了,5分钟前我想起我在这里有一个账户。

这里的代码的问题是,最后一个if else语句尝试将L[R][C]='.';设置为其他语句设置为L[C][R]='.';的位置,这导致数学无法正常工作。