C++实现康威生命游戏算法异常,垂直活细胞条无法正确转换为水平条
康威生命游戏代码错误修正
你的代码问题完全出在邻居细胞计数逻辑部分,具体错误和修正方案如下:
错误点梳理
- 遍历范围错误:现有代码仅遍历当前单元格右下角2×2区域,最多只能统计3个相邻细胞,不符合生命游戏要求统计周围8个方向所有邻居的规则。
- 自身排除逻辑错误:
if (i != 0 and j!= 0)的判断和排除当前单元格没有任何关联,仅过滤了i=0或j=0的行/列的计数,完全不符合逻辑。 - 无边界校验:遍历邻居时没有判断坐标是否落在
world数组的合法范围内,会出现下标越界,读取到无效内存值干扰计数结果。
修正后的代码
void new_generation() { for (int i=0; i<worldHeight; i++){ for (int j=0; j<WorldWidth; j++) { int count = 0; // 遍历8个方向的邻居 for (int dy = -1; dy <= 1; dy++) { for (int dx = -1; dx <= 1; dx++) { // 跳过当前单元格自身 if (dy == 0 && dx == 0) continue; // 计算邻居坐标 int ny = i + dy; int nx = j + dx; // 校验坐标合法性 if (ny >=0 && ny < worldHeight && nx >=0 && nx < WorldWidth) { if (world[ny][nx]) count++; } } } // 生命游戏规则更新 if (world[i][j]) { new_world[i][j] = (count == 2 || count ==3); } else { new_world[i][j] = (count ==3); } } } // 同步到当前世界 for (int i=0; i<worldHeight; i++){ for (int j=0; j<WorldWidth; j++) { world[i][j] = new_world[i][j]; } } }
修正后你测试的垂直三格闪烁子就可以正常翻转为水平排列,符合生命游戏规则。
内容的提问来源于stack exchange,提问作者Weegloogi
相关产品推荐
相关产品推荐

