【问题标题】:C++ Game of Life, difficulty reproducing next generationsC++ 生命游戏,难以复制下一代
【发布时间】:2022-01-16 00:40:08
【问题描述】:

目前尝试创建生命游戏,它输出所有世代(6)并接受用户输入(或者如果选择自动执行),但初始人口之后的下一代不会随着游戏的更新而更新生活规则,但与初始人口保持一致:

规则:

  1. 任何活细胞少于两个活的邻居都会死亡,就像人口不足一样。
  2. 任何有两三个活邻居的活细胞都可以传给下一代。
  3. 任何有超过三个活邻居的活细胞都会死亡,就像人口过剩一样。
  4. 任何只有三个活邻居的死细胞都会变成活细胞,就像通过繁殖一样。

如果能帮助您解决这个错误,我们将不胜感激!

// Produce the next generation
void reproduce(int grid[][m]){
    int newGrid[n][m];
    
    for (int i=0; i<n; i++) {
        for (int j=0; j<m; j++) {
            newGrid[i][j] = grid[i][j]; // Copying old grid to a new grid
        }
    }
    
    // Applying rules for next generation
    for (int i=0; i<n; i++) {
        for (int j=0; j<m; j++) {
            int cellNeighbours = countNeighbours(grid, i, j);
            
            // Live cell rules
            if (cellNeighbours < 2 && grid[i][j] == 1) {
                newGrid[i][j] == 0;
            }
            if (cellNeighbours > 3 && grid[i][j] == 1) {
                newGrid[i][j] == 0;
            }
            if (cellNeighbours == 2 && grid[i][j] == 1) {
                newGrid[i][j] == 1;
            }
            if (cellNeighbours == 3 && grid[i][j] == 1) {
                newGrid[i][j] == 1;
            }
            
            // Dead cell rules
            if (cellNeighbours == 3 && grid[i][j] == 0) {
                newGrid[i][j] == 1;
            }
        }
    }
}

【问题讨论】:

  • reproduce 中,您似乎在计算后忘记将grid 设置为newGrid

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


【解决方案1】:

正如用户@cigien 在他们的评论中指出的那样,您需要在reproduce 函数中从newGrid 更新grid,此外newGrid 中的值没有分配,而是进行了相等性测试。

reproduce 函数中将newGrid 更新从== 更改为= 并添加

    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        grid[i][j] = newGrid[i][j];
      }
    }

reproduce 函数的末尾

【讨论】:

    【解决方案2】:

    如果你像这样使用 STL,你可以移动你在最后创建的临时数组而不是复制。

    using Grid = std::array<std::array<int, RowNum>,ColNum>
    // using Grid = std::vector<std::vector<int>> // non fixed size grid
    // ...
    Grid newGrid;
    // ... (copy from grid)
    // ... (do stuff with newGrid, grid remains unchanged)
    grid = std::move(newGrid); // move temporary newGrid to grid, should be faster
                               // than copying back
    

    当然有办法完全避免第一次复制,但优化不是问题的主题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 2017-07-08
      • 2019-02-05
      • 2014-04-30
      • 2016-04-05
      • 2023-03-09
      • 2016-11-15
      相关资源
      最近更新 更多