arrays - 康威在 C 语言中使用 malloc 数组进行的生命游戏

标签 arrays c

我正在使用 malloc 数组作为 0 和 1 的网格来实现康威的生命游戏,任何带有 0 的地方我都会打印代表“死”单元格的白色背景空间和任何地方使用 1 我打印一个代表“事件”单元格的黑色背景空间。

我在每个周期更新单元格时遇到一些问题。我的方法是使用 getState() 函数,该函数仅检查网格条目是 0 还是 1,然后相应地返回一个值。我还有一个 countN() 函数,它会遍历网格并计算数字 - 考虑角点、边缘和中心情况。我已经用几个例子彻底测试了它们,它们按照我期望的方式工作,对于给定的网格坐标,它总是返回正确的状态和存活邻居的数量。

这就是我尝试做的(伪代码):

void updateGrid(int **grid, int r, int c) {
    copyGrid = grid;
    for (i = 0; i < r; i++) 
        for (j = 0; j < c; j++) {
            alive->getState(grid, i, j) 
            neighbours->countN(grid, i, j)
          
            if (alive) {
                if (neighbour < 2 || neigbour > 3) 
                    copyGrid[i][j] = 0;
                else 
                    copyGrid[i][j] = 1;
            } else {
                if (neighbour == 3) 
                    copyGrid[i][j] = 1;
                else 
                    copyGrid[i][j] = 0; 
            }
        }
    grid = copyGrid; 
    printGrid(grid, r, c)
}

有一个简单的调用函数,它只是从输入文件生成一个初始网格,清除屏幕,然后调用 updateGrid() 并在每个周期后休眠,直到一定数量的周期。初始网格是我期望的样子,邻居和事件函数返回正确的值,但网格更新不正确,并且输出相当扭曲。

例如,使用 1 和 0:

Input:    Expected Output:     Actual Output
0 0 0     0 1 0                0 1 1 
1 1 1     0 1 0                1 0 1 
0 0 0     0 1 0                0 0 0 

任何提示将不胜感激!

最佳答案

将网格副本复制回grid的方法不起作用:copyGrid = grid;grid = copyGrid;不起作用不这样做,第一个会覆盖全局指针copyGrid,这会导致更新的单元格被写入原始网格,第二个不执行任何操作,因为两个指针已经指向同一区域。

您必须删除 copyGrid = grid; 语句。所有更新的单元格都会被计算并存储到copyGrid中,因此无需复制原始单元格。一旦计算出新的一代,您必须将其复制回原始网格:假设复制网格具有与网格相同的几何形状,即一个数组如果 r 指针指向 c 整型数组,则必须使用循环来复制此间接二维数组。

另一种方法是使用 2 个全局数组,并在计算每个新代后交换指针。

这是修改后的版本:

int **copyGrid;  // assuming this pointer points to an allocated grid

void updateGrid(int **grid, int r, int c) {
    // compute the new grid value in copyGrid
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            int alive = getState(grid, i, j); 
            int neighbours = countN(grid, i, j);
            if (alive) {
                if (neighbours < 2 || neighbours > 3) 
                    copyGrid[i][j] = 0;
                else 
                    copyGrid[i][j] = 1;
            } else {
                if (neighbour == 3) 
                    copyGrid[i][j] = 1;
                else 
                    copyGrid[i][j] = 0; 
            }
        }
    }
    // copy the new grid value from copyGrid back to grid
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            grid[i][j] = copyGrid[i][j];
        }
    }
    printGrid(grid, r, c);
}

关于arrays - 康威在 C 语言中使用 malloc 数组进行的生命游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72587288/

相关文章:

java - 删除数组中的 Null 元素

javascript - map() 不保存新元素

javascript - 重新格式化数组以实现 jquery 自动完成

c - 什么时候返回 EINTR 错误?

arrays - 在给定的排列中找到缺失的元素

c - C中如何让用户指定多维数组的大小

c - 每次运行程序时 strtok() 的输出都会给出不同的行为

c - 如何组合c中的字母?

c - 我需要一个像素完美的三角形填充算法来避免锯齿现象

c - 功能困难 - C