matlab 生命游戏

本文转载自http://www.cnblogs.com/cfantaisie/archive/2011/04/11/2012937.html

英国数学家J.H.Conway在1970年提出一种被称作“生命游戏”的小游戏。
Life游戏实际上是一种模拟,并不是游戏者之间的游戏。它在一个无边界的矩形网格上进行,这个矩形网格中
的每个单元可被一个有机体占据,或者不被占据。被占据的单元称为活的,未被占据的单元称位死的。哪个单
元是活的要根据其周围活的邻居单元数目而一代代地发生变化。

游戏规则如下:
1. 给定单元的邻居是与它在垂直,水平或对角上相界的8个单元。
2. 如果1个单元为活的,但没有邻居单元是活的,或者仅有一个邻居单元是活的,则在下一代,此单元
会因为孤独而死亡。
   3. 如果1个单元周围有2个或者3个邻居单元为生,则该单元在下一代也是活的。
4. 如果1个单元是死的,则在下一代,如果它刚好有3个邻居单元是活的,则此单元变成活的。
所有其它死的单元在下一代仍然是死的。
5. 如果1个单元为活的,且有4个或者4个以上邻居单元是活的,则在下一代,此单元会因为拥塞而死亡。
   6. 所有出生和死亡都刚好在同一时间发生,则此单元的死亡有助于另一个单元的出生,但它不能通过
减少拥塞而阻止其他单元的死亡;正在出生的单元也不能保护或者杀死上一代中活的单元。

   依此规则进行迭代变化,使单元生生死死,会得到一些有趣的结果。该游戏之所以被称为“生命游戏”,
是因为其简单的游戏规则,反映了自然界中的生存规律:如果一个生命,其周围的同类生命太少的话,
会因为得不到帮助而死亡;如果太多,则会因为得不到足够的资源而死亡。

   用计算机模拟这个“生命游戏”设定图像中的初始配置后依据上述的游戏规则演绎生命的变化,
由于初始状态和迭代次数不同,将会得到各种的优美图案。

  本文在matlab下模拟了个“生命游戏”,不足之处由于初始状态随机设置,图案美观性欠缺…

  matlab代码如下:
  

s=100;      % 棋盘宽,棋盘是方的,即每行每列可以有100个元包自动机
w=8;        % 每一个元包的像素宽度
board=zeros(w*s,s*w);   %棋盘图片
state=zeros(s,s);       %元包自动机的状态
newState=zeros(s,s);

%%  初始化
for i=1:s
    for j=1:s
        if rand<0.4         %   随机在棋盘上以0.4的生存概率设置自动机状态
            state(i,j)=1;   %   其实分的随机设置状态会导致非常离散的点,最后收敛时棋盘上剩下些孤立的点
        end
    end
end
figure;
%%  更新状态
for k=1:1000
    tmp=cputime;
    for i=1:s
        for j=1:s
            %   计算邻居着活着的个数
            cnt=0;
            if i-1>0&&j-1>0
                cnt=cnt+state(i-1,j-1);
            end
            if i-1>0&&j+1<=s
                cnt=cnt+state(i-1,j+1);
            end
            if i+1<=s&&j+1<=s
                cnt=cnt+state(i+1,j+1);
            end
            if i+1<=s&&j-1>0
                cnt=cnt+state(i+1,j-1);
            end
            if j-1>0
                cnt=cnt+state(i,j-1);
            end
            if j+1<=s
                cnt=cnt+state(i,j+1);
            end
            if i-1>0
                cnt=cnt+state(i-1,j);
            end
            if i+1<=s
                cnt=cnt+state(i+1,j);
            end

            %   更新状态、着色
            newState(i,j)=state(i,j);
            if state(i,j)==0
                if cnt==3
                    newState(i,j)=1;
                end
            elseif state(i,j)==1
                if cnt<2||cnt>3
                    newState(i,j)=0;
                end
            end

            if newState(i,j)==0
                board(((i-1)*w+1):i*w,((j-1)*w+1):j*w)=0;
            else
                board(((i-1)*w+1):i*w,((j-1)*w+1):j*w)=255;
            end
        end
    end
    t=cputime-tmp;
    state=newState;
    imshow(board);
    pause(0.3);

end
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值