matlab while两个条件_matlab实现“生命游戏”

本文介绍了如何使用MATLAB模拟生命游戏,这是一个由英国数学家约翰·康威提出的著名演化规则模型。游戏规则涉及细胞在二维平面的生死状态,通过while循环不断迭代更新细胞状态,展示生命演化的动态平衡。文章提供了初始化细胞状态、设置初始条件以及进行迭代计算的MATLAB代码示例。
摘要由CSDN通过智能技术生成

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

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

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

cff8a8070122d542aad1c0730c407f44.png

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

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    endend

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

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

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运算中我们会根据规则更新各个方格状态,并且在图像中表示出来,然后更新图像。

以下是完整代码:

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    endendfigure;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
dc1d506e4d43b1b52aabb79b1806b825.png

本文作者:南海一号

1f48dae106f6ea3eb0feb528e06b410d.png a939f172d52280502d5115f1570052ff.png d24d169a6637e0db05c4bdf9beb60ae2.png f2649ab83397a4bdfe73bd047c11d988.png 赞赏 是一种鼓励   分享 是一种支持  留言 是一种习惯

71fe89b9879190721a3c6bb571b71d29.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值