0

我的老师给我安排了制作 Python 版本的“生命游戏”的任务,所以在我完成了大部分代码之后。我陷入了我怀疑是一个相当普遍的问题:角落和边缘没有8个邻居。因此,使用以下代码会给我一个超出范围异常的索引:

neighbors = (a[x-1][y-1]+a[x-1][y]+a[x-1][y+1]+a[x][y-1]+a[x][y+1]
             +a[x+1][y-1]+a[x+1][y]+a[x+1][y+1])

因此,我不想使用大量if语句,而是想捕获超出范围的索引并传递值 0。我将如何尝试这样做?

4

3 回答 3

2

使您的实际电路板更宽更长 2 个单元格,用零填充边距,并使用从1to的索引length (or width)-2

于 2015-02-23T16:19:21.703 回答
0

我会编写一个辅助函数,您可以调用它来返回一个值或零(伪代码):

def getValue(x, y)
   if x < 0 or y < 0 or x > xbound or y > ybound:
       return 0
   return a[x][y]

然后你可以getValue用不同的参数调用一堆时间

于 2015-02-23T16:20:24.317 回答
0

我会用一个函数调用来替换你的长表达式,如下所示:

def neighbors(a, x, y):
    total = 0
    for dx, dy in [(-1, -1), (-1, 0), (-1, 1),
                   ( 0, -1),          ( 0, 1),
                   ( 1, -1), ( 1, 0), ( 1, 1)]:
        try:
            total += a[x+dx][y+dy]
        except IndexError:
            pass
    return total

由于只有八个可能的邻居,为了获得最大速度,您可能需要考虑展开上面的循环,以实现以下目的:

def neighbors(a, x, y):
    xm1, xp1, ym1, yp1 = x-1, x+1, y-1, y+1
    total = 0
    try:
        total += a[xm1][ym1]
    except IndexError:
        pass
    try:
        total += a[xm1][y]
    except IndexError:
        pass
    try:
        total += a[xm1][yp1]
    except IndexError:
        pass
    try:
        total += a[x][ym1]
    except IndexError:
        pass
    try:
        total += a[x][yp1]
    except IndexError:
        pass
    try:
        total += a[xp1][ym1]
    except IndexError:
        pass
    try:
        total += a[xp1][y]
    except IndexError:
        pass
    try:
        total += a[xp1][yp1]
    except IndexError:
        pass
    return total

创建一个函数来检查每个位置的每个 x、y的替代方法将需要九次函数调用来计算相同的值(并且每次都评估一个非平凡的条件表达式)。

于 2015-02-23T16:30:49.007 回答