如何利用python实现生命游戏

英国数学家约翰·何顿·康威在1970年发明了 the game of life,今天番茄加速就来分享下如何利用python实现生命游戏,规则如下:如何利用python实现生命游戏

每个细胞有两种状态 - 存活或死亡

每个细胞与以自身为中心的周围八格细胞产生互动

当前细胞为存活状态时,当周围的存活细胞低于2个时(不包含2个),该细胞变成死亡状态。(模拟生命数量稀少)

当前细胞为存活状态时,当周围有2个或3个存活细胞时,该细胞保持原样。

当前细胞为存活状态时,当周围有超过3个存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)

当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。(模拟繁殖)

拿个例子阐述上述状态,如下种子时代:

[0, 0, 1, 0, 0]

[0, 1, 1, 0, 0]

[0, 0, 1, 1, 0]

[0, 1, 1, 1, 0]

[0, 0, 0, 0, 0]

坐标[0,2]为一个存活的细胞,因为周围细胞个数为2,所以繁衍后依然存活;

坐标[1,2]的存活细胞,因为周围有4个存活细胞,所以繁衍后死亡;

坐标[0,1]死亡细胞,因为周围恰好有3个存活细胞,所以[0,1]处出现生命,

繁衍一代后的,完整图如下:

[0, 1, 1, 0, 0]

[0, 1, 0, 0, 0]

[0, 0, 0, 0, 0]

[0, 1, 0, 1, 0]

[0, 0, 1, 0, 0]

第二代:

[0, 1, 1, 0, 0]

[0, 1, 1, 0, 0]

[0, 0, 1, 0, 0]

[0, 0, 1, 0, 0]

[0, 0, 1, 0, 0]

能到第几代结束呢?借用 Python 模拟了生命游戏,整个代码一共 60 行。

首先生成生命网格:

def get_board(size, alive_cons):

return [[1 if (i, j) in alive_cons else 0

for j in range(size)]

for i in range(size)]

获得细胞的邻域:

def get_neighbors(con):

x, y = con

neighbors = [(x + i, y + j)

for i in range(-1, 2)

for j in range(-1, 2)

if not i == j == 0]

return neighbors

判断下一代是否存活:

def is_alive_con(con, alive_cons):

alive_neighbors = calculate_alive_neighbors(con, alive_cons)

if (alive_neighbors == 3 or

(alive_neighbors == 2 and con in alive_cons)):

return True

return False

生成下一代完整的生命网格:

def new_step(alive_cons):

board = itertools.chain(*map(get_neighbors, alive_cons))

new_board = set([con

for con in board

if is_alive_con(con, alive_cons)])

return list(new_board)

以上就是几个核心的函数,下面主函数:

def main():

size = 5

board = [(0, 2), (1, 1), (1, 2), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]

print_board(get_board(size, board))

for _ in range(10):

board = correct_cons(size, new_step(board))

print_board(get_board(size, board))

终止状态:所有网格细胞状态都为0

上一篇:B01 - 003、安装CentOS6.9系统


下一篇:Java引用类型之软引用(1)