在我的代码中,我做了两次同样的事情,但它只是第一次工作。
for y, row in enumerate(matrix):
for x, color in enumerate(row):
if matrix[y][x] == 1:
som = (matrix[y-1][x-1] + matrix[y-1][x] + matrix[y-1][x+1] + matrix[y][x-1] + matrix[y][x+1] + matrix[y+1][x-1] + matrix[y+1][x] + matrix[y+1][x+1])
if som == (2 or 3):
matrix[y][x] = 1
else:
matrix[y][x] = 0
pygame.display.update()
time.sleep(1)
else:
#here somewhere it goes wrong
som = (matrix[y-1][x-1] + matrix[y-1][x] + matrix[y-1][x+1] + matrix[y][x-1] + matrix[y][x+1] + matrix[y+1][x-1] + matrix[y+1][x] + matrix[y+1][x+1])
if som == 3:
matrix[y][x] = 1
else:
matrix[y][x] = 0
当我在没有第二个的情况下尝试这个代码时,它工作得很完美。现在它给出了一个错误:IndexError: list index out of range
。
此外,我希望循环仅在1秒后重复。当我打印som
时,我可以看到它只在一秒钟之后重复,但在游戏的显示屏上,没有任何变化,直到突然十一个变为0。
如何更改此设置,以便每隔一秒后显示更新?
答案 0 :(得分:1)
如果使用enumerate
循环序列,则根据定义,有效索引为[0]
到[x]
。因此,当您索引[x+1]
时,您将索引越界。
同样,当x == 0
您的索引[x-1]
为[-1]
时,它将为您的序列的返回编制索引,我怀疑您是什么'期待。
答案 1 :(得分:0)
您的问题是,如果您位于矩阵的第一行,则您尝试访问其上方的行(y-1
),该行不存在。当您在最后一行并访问y+1
时,同样适用于x
轴。
当您访问索引y-1
而y
为0
时,它不会抛出异常,但它实际上会从列表末尾为您提供值。当列表中不存在索引时抛出异常。
我对您的代码进行了很多更改以减少重复。理解正在发生的事情应该要容易得多,而且我还在评论中实施了检查以停止IndexError
和@ForceBru提到的条件。
我已经假设如果索引不存在,则将值默认为0.
for y,row in enumerate(matrix):
for x,color in enumerate(row):
center = matrix[y][x]
top = matrix[y-1][x] if y > 0 else 0
top_right = matrix[y-1][x+1] if y > 0 and x < len(row)-1 else 0
right = matrix[y][x+1] if x < len(row)-1 else 0
bottom_right = matrix[y+1][x+1] if y < len(matrix)-1 and x < len(row)-1 else 0
bottom = matrix[y+1][x] if y < len(matrix)-1 else 0
bottom_left = matrix[y+1][x-1] if y < len(matrix)-1 and x > 0 else 0
left = matrix[y][x-1] if x > 0 else 0
top_left = matrix[y-1][x-1] if y > 0 and x > 0 else 0
surround_sum = (top_left + top + top_right + left + right + bottom_left + bottom + bottom_right)
if center == 1:
if surround_sum == 2 or surround_sum == 3:
matrix[y][x] = 1
else:
center = 0
pygame.display.update()
time.sleep(1)
else:
#here somewhere it goes wrong
if surround_sum == 3:
matrix[y][x] = 1
else:
matrix[y][x] = 0