您的位置:首页 > 编程语言 > MATLAB

matlab 生命游戏

2016-11-22 22:28 246 查看
本文转载自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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: