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

时间:2016-04-16 05:08:04

标签: c++

如果我设法搞砸了什么话再次抱歉。当你运行代码时,它应该是康威的生活游戏。第一块板可以正常工作,显示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 << "\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);
    }
}

3 个答案:

答案 0 :(得分:2)

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

可以在http://cpp.sh/2egdu中检查带有控制台输出的工作代码段。

答案 1 :(得分:2)

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

实施例: 你的方法:

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

答案 2 :(得分:1)

这是几年后的5分钟前,我记得我在这里有个帐户。

这里的代码存在问题,即最后一个1000语句尝试设置if else,而其余的设置L[R][C]='.';则导致数学无法正常工作。