飞夺泸定桥

我心飞扬

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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

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

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

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

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

  matlab代码如下:

View Code
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

  下图为程序的截图:

posted on 2011-04-11 21:30  飞夺泸定桥  阅读(3721)  评论(0编辑  收藏  举报