c++ - 为什么第三板有错误?

标签 c++ conways-game-of-life

<分区>

我假设每个人都听说过这款游戏,但如果没有 - 这里有一个链接: https://bitstorm.org/gameoflife/

我试图在不使用结构、类等的情况下用 C++ 实现它。

到目前为止,我已经这样做了:

#define N 10
#define M 10
#include <iostream>


bool** createGrid(int n, int m)
{
    bool** grid = new bool*[n];
    for (int i = 0; i < n; i++)
        grid[i] = new bool[m];
    return grid;
}


void displayGrid(bool** grid, int n, int m)
{
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (grid[i][j] == 1)
                std::cout << 'X';
            else
                std::cout << '.';
        }
        std::cout << std::endl;
    }
    std::cout << "##########\n";
}


void releaseGrid(bool** grid, int n)
{
    for (int i = 0; i < n; i++)
        delete[] grid[i];
    delete[] grid;
}


int countAliveNeighbours(bool** grid, int k, int l)
{
    int aliveNeighbours = 0;
    for (int i = -1; i <= 1; i++)
        for (int j = -1; j <= 1; j++)
            aliveNeighbours += grid[k + i][l + j];
    // The cell needs to be subtracted from it's neighbours as it was counted before
    aliveNeighbours -= grid[k][l];
    return aliveNeighbours;
}


bool** nextGeneration(bool** grid, int n, int m)
{
    bool** next = createGrid(n, m);

    // Loop through every cell
    for (int k = 1; k < n - 1; k++) {
        for (int l = 1; l < m - 1; l++) {
            // finding count of neighbours that are alive
            int aliveNeighbours = countAliveNeighbours(grid, k, l);

            // Implementing the Rules of Life

            // Cell is lonely and dies
            if ((grid[k][l] == 1) && (aliveNeighbours < 2))
                next[k][l] = 0;

            // Cell dies due to over population
            else if ((grid[k][l] == 1) && (aliveNeighbours > 3))
                next[k][l] = 0;

            // A new cell is born
            else if ((grid[k][l] == 0) && (aliveNeighbours == 3))
                next[k][l] = 1;

            // Remains the same
            else
                next[k][l] = grid[k][l];
        }
    }
    return next;
}


bool checksTwoGridsForDifferences(bool** prevGrid, bool** nextGrid, int n, int m)
{
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (prevGrid[i][j] != nextGrid[i][j]) {
                return true;
            }
        }
    }
    return false;
}


void fillGrid(bool** grid, int n, int m)
{
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            grid[i][j] = 0;
        }
    }
    grid[1][3] = 1;
    grid[1][4] = 1;
    grid[2][4] = 1;
    grid[5][3] = 1;
    grid[5][4] = 1;
    grid[6][2] = 1;
    grid[6][3] = 1;
    grid[7][5] = 1;
    grid[8][4] = 1;
}


int main()
{
    bool** prevGrid = createGrid(N, M); // create starting grid
    fillGrid(prevGrid, N, M); // fill starting grid
    std::cout << "Starting grid:\n";
    displayGrid(prevGrid, N, M); // display starting grid

    bool** nextGrid = nextGeneration(prevGrid, N, M); //generate next grid
    while (checksTwoGridsForDifferences(prevGrid, nextGrid, N, M)) {
        displayGrid(nextGrid, N, M);
        releaseGrid(prevGrid, N);
        prevGrid = nextGrid;
        nextGrid = nextGeneration(prevGrid, N, M);
    }

    releaseGrid(nextGrid, N);
    releaseGrid(prevGrid, N);
    return 0;
}

但我卡住了,因为第三个网格不正确(它错误地删除了两个 X),我想知道为什么?任何人都可以告诉我错误吗?

显示:

..........
..........
...XX.....
..........
...X......
..X.X.....
..........
..XXX.....
..........
..........

代替:

..........
...XX.....
...XX.....
..........
...X......
..X.X.....
..........
..XXX.....
..........
..........

最佳答案

问题是您没有填充下一代网格的边缘。 nextGeneration 中的注释 //Loop through every cell 是不正确的,因为您跳过了网格的边缘。

您需要在 countAliveNeighbours 函数中更加努力,这样您就不会越过网格的边缘,然后更改您的 nextGeneration 函数,这样您确实循环遍历每个单元格。或者您可以永久关闭网格的边缘。

我使用调试器在大约两分钟内发现了这个问题。我看代码是看不出来的。您真的应该自学如何使用调试器。作为程序员,这是您在工作效率方面取得的最大进步。

顺便提一下问题,足够的信息可以轻松解决问题。

关于c++ - 为什么第三板有错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57345211/

相关文章:

c++ - 这些辅助文件应该在 Git 版本控制之下吗?

c++ - 复制构造函数和模板构造函数之间的冲突

c# - 程序占用太多内存

javascript - 康威的生命游戏规则

C++:使用单个 get 函数返回与对象相关的变量

将 Eigen::VectorXd 转换为 Eigen::MatrixXd 的 C++ lambda 函数

c++ - 我应该使用什么作为 C++ 中的缓冲区来从网络套接字接收数据?

java - 临时数组

javascript - setTimeout阻塞问题

java - 生活游戏中的蟾蜍图案