编写康威生命游戏时相同逻辑其他位置正常某行报TypeError是什么原因?
错误根因
你对坐标变量的赋值逻辑完全错误,直接导致了类型报错:
- 外层循环
for i in origin中,i是origin的每一行列表本身,不是行号(x坐标),你将i直接赋值给x后,x为列表类型,执行x-1运算时自然会触发「列表与整数不能做减法」的TypeError - 内层循环
for j in i中,j是行内存储的单元格值(0或1),不是列号(y坐标),赋值给y也完全不符合坐标计算的预期
其他逻辑问题
c = origin属于浅拷贝,修改c时会同步改动原矩阵origin,而生命游戏的迭代需要基于上一帧的完整状态计算,不能直接修改原状态,应该新建矩阵存储新一帧的状态,或对origin做深拷贝后再赋值给c- 右上角判断逻辑错误:
elif x == c[-1][-1]完全不符合坐标规则,右上角的x坐标应为0,y坐标应为len(c[0])-1 - 邻居统计代码存在笔误:
if c[x+1][y] == y应改为if c[x+1][y] == 1 - 代码缩进混乱,
elif y == 0无对应的外层if,整体循环结构不完整 - 缺少越界判断,计算边缘单元格的邻居时容易触发索引越界报错
修复参考
首先调整坐标获取逻辑,用enumerate同时获取索引和值:
while current_cycle < (x_cycle + 1): # 新建空矩阵存储新一帧状态 new_c = [[0 for _ in range(len(c[0]))] for _ in range(len(c))] # 遍历行,x为行号,row为当前行数据 for x, row in enumerate(c): # 遍历列,y为列号,cell为当前单元格值 for y, cell in enumerate(row): count = 0 # 定义8个邻居的方向偏移量,简化分支判断 directions = [(-1,-1), (-1,0), (-1,1), (0,-1), (0,1), (1,-1), (1,0), (1,1)] for dx, dy in directions: nx = x + dx ny = y + dy # 坐标合法再统计 if 0 <= nx < len(c) and 0 <= ny < len(c[0]): if c[nx][ny] == 1: count += 1 # 后续按生命游戏规则更新new_c[x][y]即可 if cell == 1: new_c[x][y] = 1 if count in (2,3) else 0 else: new_c[x][y] = 1 if count == 3 else 0 # 替换为新一帧状态 c = new_c current_cycle += 1
内容的提问来源于stack exchange,提问作者Mr-Nightmare
相关产品推荐
相关产品推荐

