康威生命游戏邻居计数功能异常,C语言代码问题排查求助
代码问题排查与修复方案
你提交的代码共有4处可导致运行错误的问题,具体如下:
1. neighbors函数越界判断逻辑错误
原越界判断存在两个问题:
- 逻辑运算符使用错误:用了
&&(且),只有当行和列同时越界时才会跳过,实际只要行/列任意一个越界就需要跳过访问 - 数组下标范围错误:12长度的数组合法下标为0~11,判断
>12阈值不对,应该是>=12
修复后的neighbors函数越界判断:
// 原错误代码 // if ((l+i < 0 || l+i > 12) && (c+j < 0 || c+j > 12)) // 替换为以下代码 if (l+i < 0 || l+i >= 12 || c+j <0 || c+j >=12) { continue; }
2. 死细胞判断使用赋值运算符而非相等判断
logic函数中判断死细胞的代码写为if (field[i][j] = '-'),单等号是赋值操作,会把field[i][j]强制设为'-',且判断条件永远为真,覆盖之前活细胞的判断结果。
修复方法:
把单等号改为双等号:
if (field[i][j] == '-')
3. 状态更新时机错误
生命游戏需要基于上一代完整的状态计算所有新一代细胞状态,全部计算完成后再统一更新全局field。你当前的代码把field[i][j] = temp[i][j];写在了内层循环中,每计算一个细胞就立刻更新field,导致后续细胞统计邻居时用的是已经修改过的新一代状态,计算结果完全错误。
修复方法:
删除内层循环中的field[i][j] = temp[i][j];,在所有细胞的temp状态计算完成后,单独加一层循环把temp同步到field:
// 原两层循环结束后加以下代码 for (int i = 0; i < 12; i++) { for (int j = 0; j < 12; j++) { field[i][j] = temp[i][j]; } }
4. 活细胞存活规则不符合标准康威生命游戏设定
标准规则中活细胞邻居数小于2就会因孤独死亡,你当前的判断条件是neighbors(i, j) < 1,只有邻居数为0才会死亡,不符合规则。
修复方法:
把判断条件改为:
if (neighbors(i, j) < 2 || neighbors(i, j) > 3)
内容的提问来源于stack exchange,提问作者recursive_microwave
相关产品推荐
相关产品推荐

