我是一名具有Python基础知识的物理系学生,我一直在努力寻找一个解决这个问题的简单方法,但我只是在圈子里跑来跑去。我正在编写一个名为“生命的游戏”(WikiPage)的程序。规则很简单:
游戏由生活在二维网格上的所谓细胞组成。这些细胞循环进化。死亡和活细胞的初始模式是第一代。第二代从同时应用一些简单规则到所有细胞发展。规则是:
如果细胞没有足够的公司(邻近的细胞少于2个),细胞会死亡
如果有4个或更多相邻的细胞,细胞会死于人口过剩。
如果(确切地)有3个细胞相邻,则死细胞会重生。
这是作业的一部分,但我不是在寻找一种勺子喂养的解决方案。我们需要使用numpy和数组。
我的方法是生成一个数组board
,其初始提要为随机1和0。然后,在一个函数中,我创建另一个数组,其中一行和一列大于board
,这将存储新值,然后将其反馈。我在元素i
和j
上迭代(我知道它不是pythonic迭代数组,所以我愿意接受建议和替代)并且得到一个总和(np.sum
)子阵列nBlock[i-1:i+1,j-1:j+1]
。如果总和大于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
条件有些东西不允许我操作数组中的数据。
赞赏任何和所有帮助:)
答案 0 :(得分:0)
错误强>:
您的主要错误出现在 checkAlive 的界面逻辑中。你没有日程参数;当你找到一个活细胞时,你会返回共同体棋盘,游戏会立即分配给它的参数棋盘。
播放中的主板是一个本地变量:更改此选项不会更改您初始化的全局主板。相反,由于 checkAlive 没有局部变量,它返回的是全局变量 board ,它在程序中的任何位置都不会更改。
<强>解决方案强>:
由于 checkAlive 不会改变电路板,因此请勿将其退回。相反,返回一个简单的布尔值。如果需要,播放可以检查并终止该程序。
同时强>
您的细胞健康算法在几个方面都是错误的。走过逻辑并修复。最值得注意的是,您使用值4来让细胞存活;这是非常不正确的。 2个邻居让小区处于当前状态; 3个邻居让这个细胞活着;任何其他号码都会杀死它。
您当前的逻辑包括计数中的单元格本身。这不区分具有3个朋友的活细胞和具有4个死细胞的活细胞。结果,您正在创建一些细胞,并且您正在杀死活细胞(与2个朋友一起活细胞)。