0

我正在尝试编写人生游戏。当我尝试迭代几代时,我最终得到了垃圾。我已经尝试了很多不同的东西,但我没有看到我的错误,但显然有一个错误。任何帮助将不胜感激。当我尝试将游戏的逻辑应用于旧数组以创建新数组时,我几乎可以肯定我做错了,但我不确定是什么。这是四个功能之一,我已经测试了其他功能,我很肯定这个缺陷存在于这个功能中。最终目标是让游戏在每一代都根据需要扩展和缩小。

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
4

2 回答 2

0

您应该显式输出数组的每个字符,而不是整个字符数组。

我相信 fprintf 会像你想要的那样输出一个数组,但是自从我使用 c++ 以来已经很长时间了。可能不是因为在高中写了一个非常相似的程序。

于 2013-02-28T23:10:06.413 回答
0

这是您保存的位置new_arr

for(int i=0; i<ROWS; i++)
    {
    fout << new_arr[i];
    fout << endl;
    }

具体来说,这里是错误:

    fout << new_arr[i];

将a 发送char *到 anostream将发送连续的字符,直到'\0'找到“空终止符”字符。

您的代码从不设置空终止符,因此很难判断正在写入多少。根据你的垃圾结果,它太多了。

于 2013-02-28T23:10:54.903 回答