康威的生命游戏C ++代码检查

时间:2018-04-18 23:09:04

标签: c++

我首先要说的是我是个傻瓜。我已经开始学习2周前了。今天我在YT上发现了一些有关康威生命游戏的视频。到目前为止,我学到了很多东西,但我还是试着去试试看。所以我做了这个(下面的代码)。它不会像它应该的那样工作,我想出了原因。有人可以检查下面的代码并告诉我有什么问题吗?我不想要一个完整的解决方案,只是我应该检查的提示。

#include <iostream>
#include <windows.h>
#include <conio.h>

using namespace std; 

int main()
{
    bool positions[50][50], new_positions[50][50];
    int neighbours=0;

    for(int i=0; i<50; i++) {
        for(int x=0; x<50; x++) positions[i][x]=false;
    }

    for(int i=0; i<50; i++) {
        for(int x=0; x<50; x++) new_positions[i][x]=false;
    }

    //This is some patterns i've put manually into array just for testing, 
    //they should "be alive" at least for 3-4 cycles    
    positions[5][5]=true;
    positions[5][6]=true;
    positions[5][7]=true;
    positions[6][5]=true;
    positions[5][8]=true;
    positions[5][9]=true;
    positions[5][10]=true;
    positions[5][11]=true;

    positions[5][5]=true;
    positions[6][5]=true;
    positions[7][5]=true;
    positions[5][6]=true;
    positions[8][5]=true;
    positions[5][7]=true;
    positions[6][8]=true;
    positions[7][9]=true;
    positions[8][10]=true;
    positions[9][5]=true;


    positions[11][11]=true;
    positions[11][12]=true;
    positions[12][11]=true;
    positions[12][12]=true;


    while(!(kbhit())) {

        for(int i=0; i<50; i++) {
            for(int x=0; x<50; x++) {
                for(int pozX=x-1, pozI=i-1; pozI<=i+1; pozX++) {
                    //if(pozX!=x && pozI!=i) {      //this "if" doesn't work, don't know why                
                        if(pozX>=0 && pozX<50 && pozI>=0 && pozI<50) {
                            if(positions[pozI][pozX]==true) neighbours++;
                        }
                    //}
                    if(pozX==x+1) {
                        pozX=x-1;
                        pozI++;
                    }
                }
                if(neighbours==1) neighbours=0;//had to use this instead of previously mentioned if
                if(positions[i][x]==true) {
                    if((neighbours>3) || (neighbours<2)) new_positions[i][x]=false;
                }
                if(positions[i][x]==false && neighbours==3) new_positions[i][x]=true;
                neighbours=0;
            }
        }

        for(int i=0; i<50; i++) {
            for(int x=0; x<50; x++) {
                if(new_positions[i][x]==true) cout << "X";
                else cout << " ";
            }
            cout << endl;
        }

        for(int i=0; i<50; i++) {
            for(int x=0; x<50; x++) positions[i][x]=false; //clears all cells
        }

        for(int i=0; i<50; i++) {
            for(int x=0; x<50; x++) positions[i][x]=new_positions[i][x]; //sets cell status from this cycle, I know I could do this in one loop, but it is more clear to me this way
        }

        for(int i=0; i<50; i++) {
            for(int x=0; x<50; x++) new_positions[i][x]=false; //clears this cycle "buffor"
        }   

        Sleep(3000);
        system("cls");
    }
}

1 个答案:

答案 0 :(得分:0)

我如何使用https://www.onlinegdb.com/调试代码 学习使用调试器非常有价值......

我所做的包括:

  • 我删除了kbhit()测试和Sleep()调用和cls,因为我没有使用Windows编译器。如果您使用我的代码,则必须将它们放回去。
  • 我更改了显示电路板的位,给它提供行号,并在空白单元格中显示一些内容,然后我更改了它以避免调用endl为每一行刷新缓冲区。
  • 我改变了邻居的计算方式。我认为你减去1来处理已经完成的额外添加 - 我认为最好只使用if语句来避免首先添加它。这是我的版本:

                int neighbours=0;
                for(int pozI=i-1; pozI<=i+1; pozI++)
                    for(int pozX=x-1; pozX<=x+1; pozX++)
                        if(pozX!=x || pozI!=i) // don't check position[i][x]
                            if(pozX>=0 && pozX<50 && pozI>=0 && pozI<50)
                                if(positions[pozI][pozX]==true)
                                    neighbours++;
    
  • 我改变了新电路板的计算方式。如果它应该保持活力,你就不会将新位置设置为真。这是我的版本:

            // set the new board
            new_positions[i][x]=false;
            if(positions[i][x]==true)
                if(neighbours==2 || neighbours==3)
                    new_positions[i][x]=true; // staying alive
            if(positions[i][x]==false)
                if(neighbours==3)
                    new_positions[i][x]=true; // being born
    

我没有做的包括:

  • 有很多风格问题,是否有所改变是有争议的,取决于你认为最佳实践。像变量名称和拥有全局using namespace std;以及使用C样式数组而不是std :: array这样的东西都是我们可以讨论的但是属于codereview.stackexchange的东西。 com所以我没有改变任何一个。

这是完整的程序:

#include <iostream>
#include <iomanip>

using namespace std; 

int main()
{
    bool positions[50][50], new_positions[50][50];

    // clear the board
    for(int i=0; i<50; i++)
        for(int x=0; x<50; x++)
            positions[i][x]=false;

    //This is some patterns i've put manually into array just for testing, 
    //they should "be alive" at least for 3-4 cycles    
    positions[5][5]=true;
    positions[5][6]=true;
    positions[5][7]=true;
    positions[6][5]=true;
    positions[5][8]=true;
    positions[5][9]=true;
    positions[5][10]=true;
    positions[5][11]=true;

    positions[5][5]=true;
    positions[6][5]=true;
    positions[7][5]=true;
    positions[5][6]=true;
    positions[8][5]=true;
    positions[5][7]=true;
    positions[6][8]=true;
    positions[7][9]=true;
    positions[8][10]=true;
    positions[9][5]=true;

    positions[11][11]=true;
    positions[11][12]=true;
    positions[12][11]=true;
    positions[12][12]=true;

    // print the initial board
    for(int i=0; i<50; i++) {
        cout << setw(4) << i << setw(1) << " ";
        for(int x=0; x<50; x++)
            cout << (positions[i][x]==true?"X":".");
        cout << "\n";
    }
    cout << endl;

    for(int steps=0; steps<15; steps++) {
        for(int i=0; i<50; i++) {
            for(int x=0; x<50; x++) {

                // count the neighbours
                int neighbours=0;
                for(int pozI=i-1; pozI<=i+1; pozI++)
                    for(int pozX=x-1; pozX<=x+1; pozX++)
                        if(pozX!=x || pozI!=i) // don't check position[i][x]
                            if(pozX>=0 && pozX<50 && pozI>=0 && pozI<50)
                                if(positions[pozI][pozX]==true)
                                    neighbours++;

                // set the new board
                new_positions[i][x]=false;
                if(positions[i][x]==true)
                    if(neighbours==2 || neighbours==3)
                        new_positions[i][x]=true; // staying alive
                if(positions[i][x]==false)
                    if(neighbours==3)
                        new_positions[i][x]=true; // being born
            }
        }

        // print the old board and the new one
        for(int i=0; i<50; i++) {
            cout << setw(4) << i << setw(1) << " ";
            for(int x=0; x<50; x++)
                cout << (positions[i][x]==true?"X":".");
            cout << "    ";
            for(int x=0; x<50; x++)
                cout << (new_positions[i][x]==true?"X":".");
            cout << "\n";
        }
        cout << endl;

        // save the generation
        for(int i=0; i<50; i++)
            for(int x=0; x<50; x++)
                positions[i][x]=new_positions[i][x];
    }

    // print the final board
    for(int i=0; i<50; i++) {
        cout << setw(4) << i << setw(1) << " ";
        for(int x=0; x<50; x++)
            cout << (positions[i][x]==true?"X":".");
        cout << "\n";
    }
    cout << endl;

    return 0;
}