我是一名物理专业的学生,对Python有着非常基本的了解,我一直在试图寻找一个简单的解决这个问题的方法,但我只是在兜圈子。我正在为一个名为“生命的游戏”(WikiPage)的节目写我自己的表演。这些规则很简单:
游戏由所谓的细胞组成,这些细胞生活在二维网格上。这些细胞是以周期方式进化的。死亡细胞和活细胞的最初模式是第一代。第二代是从一些简单的规则同时应用于所有细胞。这些规则是: 细胞如果没有足够的陪伴就会死亡(邻接的细胞不足2个) 如果周围有4个或4个以上的细胞,细胞就会因人口过多而死亡。 如果(确切地)有3个细胞相邻,一个死细胞就会再生。
这是一个任务的一部分,但我不是在寻找一个汤匙喂养的解决方案。我们需要使用numpy和数组。
我的方法是生成一个具有随机1和0的初始提要的数组board,然后,在一个函数中,我创建另一个数组,它的一行和一列大于board,它将存储新值,然后反馈给它。我在元素i和j上迭代(我知道在数组上迭代不是pythonic,所以我对建议和替代方案很开放),并对子数组nBlock[i-1:i+1,j-1:j+1]进行和(np.sum)。如果和大于4或小于4,则元素nBlock[np.array([i,j])]变为零(单元格死亡),否则为1(单元生命,或再生)。
问题是,这不管用。守则如下:
import numpy as np
import matplotlib.pyplot as plot
import time as t
%matplotlib inline
def printBoard(board):
im = plot.imshow(board, cmap='Greys', interpolation='none')
plot.show()
plot.close()
def initializeBoard():
board = np.random.randint(2, size=(100, 100))
return board
board = initializeBoard()
printBoard(board)
def checkAlive():
if 1 not in board:
print("All cells are dead! Life is over!")
return 0
else:
return board
def calculateNeighbours(board):
nBlock = np.zeros((102, 102))
nBlock[1:101, 1:101] = board
for i in range(1, 100):
for j in range(1, 100):
checksum = np.sum(nBlock[i-1:i+2, j-1:j+2])
nBlock[:,0] = 0
nBlock[0,:] = 0
if checksum == 4:
nBlock[np.array([i,j])] = 1
elif checksum > 4 or checksum < 4:
nBlock[np.array([i,j])] = 0
return nBlock
def play(board):
for i in range(1, 10):
neighbours = calculateNeighbours(board)
board = neighbours[1:101, 1:101]
board = checkAlive()
printBoard(board)
play(board)数组board不会被修改。它返回相同的board。
我注意到的另一件奇怪的事情是,如果删除for循环中的条件,数组就会被成功地修改。例如,
for i in range(0, 100):
for j in range(0, 100):
board[np.array([i,j])] = 1给出一个矩阵,它将所有元素都更改为1。因此,关于if...else条件,它不允许我操作数组中的数据。
如有任何及所有的帮助,将不胜感激:)
发布于 2016-11-08 19:28:04
误差
您的主要错误在checkAlive的接口逻辑中。该例程没有参数;当您找到一个活动单元时,您将返回共生板,play会立即分配给它的参数board。
play中的play是一个局部变量:更改它不会改变您初始化的全局板。相反,由于checkAlive没有局部变量,所以它返回的是程序中任何地方的全局变量board,它从未更改过。
溶液
由于checkAlive不改变董事会,所以不要返回。相反,返回一个简单的布尔值。如果需要的话,play可以检查并终止程序。
还:
你的细胞健康算法在几个方面是错误的。通过逻辑和修复。最值得注意的是,您使用一个值4来让一个单元格存活;这是非常不正确的。两个邻居使细胞处于当前状态;三个邻居使细胞存活;任何其他数目都会杀死它。
当前逻辑将单元格本身包含在计数中。这不能区分一个有3个朋友的活细胞和一个有4个朋友的死细胞。结果,你不正确地创建了一些细胞,并且你正在杀死活的细胞(与2个朋友一起活的细胞)。
https://stackoverflow.com/questions/40493867
复制相似问题