当前试图创建生命游戏,它输出所有的代(6)并接受用户的输入(或者如果选择自动的话),但是在初始人口之后的下一代并不是按照生命规则的游戏更新,而是保持与初始人口相同的状态:
规则:
任何一个活细胞如果活的邻居少于两个,就会死掉,就像由underpopulation.
任何帮助纠正这一错误将不胜感激!
// 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;
}
}
}
}发布于 2021-12-11 22:54:49
用户@cigien在他们的评论中指出,您需要在grid函数中从newGrid中更新reproduce,此外,newGrid中的值没有分配,而是测试是否相等。
将newGrid更新从==更改为reproduce函数中的=并添加
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
grid[i][j] = newGrid[i][j];
}
}在reproduce函数的末尾
发布于 2021-12-11 23:27:18
如果像这样使用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当然,有一些方法可以完全避免第一次复制,但是优化不是问题的主题
https://stackoverflow.com/questions/70319451
复制相似问题