如果我搞砸了,再次抱歉。当您运行代码时,它应该执行康威的人生游戏。第一个面板正常工作,显示 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/