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

matlab实现“生命游戏”

作者头像
巴山学长
发布2019-07-15 15:13:39
1.7K0
发布2019-07-15 15:13:39
举报
文章被收录于专栏:巴山学长

在著名作家刘慈欣的科幻小说《镜子》中,人类拥有的无限运算能力的计算机。于是,人类将宇宙大爆炸的初始条件输入程序,并按照一定的规则在夸克数量级推演,最终得到了精确的镜像宇宙。

下面给大家介绍一个模拟生命演化的游戏,即1970年由英国数学家约翰提出著名的“Game of Life”。

它的演化规则较为简单,即在一个二维方格平面上,由1或者0代表一个细胞的状态,其中1代表活着,0代表嗝屁了。以一个方格为中心的九宫格内,对应着八个方格邻居,如果一个细胞周围活着的邻居的个数小于2,它就会因为孤独而死(想象一下你一个人在深山老林,肯定得被狼叼走啊);当活着的邻居数是2或者3时,这个细胞可以正常活着;如果大于3,就会因为生存空间不足而死。另外,假如一个死去的细胞周围有3个细胞,它就可以活过来。规则看似简单,却蕴含着整个生命演化的历程。接下来,将在matlab实现这个游戏,下图是截取的生命演化过程中的某个时间点的生命状态。

经过足够的时间后,整个生命系统会稳定下来。而且,在初始条件不变的情况下,生命系统的状态在每个时间都是固定的,最终达到一个相对稳定的动态平衡,就像《镜子》里面的宇宙镜像一样。

代码语言:javascript
复制
width=80;      
cell=5;        
screen=zeros(cell*width,width*cell);   
state=zeros(width,width);       %初始状态假设都为死的
now_state=zeros(width,width);
%初始化细胞状态,假设由40%的细胞活着
for i=1:width
    for j=1:width
        if rand<0.4      
            state(i,j)=1;   
        end
    end
end

以上代码是初始化细胞的状态,一个零矩阵代表所有的细胞都是死的。后面两个for循环让一定比例的细胞活过来,这些活过来的细胞就是初始条件。其他迭代产生的细胞都是这些细胞的后代。

在后面的计算中,用到了一个While语句。让生命系统无限次循环,每循环一次,代表生命系统更新一代。

代码语言:javascript
复制
s1=0;
            if i-1>0&&j-1>0
                s1=s1+state(i-1,j-1);
            end
            if i-1>0&&j+1<=width
                s1=s1+state(i-1,j+1);
            end
            if i+1<=width&&j+1<=width
                s1=s1+state(i+1,j+1);
            end
            if i+1<=width&&j-1>0
                s1=s1+state(i+1,j-1);
            end
            if j-1>0
                s1=s1+state(i,j-1);
            end
            if j+1<=width
                s1=s1+state(i,j+1);
            end
            if i-1>0
                s1=s1+state(i-1,j);
            end
            if i+1<=width
                s1=s1+state(i+1,j);
            end

这些语句作用是统计一个方格周围有多少活着的细胞,两个for循环可以统计所有的方格周围情况。这样,所有的方格周围的活细胞数量都表示出来了。在整个while运算中我们会根据规则更新各个方格状态,并且在图像中表示出来,然后更新图像。

以下是完整代码:

代码语言:javascript
复制
width=80;      
cell=5;        
screen=zeros(cell*width,width*cell);   
state=zeros(width,width);       %初始状态假设都为死的
now_state=zeros(width,width);
%初始化细胞状态,假设由40%的细胞活着
for i=1:width
    for j=1:width
        if rand<0.4      
            state(i,j)=1;   
        end
    end
end
figure;
while true
    for i=1:width
        for j=1:width
            %   计算这个细胞还有几个活着的邻居
            s1=0;
            if i-1>0&&j-1>0
                s1=s1+state(i-1,j-1);
            end
            if i-1>0&&j+1<=width
                s1=s1+state(i-1,j+1);
            end
            if i+1<=width&&j+1<=width
                s1=s1+state(i+1,j+1);
            end
            if i+1<=width&&j-1>0
                s1=s1+state(i+1,j-1);
            end
            if j-1>0
                s1=s1+state(i,j-1);
            end
            if j+1<=width
                s1=s1+state(i,j+1);
            end
            if i-1>0
                s1=s1+state(i-1,j);
            end
            if i+1<=width
                s1=s1+state(i+1,j);
            end
            now_state(i,j)=state(i,j);
            if state(i,j)==0
                if s1==3
                    now_state(i,j)=1;
                end
            elseif state(i,j)==1
                if s1<2||s1>3
                    now_state(i,j)=0;
                end
            end
            if now_state(i,j)==0
                screen(((i-1)*cell+1):i*cell,((j-1)*cell+1):j*cell)=0;
            else
                screen(((i-1)*cell+1):i*cell,((j-1)*cell+1):j*cell)=150;
            end
        end
    end
    state=now_state;
    imshow(screen);
    title('生命游戏');
end

本文作者:南海一号

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

本文分享自 巴山学长 微信公众号,前往查看

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

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

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