康威的生命游戏板未正确更新
Conway's game of life board not properly updating
如果我把事情搞砸了,再次抱歉。当你运行代码时,它应该做康威的人生游戏。第一块板正常工作,显示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]='.';
的位置,这导致数学无法正常工作。
相关文章:
- 从C++本机插件更新Vector3数组
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- cmake更新缓存的变量
- 更新到莫哈韦后出现cmath错误
- OpenMP:并行更新数组总是需要减少数组吗
- 为什么我的变量没有更新,我的 LED 没有亮起?
- 指针没有更新它在void函数内部指向的值
- 如何在c++中获取要更新的值
- 已修改的LinkedList未在文本文件本身中更新
- Qt:当QListView获得新条目时,如何更新QStringList
- 更新的矢量元素不打印
- 如何使用按钮更新GTK3图像以使用C++从相机捕获图片
- 如何在ECS框架中更新组件数据和通知系统
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- 如果我想在没有更新编译器的情况下使用新功能,该怎么办?
- 如何在 C++11 中查找和更新向量中的一个嵌套结构
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新
- 在 emscripten 网页汇编正在运行期间更新进度条?
- 在运行时使用范围更新结果
- 康威的生命游戏板未正确更新