所以我正在用 Python 实现康威的生命游戏,并且我已经编写了大部分代码。大多数情况下它是有效的;当我运行它时,会出现面板并且单元格是随机的,但有一个问题。我有一个循环来检查板上每个单元周围的 8 个单元的状态,但程序在第一次检查时完全停止(左上角的单元),因为 8 个单元中有 5 个是在网格之外。我不知道如何限制这一点,或者让它只检查网格内的单元格。有谁知道我该如何解决这个问题?
我的看板按列(高度)和列数(宽度)组织。所有这些都组织在名为 currentCells 和 nextCells 的列表列表中。
这是我检查每个单元格中活着的邻居的代码:
LivingNeighbors = 0 #set to zero so it can change based on the conditions
for x in range( WIDTH ):
for y in range( HEIGHT ):
# Count number of living neighbors:
aboveLeft = currentCells[x - 1] [y - 1]
above = currentCells[x] [y - 1]
aboveRight = currentCells[x + 1] [y - 1]
left = currentCells[x - 1] [y]
right = currentCells[x + 1] [y]
bottomLeft = currentCells[x - 1] [y + 1]
bottom = currentCells[x] [y + 1]
bottomRight = currentCells[x + 1] [y + 1]
if aboveLeft == '#':
LivingNeighbors += 1
if above == '#':
LivingNeighbors += 1
if aboveRight == '#':
LivingNeighbors += 1
if left == '#':
LivingNeighbors += 1
if right == '#':
LivingNeighbors += 1
if bottomLeft == '#':
LivingNeighbors += 1
if bottom == '#':
LivingNeighbors += 1
if bottomRight == '#':
LivingNeighbors += 1
在尝试访问相邻小区之前检查是否存在。
# check if this cell has an "above left" neighbor
if x-1 >= 0 and y-1 >= 0:
# yes it does
if currentCells[x - 1] [y - 1] == '#':
LivingNeighbors += 1
如果您愿意,您可以将所有检查合并到一份声明中:
if x-1 >= 0 and y-1 >= 0 and currentCells[x-1][y-1] == '#':
在尝试访问邻居之前,您可以使用逻辑运算符检查您是否在范围内。
aboveLeft = x > 0 and y > 0 and currentCells[x - 1] [y - 1]
above = y > 0 and currentCells[x] [y - 1]
aboveRight = x < len(currentCells)-1 and y > 0 and currentCells[x + 1] [y - 1]
对于所有其余变量也类似。
更好的是使用循环而不是 8 个不同的变量。
for dx in (-1, 0, 1):
for dy in (-1, 0, 1):
if not (dx == 0 and dy == 0): # don't count the cell itself
new_x = x + dx
new_y = y + dy
if 0 < new_x < len(currentCells) and 0 < new_y < len(currentCells[x]): # check if neighbor is in range
livingNeighbors += currentCells[new_x][new_y] == '#'
任何时候你发现自己有这样的重复代码段,有一个更好的方法:
for x in range( WIDTH ):
for y in range( HEIGHT ):
# Discount the center cell.
neighbors = -1
for dx in (-1,0,1):
for dy in (-1,0,1):
if x+dx in range(WIDTH) and \
y+dy in range(HEIGHT) and \
currentCells[x+dx][y+dy] == '#':
neighbors += 1
这里可能并不重要,但您通常会发现将 Y 坐标放在数组中更方便。这样
currentCells[3]
指的是整行,更直观。事实上,这样,您可以通过执行以下操作来打印网格:
for row in currentCells:
print(' '.join(row))