首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++生命游戏,难以繁衍后代

C++生命游戏,难以繁衍后代
EN

Stack Overflow用户
提问于 2021-12-11 22:14:06
回答 2查看 220关注 0票数 1

当前试图创建生命游戏,它输出所有的代(6)并接受用户的输入(或者如果选择自动的话),但是在初始人口之后的下一代并不是按照生命规则的游戏更新,而是保持与初始人口相同的状态:

规则:

任何一个活细胞如果活的邻居少于两个,就会死掉,就像由underpopulation.

  • Any活细胞和两个或三个活的邻居一起活到下一个generation.

  • Any活细胞,有三个以上的活邻居死亡,就像被overpopulation.

  • Any死掉的细胞和三个活的邻居一样,变成一个活细胞,就像通过繁殖一样。--

任何帮助纠正这一错误将不胜感激!

代码语言:javascript
复制
// 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;
            }
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2021-12-11 22:54:49

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

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

代码语言:javascript
复制
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        grid[i][j] = newGrid[i][j];
      }
    }

reproduce函数的末尾

票数 1
EN

Stack Overflow用户

发布于 2021-12-11 23:27:18

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

代码语言:javascript
复制
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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70319451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档