康威的生活遊戲的工作,我覺得我很接近完成它,但我的邏輯有一些缺陷。我已經爲此傾注了好幾個小時,我只是覺得第二雙眼睛能夠比我更快地發現我的錯誤。我的程序編譯得很好,但輸出結果並不遵循特定位置的遊戲準則(第0行,第1行在第二代時有生命,但不應該,但第10行似乎按預期工作)。對於任何不熟悉的人: http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life#Rules生命遊戲的邏輯錯誤(C++)
我幾乎可以肯定邏輯錯誤發生在函數advGen中。以下鏈接保存了readGrid使用的細菌內容: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 << "" << 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];
}
}
}
你有很多重複的代碼在那裏會受益於被移入單獨的功能。它會讓你的代碼更容易閱讀。 – David 2014-12-13 03:26:28
_你擁有的'== true'的每一次使用都是100%冗餘的,而不是視覺噪聲。如果你只是將這些'bool'轉換爲'int'並添加它們,那麼'if(life [...])++ neighbour'的_huge_棧可以簡化爲幾行一起。爲了避免邊界邏輯以更多內存爲代價,你可以用左邊,右邊,上邊和下邊填充板,並且不要寫在它們上面。 – 2014-12-13 03:42:57