生命游戏的逻辑错误(C++)
Logic error with Game of Life (C++)
正在制作康威的生活游戏,我觉得我非常接近完成它,但我的逻辑存在一些缺陷。我已经倾注了几个小时,我只是觉得第二双眼睛将能够比我更快地发现我的错误。我的程序编译得很好,但输出在特定位置没有遵循游戏的指南(例如 col 0,第 1 行在第二代中具有生命,而它不应该,但第 10 行的所有内容似乎都在按预期工作(。对于不熟悉的人:http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life#Rules
我几乎可以肯定逻辑错误发生在函数 advGen 中。以下链接包含 readGrid 函数使用的细菌内容.txt http://pastebin.com/6vurFRSB
感谢您抽出宝贵时间阅读并提供帮助,如果您选择这样做。
//sample setup to start the game of life - startlife.cpp
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
const int SIZE = 20;
//initial function prototypes
void initGrid(bool life[][SIZE], bool nextGen[][SIZE]);
void readGrid(bool life[][SIZE], bool nextGen[][SIZE]);
void printGrid(bool life[][SIZE], bool nextGen[][SIZE]);
void advGen(bool life[][SIZE], bool nextGen[][SIZE]);
int main()
{
bool life[SIZE][SIZE];
bool nextGen[SIZE][SIZE];
readGrid(life, nextGen);
/* for (int count = 0; count < 5; count++){
determineNextGen(life);
}*/
printGrid(life, nextGen);
advGen(life, nextGen);
printGrid(life, nextGen);
return 0;
}
/*-------------------------------------------------------
readGrid (and related functions)
---------------------------------------------------------*/
void readGrid(bool life[][SIZE], bool nextGen[][SIZE])
{
ifstream infile("bacteria.txt"); //see class site project#5 for data file
int numBacteria, row, col;
initGrid(life, nextGen);
infile >> row >> col;
while (infile){
life[row][col] = true;
infile >> row >> col;
}
infile.close();
}
void initGrid(bool life[][SIZE], bool nextGen[][SIZE])
{
for (int row = 0; row < SIZE; row++)
{
for (int col = 0; col < SIZE; col++){
life[row][col] = false;
}
}
for (int row = 0; row < SIZE; row++)
{
for (int col = 0; col < SIZE; col++){
nextGen[row][col] = false;
}
}
}
void printGrid(bool life[][SIZE], bool nextGen[][SIZE])
{
cout << " 01234567890123456789" << endl;
for (int row = 0; row < SIZE; row++)
{
cout << setw(2) << row;
for (int col = 0; col < SIZE; col++)
{
if (life[row][col])
{
cout << "*";
}
else
{
cout << " ";
}
}
cout << endl;
}
}
void advGen(bool life[][SIZE], bool nextGen[][SIZE])
{
int neighbor = 0;
for (int row = 0; row < SIZE; row++)
{
for (int col = 0; col < SIZE; col++)
{
if (row == 0)
{
if (col == 0)
{
if (life[row + 1][col] == true)
++neighbor;
if (life[row][col + 1] == true)
++neighbor;
if (life[row + 1][col + 1] == true)
++neighbor;
if ( (life[row][col] == true) && (neighbor < 2 || neighbor > 3))
{
nextGen[row][col] = false;
}
else if ( (life[row][col] == false) && (neighbor == 3) )
{
nextGen[row][col] = true;
}
}
else if (col == 19)
{
if (life[row + 1][col] == true)
++neighbor;
if (life[row][col - 1] == true)
++neighbor;
if (life[row + 1][col - 1] == true)
++neighbor;
if ( (life[row][col] == true) && (neighbor < 2 || neighbor > 3))
{
nextGen[row][col] = false;
}
else if ( (life[row][col] == false) && (neighbor == 3) )
{
nextGen[row][col] = true;
}
}
else
{
if (life[row + 1][col] == true)
++neighbor;
if (life[row][col + 1] == true)
++neighbor;
if (life[row][col - 1] == true)
++neighbor;
if (life[row + 1][col + 1] == true)
++neighbor;
if (life[row + 1][col - 1] == true)
++neighbor;
if ( (life[row][col] == true) && (neighbor < 2 || neighbor > 3))
{
nextGen[row][col] = false;
}
else if ( (life[row][col] == false) && (neighbor == 3) )
{
nextGen[row][col] = true;
}
}
}
if (row == 19)
{
if (col == 0)
{
if (life[row - 1][col] == true)
++neighbor;
if (life[row][col + 1] == true)
++neighbor;
if (life[row - 1][col + 1] == true)
++neighbor;
if ( (life[row][col] == true) && (neighbor < 2 || neighbor > 3))
{
nextGen[row][col] = false;
}
else if ( (life[row][col] == false) && (neighbor == 3) )
{
nextGen[row][col] = true;
}
}
else if (col == 19)
{
if (life[row - 1][col] == true)
++neighbor;
if (life[row][col - 1] == true)
++neighbor;
if (life[row - 1][col - 1] == true)
++neighbor;
if ( (life[row][col] == true) && (neighbor < 2 || neighbor > 3))
{
nextGen[row][col] = false;
}
else if ( (life[row][col] == false) && (neighbor == 3) )
{
nextGen[row][col] = true;
}
}
else
{
if (life[row - 1][col] == true)
++neighbor;
if (life[row][col - 1] == true)
++neighbor;
if (life[row][col + 1] == true)
++neighbor;
if (life[row - 1][col - 1] == true)
++neighbor;
if (life[row - 1][col + 1] == true)
++neighbor;
if ( (life[row][col] == true) && (neighbor < 2 || neighbor > 3))
{
nextGen[row][col] = false;
}
else if ( (life[row][col] == false) && (neighbor == 3) )
{
nextGen[row][col] = true;
}
}
}
if (col == 0)
{
if (row == 0)
{
if (life[row + 1][col] == true)
++neighbor;
if (life[row][col + 1] == true)
++neighbor;
if (life[row + 1][col + 1] == true)
++neighbor;
if ( (life[row][col] == true) && (neighbor < 2 || neighbor > 3))
{
//nothing
}
else if ( (life[row][col] == false) && (neighbor == 3) )
{
//nothing
}
}
else if (row == 19)
{
if (life[row - 1][col] == true)
++neighbor;
if (life[row][col + 1] == true)
++neighbor;
if (life[row - 1][col + 1] == true)
++neighbor;
if ( (life[row][col] == true) && (neighbor < 2 || neighbor > 3))
{
//nothing
}
else if ( (life[row][col] == false) && (neighbor == 3) )
{
//nothing
}
}
else
{
if (life[row - 1][col] == true)
++neighbor;
if (life[row + 1][col] == true)
++neighbor;
if (life[row][col + 1] == true)
++neighbor;
if (life[row - 1][col + 1] == true)
++neighbor;
if (life[row + 1][col + 1] == true)
++neighbor;
if ( (life[row][col] == true) && (neighbor < 2 || neighbor > 3))
{
nextGen[row][col] = false;
}
else if ( (life[row][col] == false) && (neighbor == 3) )
{
nextGen[row][col] = true;
}
}
}
if (col == 19)
{
if (row == 0)
{
if (life[row - 1][col] == true)
++neighbor;
if (life[row][col - 1] == true)
++neighbor;
if (life[row + 1][col - 1] == true)
++neighbor;
if ( (life[row][col] == true) && (neighbor < 2 || neighbor > 3))
{
//nothing
}
else if ( (life[row][col] == false) && (neighbor == 3) )
{
//nothing
}
}
else if (row == 19)
{
if (life[row - 1][col] == true)
++neighbor;
if (life[row][col - 1] == true)
++neighbor;
if (life[row - 1][col - 1] == true)
++neighbor;
if ( (life[row][col] == true) && (neighbor < 2 || neighbor > 3))
{
//nothing
}
else if ( (life[row][col] == false) && (neighbor == 3) )
{
//nothing
}
}
else
{
if (life[row][col - 1] == true)
++neighbor;
if (life[row - 1][col] == true)
++neighbor;
if (life[row + 1][col] == true)
++neighbor;
if (life[row + 1][col - 1] == true)
++neighbor;
if (life[row - 1][col - 1] == true)
++neighbor;
if ( (life[row][col] == true) && (neighbor < 2 || neighbor > 3))
{
nextGen[row][col] = false;
}
else if ( (life[row][col] == false) && (neighbor == 3) )
{
nextGen[row][col] = true;
}
}
}
else
{
if (life[row - 1][col] == true)
++neighbor;
if (life[row + 1][col] == true)
++neighbor;
if (life[row][col - 1] == true)
++neighbor;
if (life[row][col + 1] == true)
++neighbor;
if (life[row - 1][col - 1] == true)
++neighbor;
if (life[row + 1][col + 1] == true)
++neighbor;
if (life[row - 1][col + 1] == true)
++neighbor;
if (life[row + 1][col - 1] == true)
++neighbor;
if ( (life[row][col] == true) && (neighbor < 2 || neighbor > 3))
{
nextGen[row][col] = false;
}
else if ( (life[row][col] == false) && (neighbor == 3) )
{
nextGen[row][col] = true;
}
}neighbor = 0;
}
}
for (int row = 0; row < SIZE; row++)
{
for (int col = 0; col < SIZE; col++)
{
life[row][col] = nextGen[row][col];
}
}
}
您的代码正在重复计算邻居的数量。这是因为,例如,如果 row
为 0,col
为 0,则它在顶部执行row == 0
情况,并在 col == 0
if 语句内执行row == 0
情况,再往下大约 100 行
解决此问题的一种方法是使用正确的else
子句,即执行以下操作:
if (row == 0)
{
...
}
else if (row == 19)
{
...
}
else
{
...
}
您还需要对列情况执行此操作。
更好的解决方案是查看所有这些特殊情况,并尝试将它们合理化为重复代码较少的内容。
您试图实现的是防止在数组边界之外读取。
一个简单的方法是有一个函数来获取数组的值 row, col
检查row
和col
,并在row
或col
超出界时返回false
。然后,您可以为每个位置的 8 个周围块中的每一个调用该函数,而无需对第 0 行和第 19 行以及 col 0 和 19 设置特殊情况。
建议尝试编写像上面这样的函数,而不是我只是把它粘贴在这里。
编辑:另请注意 - 您并不总是将值设置为 nextGen
,因此您正在杀死与 2 或 3 个邻居有生命的细胞,您可能需要在分配给 nextGen
时重新考虑您的 if/else 语句
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误:未在此范围内声明'reverse'