繁体   English   中英

有人可以帮助修复Conway的人生游戏

[英]Can someone help fix Conway's Game of Life

我正在使用Python 3.6。 我对google和堆栈溢出有一个快速的了解,但是我还没有看到我的问题。 问题是我的函数应该找到活动邻居的数量,但返回错误的值(但仅在某些情况下)。

这是代码:

def neighbourCount(i, j):
    neighbours = 0

    try:
        if grid[i-1][j-1] == "1":
            neighbours += 1
    except:
        pass

    try:
        if grid[i-1][j] == "1":
            neighbours += 1
    except:
        pass

    try:
        if grid[i-1][j+1] == "1":
            neighbours +=1
    except:
        pass

    try:
        if grid[i][j-1] == "1":
            neighbours += 1
    except:
        pass

    try:
        if grid[i][j+1] == "1":
            neighbours += 1
    except:
        pass

    try:
        if grid[i+1][j-1] == "1":
            neighbours += 1
    except:
        pass

    try:
        if grid[i+1][j] == "1":
            neighbours += 1
    except:
        pass

    try:
        if grid[i+1][j+1] == "1":
            neighbours +=1
    except:
        pass

    return(neighbours)



grid = [
    ["0","0","0","0","0","0","0","0","0","0"],
    ["0","0","1","0","0","0","0","0","0","0"],
    ["0","0","1","0","0","0","0","0","0","0"],
    ["0","0","1","0","0","0","0","0","0","0"],
    ["0","0","0","0","0","0","0","0","0","0"],
    ["0","0","0","0","0","0","0","0","0","0"],
    ["0","0","0","0","0","0","0","0","0","0"],
    ["0","0","0","0","0","0","0","0","0","0"],
    ["0","0","0","0","0","0","0","0","0","0"],
    ["0","0","0","0","0","0","0","0","0","0"]
    ]

newGrid = [
    ["0","0","0","0","0","0","0","0","0","0"],
    ["0","0","0","0","0","0","0","0","0","0"],
    ["0","0","0","0","0","0","0","0","0","0"],
    ["0","0","0","0","0","0","0","0","0","0"],
    ["0","0","0","0","0","0","0","0","0","0"],
    ["0","0","0","0","0","0","0","0","0","0"],
    ["0","0","0","0","0","0","0","0","0","0"],
    ["0","0","0","0","0","0","0","0","0","0"],
    ["0","0","0","0","0","0","0","0","0","0"],
    ["0","0","0","0","0","0","0","0","0","0"]
    ]


game = 1
while game == 1:

    for i in range(0,10):
        print(*grid[i], sep='  ')

    numNeigh = []

    for i in range(0,10):
        row = []
        for j in range(0,10):
            neighbours = neighbourCount(i, j)
            if grid[i][j] == "1" and ( neighbours>1 and neighbours<4 ):
                newGrid[i][j] = "1"
            if grid[i][j] == "1" and ( neighbours<2 or neighbours>3 ):
                newGrid[i][j] = "0"
            if grid[i][j] == "0" and neighbours == 3:
                newGrid[i][j] = "1"
            row.append(neighbours)

        numNeigh.append(row)

    for i in numNeigh:
        print(i)
    for i in newGrid:
        print(i)

    print("\n\n")

    grid = newGrid

    input()

这是输出(第一个块:网格数组)(第二个块:每个单元格具有的邻居)(第三个块:newGrid数组):

0  0  0  0  0  0  0  0  0  0 
0  0  0  0  0  0  0  0  0  0
0  1  1  1  0  0  0  0  0  0
0  0  0  0  0  0  0  0  0  0
0  0  0  0  0  0  0  0  0  0
0  0  0  0  0  0  0  0  0  0
0  0  0  0  0  0  0  0  0  0
0  0  0  0  0  0  0  0  0  0
0  0  0  0  0  0  0  0  0  0
0  0  0  0  0  0  0  0  0  0
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 2, 3, 3, 2, 0, 0, 0, 0, 0]
[1, 2, 4, 2, 2, 0, 0, 0, 0, 0]
[1, 1, 2, 1, 1, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0']
['0', '0', '1', '1', '0', '0', '0', '0', '0', '0']
['0', '1', '0', '1', '0', '0', '0', '0', '0', '0']
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0']
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0']
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0']
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0']
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0']
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0']
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0']

(上面的注意:我还有一个2D数组,用于“ newGrid”,它与“ grid”相同,但只有“ 0”)

中间的块显示每个位置所拥有的邻居数量,但不是在第三行向下显示“ 1、1、2、1、1、0、0 ....”,而是显示“ 1,2,4” ,2,2,0,0 ...“

您的问题可能出在创建newGrid 除非您正确创建grid的副本(深层副本),否则元素将指向相同的列表(浅层副本)。 因此,当您更改newGridgrid也将被更改。 要正确创建网格副本,请从以下位置更改newGrid行:

newGrid = grid.copy()

至:

newGrid = [x[:] for x in grid]


注意:使用numpy会自动在调用numpy数组的copy方法时创建适当的深层副本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM