有没有办法阻止程序检查列表范围之外的值?

问题描述 投票:0回答:3

所以我正在用 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
python nested-lists conways-game-of-life
3个回答
0
投票

在尝试访问相邻小区之前检查是否存在。

# 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] == '#':

0
投票

在尝试访问邻居之前,您可以使用逻辑运算符检查您是否在范围内。

        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] == '#'

0
投票

任何时候你发现自己有这样的重复代码段,有一个更好的方法:

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))
© www.soinside.com 2019 - 2024. All rights reserved.