Я пытаюсь запрограммировать игру жизни. Когда я пытаюсь перебрать поколения, я получаю мусор. Я пробовал довольно много разных вещей, но я не вижу своей ошибки, но, очевидно, есть одна. Любая помощь будет принята с благодарностью. Я почти уверен, что делаю что-то не так, когда пытаюсь применить логику игры к старому массиву, чтобы создать новый, но я не уверен, что именно. Это одна из четырех функций, я проверил остальные, и я уверен, что недостаток заключается в этой. Конечная цель состоит в том, чтобы игра расширялась и уменьшалась по мере необходимости с каждым поколением.
void iterateGeneration ()
{
ifstream fin;
fin.open("tmp.txt");
ofstream fout;
char **arr=new char * [ROWS];
for(int i=0; i<ROWS; i++)
arr[i] = new char [COLUMNS];
int lifecheck=0;
//read in current generation from tmp.txt
for(int i=0; i<ROWS; i++)
{
fin.getline(arr[i], COLUMNS);
}
fin.close();
char **new_arr=new char * [ROWS];
for(int i=0; i<ROWS; i++)
new_arr[i]= new char [COLUMNS];
//count live neighbors, then determine if cell will be alive next generation
for(int i=0; i<ROWS; i++)
{
for(int j=0; j<COLUMNS-1; j++)
{
lifecheck=0;
if((i==0 && j==0) || (i==0 && j==(COLUMNS-2)) || (i==(ROWS-1) && j==0) || (i==(ROWS-1) && j==(COLUMNS-2)))//corners always stay dead
{
lifecheck=0;
}
else if(i==0)//special check for first row, only three checks since neighbors in first row is always dead
{
if(arr[i+1][j-1]=='1')
lifecheck+=1;
if(arr[i+1][j]=='1')
lifecheck+=1;
if(arr[i+1][j+1]=='1')
lifecheck+=1;
}
else if(i==(ROWS-1))//special check for last row
{
if(arr[i-1][j-1]=='1')
lifecheck+=1;
if(arr[i-1][j]=='1')
lifecheck+=1;
if(arr[i-1][j+1]=='1')
lifecheck+=1;
}
else if(j==0)//special check for first column
{
if(arr[i-1][j+1]=='1')
lifecheck+=1;
if(arr[i][j+1]=='1')
lifecheck+=1;
if(arr[i+1][j+1]=='1')
lifecheck+=1;
}
else if(j==(COLUMNS-2))//special check for last column
{
if(arr[i-1][j-1]=='1')
lifecheck+=1;
if(arr[i][j-1]=='1')
lifecheck+=1;
if(arr[i+1][j-1]=='1')
lifecheck+=1;
}
else
{
if(arr[i-1][j-1]=='1')
lifecheck+=1;
if(arr[i-1][j]=='1')
lifecheck+=1;
if(arr[i-1][j+1]=='1')
lifecheck+=1;
if(arr[i][j-1]=='1')
lifecheck+=1;
if(arr[i][j+1]=='1')
lifecheck+=1;
if(arr[i+1][j-1]=='1')
lifecheck+=1;
if(arr[i+1][j]=='1')
lifecheck+=1;
if(arr[i+1][j+1]=='1')
lifecheck+=1;
}
if(arr[i][j]=='0')
{
if(lifecheck==3)
new_arr[i][j]=='1';
else
new_arr[i][j]=='0';
}
else if(arr[i][j]=='1')
{
if(lifecheck==2)
new_arr[i][j]=='1';
else if(lifecheck==3)
new_arr[i][j]=='1';
else
new_arr[i][j]=='0';
}
else
new_arr[i][j]=='0';
}//2nd for
}//1st for
fout.open("tmp.txt");
for(int i=0; i<ROWS; i++)
{
fout << new_arr[i];
fout << endl;
}
for(int p=0; p<ROWS; p++)
{
delete [] arr[p];
delete [] new_arr[p];
}
delete [] arr;
delete [] new_arr;
}using namespace std;
const int NUM_GENERATIONS = 1; //set to a smaller number for debugging
int main()
{
populateWorld(FILE_NAME);
showWorld();
for (int iteration = 0; iteration < NUM_GENERATIONS; iteration++)
{
if (WINDOWS)
system("cls"); //Windows only
else
system("clear"); //Linux only
iterateGeneration();
showWorld();
}
if (WINDOWS)
system("PAUSE");
return 0;
}
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000010000000000000000000000000000000000000000000
0000000000000000000000000000001010000000000000000000000000000000000000000000
0000000000000000000011000000110000000000001100000000000000000000000000000000
0000000000000000000100010000110000000000001100000000000000000000000110000000
0000000011000000001000001000110000000000000000000000000000000000000110000000
0000000011000000001000101100001010000000000000000000000000000000000000000000
0000000000000000001000001000000010000000000000000000000000000000000000000000
0000000000000000000100010000000000000000000000000000000000000000000000000000
0000000000000000000011000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000001110000000
0000000000000000000000000000000000000000000000000000000000000000010001000000
0000000000000000000000000000000000000000000000000000000000000000100000100000
0000000000000000000000000000000000000000000000000000000000000000100000100000
0000000000000000000000000000000000000000000000000000000000000000000100000000
0000000000000000000000000000000000000000000000000000000000000000010001000000
0000000000000000000000000000000000000000000000000000000000000000001110000000
0000011000000000000000111000000000000000000000000000000000000000000100000000
0000011000000000000000101000000000000000000000000000000000000000000000000000
0000000000000000000000110000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000011100000
0000000000000000000000000000000000000000000000000000000000000000000011100000
0000000000000000000000000000000000000000000000000000000000000000000100010000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000001100011000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0001100011000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000100010000000000000000000000000000000000000000000000000000000000000000000
0000011100000000000000000000000000000000000000000000000000000000000000000000
0000011100000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000110000000000000000000000
0000000000000000000000000000000000000000000000000001010000000000000001100000
0000000010000000000000000000000000000000000000000001110000000000000001100000
0000000111000000000000000000000000000000000000000000000000000000000000000000
0000001000100000000000000000000000000000000000000000000000000000000000000000
0000000010000000000000000000000000000000000000000000000000000000000000000000
0000010000010000000000000000000000000000000000000000000000000000000000000000
0000010000010000000000000000000000000000000000000000000000000000000000000000
0000001000100000000000000000000000000000000000000000000000000000000000000000
0000000111000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000001100000000000000000000
0000000000000000000000000000000000000000000000000000100010000000000000000000
0000000000000000000000000000000000000000000100000001000001000000001100000000
0000000000000000000000000000000000000000000101000011010001000000001100000000
0000000110000000000000000000000011000000000000110001000001000000000000000000
0000000110000000000000000000000011000000000000110000100010000000000000000000
0000000000000000000000000000000000000000000000110000001100000000000000000000
0000000000000000000000000000000000000000000101000000000000000000000000000000
0000000000000000000000000000000000000000000100000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00`ó!#\00\00 \00\00
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000000000000000000000000
00000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000000
00000000000000000000000000000010
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000000000000000110000001100000000000011000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000001100000000000011000000000000000000000001
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000000000000000000000110000000
00000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000000000000
00000000000000000010000010
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000000000000000000001000100000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000110000000000000000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000000000000000000000000000000000000
00
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000000000000000000
00000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000
00000000000000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000000000000000000000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000000000000000000000000000000000000100010000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000000000000100000100000
00000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000100000
00000000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000000000000000000000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000000000000000000000000000000000000000000011
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000000000000000000000100000000
00000110
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000000000000
00000000000000000000001100
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000000000000000000000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000000000000000000000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000000000000000000000000000100010000
00
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000000000000000000
00000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\001000
00000000000000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000000000000000000000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000000000000000000000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000000000000000000000000
00000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000000
00001000100000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0011000000000000000000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000000000000000000000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000000110000000000000000000000
00000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000001100000
00000000100000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000000001110000000000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000000000000000000000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000000000000000000000000000000000000
00
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000000000000000000
00000100000100000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000
00000010001000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000000000000000000000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000000000000000000000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000000000000000000000000
00000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000000
00000000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000000000000000000000000000000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000000000000000000000000000001000100000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000100000001000001000000001100000000
00000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000001100000000
00000001100000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000000001100000000000000000000000110000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0000000000000000000000000000001100000011000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000101000000000000000000000000000000
00
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000000000000000000000
00000000000000000000
x"#\00\00x"#\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000000
Вы должны явно выводить каждый символ массива, а не весь массив символов.
Я считаю, что fprintf будет выводить массив, как вы хотите, но прошло уже много времени с тех пор, как я использовал c ++. Вероятно, нет, так как написание очень очень похожей программы в средней школе.
Здесь вы экономите new_arr
:
for(int i=0; i<ROWS; i++)
{
fout << new_arr[i];
fout << endl;
}
И вот, в частности, это ошибка:
fout << new_arr[i];
Отправка char *
для ostream
будет отправлять последовательные символы до «нулевого терминатора» '\0'
персонаж найден.
Ваш код никогда не устанавливает нулевой терминатор, поэтому очень сложно сказать, сколько пишется. На основании ваших результатов мусора, это слишком много.