康威生命游戏Python3.6实现问题:所有细胞直接全部存活
康威生命游戏代码问题排查与修复
我帮你找出了代码里的几个关键问题,正是这些问题导致所有细胞直接变成1且不会消亡,咱们一个个拆解:
问题1:直接修改原数组,破坏状态计算逻辑
生命游戏的规则要求基于当前完整的一代状态计算下一代,但你在循环里直接修改screen数组,导致后面的细胞计算邻居时,用的是已经被更新过的细胞状态,完全打乱了规则。必须用一个临时数组存储下一代的所有状态,等全部计算完成后再替换原数组。
问题2:赋值用了比较运算符==,而非赋值运算符=
你在两处写了:
screen[x][y] == 0 # 这是判断是否等于0,根本没修改值!
这属于语法错误,导致这些规则(存活细胞邻居不足2或超过3时死亡)完全没生效。
问题3:邻居计算的条件写错了
计算左上角斜向邻居(x-1, y+1)的条件被误写成了if 0 and y != len(screen[x])-1:,这里的0是布尔假,所以这个邻居永远不会被计入,虽然这不是最致命的问题,但会导致规则计算不准确。
问题4:逻辑运算符优先级错误
最后一个条件neighbors == 2 or 3的写法有问题,Python会把它解析成(neighbors ==2) or 3,而3是真值,所以这个条件永远为真。不过其实这个条件可以简化,因为前面已经处理了存活细胞邻居<2或>3的情况,剩下的自然就是邻居为2或3的存活情况,不需要额外判断。
修复后的完整代码
import numpy as np import time # 初始化25x25的网格 screen = np.zeros((25,25), dtype=np.int) # 初始设置细胞状态的阶段 while True: print(screen) command = input('command? ') if command.startswith('x'): # 解析坐标,比如输入x3 y5 parts = command.split() x = int(parts[0][1:]) y = int(parts[1][1:]) # 切换细胞状态 screen[x][y] = 1 - screen[x][y] elif command == 'start': break # 生命游戏主循环 while True: # 创建临时数组存储下一代状态,初始化为全0 next_screen = np.zeros_like(screen) for x in range(screen.shape[0]): for y in range(screen.shape[1]): neighbors = 0 # 计算所有8个方向的邻居数量 # 上 if x > 0: neighbors += screen[x-1][y] # 下 if x < screen.shape[0]-1: neighbors += screen[x+1][y] # 右 if y < screen.shape[1]-1: neighbors += screen[x][y+1] # 左 if y > 0: neighbors += screen[x][y-1] # 右上 if x > 0 and y < screen.shape[1]-1: neighbors += screen[x-1][y+1] # 左上 if x > 0 and y > 0: neighbors += screen[x-1][y-1] # 右下 if x < screen.shape[0]-1 and y < screen.shape[1]-1: neighbors += screen[x+1][y+1] # 左下 if x < screen.shape[0]-1 and y > 0: neighbors += screen[x+1][y-1] # 应用康威生命游戏规则 if screen[x][y] == 0: # 死细胞,3个邻居则复活 if neighbors == 3: next_screen[x][y] = 1 else: # 活细胞,邻居数2或3则存活,否则死亡 if neighbors in (2, 3): next_screen[x][y] = 1 # 否则保持0,不用额外赋值 # 替换为下一代状态 screen = next_screen print(screen) time.sleep(0.1)
内容的提问来源于stack exchange,提问作者Kay Jersch
相关产品推荐
相关产品推荐

