前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >康威生命游戏的Python实现

康威生命游戏的Python实现

作者头像
顾翔
发布2019-12-12 12:27:48
1.5K0
发布2019-12-12 12:27:48
举报

康威生命游戏是康威提出的一种细胞繁殖的一种数学模型。

起始状态:细胞的状态不是“生”就是“死”,并且是随机的。

规则1:当周围的邻居细胞低于两个(不包含两个)存活时,该细胞变成死亡状态(模拟生命数量稀少)。

规则2:当周围有3个以上的存活细胞时,该细胞变成死亡状态(模拟生命数量过多)。

规则3:当周围有3个存活细胞时,则迭代后该细胞存活状态。

规则4:当周围有2个存活细胞时,该细胞保持原样。

分别对应下面四个图:

根据规则,用Python书写代码如下:

#!/usr/bin/env python

#coding:utf-8

'''

如果当前细胞周围细胞个数:

小与2个或者大于3个,这下一代死去

=3个:则下一代活着

=2个;则选一代保持不变

'''

import copy,random

#康威生命游戏规则

def life_rule(cell):

new_cell = copy.deepcopy(cell)

width = len(cell)

higth = len(cell[0])

for x in range(width):

for y in range(higth):

new_cell[x][y] = judeg_current_node(cell,x,y,width,higth)

print(new_cell)

if new_cell != cell:

life_rule(new_cell)

#判断当前节点下一次迭代的生死

def judeg_current_node(cell,x,y,width,higth):

live = 0

#左上角

if x-1>0 and y-1>0:

live+=cell[x-1][y-1]

#上边

if y-1>0:

live+=cell[x][y-1]

#右上角

if x+1<width and y-1>0:

live+=cell[x+1][y-1]

#左边

if x-1>0:

live+=cell[x-1][y]

#右边

if x+1<width:

live+=cell[x+1][y]

#左下角

if x-1>0 and y+1<higth:

live+=cell[x-1][y+1]

#下边

if y+1<higth:

live+=cell[x][y+1]

#右下角

if x+1<width and y+1<higth:

live+=cell[x+1][y+1]

if live<2 or live>3:

return 0

elif live == 3:

return 1

elif live ==2:

return cell[x][y]

#随机产生细胞

def create_cell(x,y):

cell1=[]

for i in range(x):

cell2=[]

for j in range(y):

cell2.append(random.randint(0,1))

cell1.append(cell2)

return cell1

if __name__=="__main__":

#1活,0死

cell = create_cell(5,5)

life_rule(cell)

根据测试结果,有些时候所有细胞都死亡,有些时候进行几次繁衍,细胞达成一个稳态,还有一次迭代超过了Python的最大迭代次数后仍旧没有达到稳态。康威生命游戏说明,当周围细胞过多的时候,细胞为了争夺资源最后全部灭亡(比如列表中的值都为1);当周围细胞过少的时候,没有互相协助也将全部灭亡(比如列表中的值大部分为0)。下面为一个经过九次繁殖达到一个稳态的例子。

[[0, 1, 1, 1, 0], [1, 1, 1, 1, 0], [0, 0, 0, 1, 0], [0, 1, 0, 0, 1], [0, 0, 1, 0, 0]]

[[1, 1, 0, 1, 0], [0, 0, 1, 1, 0], [1, 1, 0, 1, 1], [0, 0, 1, 1, 0], [0, 0, 0, 0, 0]]

[[0, 0, 0, 1, 0], [0, 0, 1, 1, 1], [0, 1, 0, 0, 1], [0, 0, 1, 1, 1], [0, 0, 0, 0, 0]]

[[0, 0, 1, 1, 1], [0, 0, 1, 1, 1], [0, 1, 0, 0, 0], [0, 0, 1, 1, 1], [0, 0, 0, 1, 0]]

[[0, 0, 1, 0, 1], [0, 0, 1, 1, 0], [0, 1, 0, 0, 0], [0, 0, 1, 1, 1], [0, 0, 1, 1, 1]]

[[0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 1, 0, 0, 1], [0, 1, 0, 0, 1], [0, 0, 1, 0, 1]]

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 1, 1, 1, 0], [0, 1, 1, 0, 1], [0, 0, 0, 1, 0]]

[[0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 1, 0, 1, 0], [0, 1, 0, 0, 1], [0, 0, 1, 1, 0]]

[[0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 1, 0, 1, 0], [0, 1, 0, 0, 1], [0, 0, 1, 1, 0]]

在这个例子中,在一个5X5=25的细胞组织中,7个细胞处于存活状态。下面的例子中,细胞经过5次繁殖均全部死亡

[[1, 1, 1, 0, 0], [0, 0, 0, 0, 0], [0, 1, 0, 0, 1], [0, 1, 1, 0, 1], [0, 1, 1, 0, 0]]

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 1, 1, 1, 0], [1, 0, 0, 0, 0], [0, 1, 1, 1, 0]]

[[0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [1, 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]]

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软件测试培训 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档