📄 game_of_life.m
字号:
function Game_Of_Life
%生命游戏(G舰eofLief)是J.H.ocwnya在20世纪60年代末设计的一种单人玩的计算机游戏,他与现代的围棋游戏在某些特征上略有相似:围棋中有黑白两种棋子。
%生命游戏中的元胞有性,死}两个状态{O,1}:围棋的棋盘是规则划分的网格,黑白两子在空间的分布决定双方的死活,而生命游戏也是规则划分的网格(元胞似国际象棋分
%布在网格内,而不象围棋的棋子分布在格网交叉点上)。根据元胞的局部空间构形来决定生死。只不过规则更为简单。下面介绍生命游戏的构成及规则:
%(1)元胞分布在规则划分的网格上;
%(2)元胞具有0,1两种状态,0代表“死”,1代表“生”;
%(3)元胞以相邻的8个元胞为邻居,c即Mooer邻居形式;
%(4)一个元胞的生死由其在该时刻本身的生死状态和周围八个邻居的状态(确切讲是状态的和)决定:
%如果生较灭多就为生;反之为灭。
%100*100的格子
Number_Grid=50;
Inf_Grid=zeros(Number_Grid,Number_Grid);
%画格子
%记录格子信息Inf_Grid
%0:灭; 1:生
figure(1)
for i=1:Number_Grid
plot([i i],[1 Number_Grid]),hold on
plot([1 Number_Grid],[i i]),hold on
end
axis([1 Number_Grid 1 Number_Grid])
title('Game Of Life')
for i=1:Number_Grid
for j=1:Number_Grid
if sum(rand(1,11))/11>0.5
Inf_Grid(i,j)=0;
plot(i,j,'ws', 'MarkerFaceColor','b','MarkerSize',5),hold on
else
Inf_Grid(i,j)=1;
plot(i,j,'ws', 'MarkerFaceColor','r','MarkerSize',5),hold on
end
end
end
xlabel('蓝色:灭; 红色:生')
%-------------------------------------------------------------------------%
%元宝自动机进行演化
Number=0;%程序终止条件
%Number_b:灭;Number_r:生
while Number~=100
Number_b=0;Number_r=0;
for i=1:Number_Grid %5
for j=1:Number_Grid %9
if i==1 %第一行格子变化情况 %13
if j==1 %第1行第1列的格子 %17
if Inf_Grid(i,j)==0 %处于灭的状态 %21
if Inf_Grid(i+1,j)+Inf_Grid(i+1,j+1)+Inf_Grid(i,j+1)<=1 %“灭”转化为“生”
Inf_Grid(i,j)=0;
Number_b=Number_b+1;
else
Number_r=Number_r+1;
Inf_Grid(i,j)=1;
end
else
if Inf_Grid(i+1,j)+Inf_Grid(i+1,j+1)+Inf_Grid(i,j+1)>=2 %依旧为状态为“生”
Number_r=Number_r+1;
Inf_Grid(i,j)=1;
else
Inf_Grid(i,j)=0;
Number_b=Number_b+1;
end
end
else %17(对应于第42行)
if j==Number_Grid %21
if Inf_Grid(i,j)==0 %处于灭的“状态”
if Inf_Grid(i,j-1)+Inf_Grid(i+1,j-1)+Inf_Grid(i+1,j)<=1 %“灭”转化为“生”
Inf_Grid(i,j)=0;
Number_b=Number_b+1;
else
Inf_Grid(i,j)=1;
Number_r=Number_r+1;
end
else %25
if Inf_Grid(i,j-1)+Inf_Grid(i+1,j-1)+Inf_Grid(i+1,j)>=2 %依旧为状态为“生”
Inf_Grid(i,j)=1;
Number_r=Number_r+1;
else
Inf_Grid(i,j)=0;
Number_b=Number_b+1;
end
end %25
else %21
if Inf_Grid(i,j)==0 %处于灭的“状态” %25
if Inf_Grid(i,j-1)+Inf_Grid(i+1,j-1)+Inf_Grid(i+1,j)+Inf_Grid(i+1,j+1)+Inf_Grid(i,j+1)<=2
Inf_Grid(i,j)=0;
Number_b=Number_b+1;
else
Inf_Grid(i,j)=1;
Number_r=Number_r+1;
end
else
if Inf_Grid(i,j-1)+Inf_Grid(i+1,j-1)+Inf_Grid(i+1,j)+Inf_Grid(i+1,j+1)+Inf_Grid(i,j+1)>=3
Inf_Grid(i,j)=1;
Number_r=Number_r+1;
else
Inf_Grid(i,j)=0;
Number_b=Number_b+1;
end
end
end
end %17
else %13
if i==Number_Grid %第Number_Grid行格子变化情况
if j==1
if Inf_Grid(i,j)==0 %处于灭的“状态”
if Inf_Grid(i-1,j)+Inf_Grid(i-1,j+1)+Inf_Grid(i,j+1)<=1
Inf_Grid(i,j)=0;
Number_b=Number_b+1;
else
Inf_Grid(i,j)=1;
Number_r=Number_r+1;
end
else
if Inf_Grid(i-1,j)+Inf_Grid(i-1,j+1)+Inf_Grid(i,j+1)>=2
Inf_Grid(i,j)=1;
Number_r=Number_r+1;
else
Inf_Grid(i,j)=0;
Number_b=Number_b+1;
end
end
else
if j==Number_Grid
if Inf_Grid(i,j)==0 %处于灭的“状态”
if Inf_Grid(i,j-1)+Inf_Grid(i-1,j-1)+Inf_Grid(i-1,j)<=1
Inf_Grid(i,j)=0;
Number_r=Number_r+1;
else
Number_r=Number_r+1;
Inf_Grid(i,j)=1;
end
else
if Inf_Grid(i,j-1)+Inf_Grid(i-1,j-1)+Inf_Grid(i-1,j)>=2
Number_r=Number_r+1;
Inf_Grid(i,j)=1;
else
Inf_Grid(i,j)=0;
Number_b=Number_b+1;
end
end
else
if Inf_Grid(i,j)==0 %处于灭的“状态” %25
if Inf_Grid(i,j-1)+Inf_Grid(i-1,j-1)+Inf_Grid(i-1,j)+Inf_Grid(i-1,j+1)+Inf_Grid(i,j+1)<=2
Inf_Grid(i,j)=0;
Number_b=Number_b+1;
else
Inf_Grid(i,j)=1;
Number_r=Number_r+1;
end
else
if Inf_Grid(i,j-1)+Inf_Grid(i-1,j-1)+Inf_Grid(i-1,j)+Inf_Grid(i-1,j+1)+Inf_Grid(i,j+1)>=3
Inf_Grid(i,j)=1;
Number_r=Number_r+1;
else
Inf_Grid(i,j)=0;
Number_b=Number_b+1;
end
end
end
end
else
if j==1 %第1列的格子情况
if Inf_Grid(i,j)==0 %处于灭的“状态”
if Inf_Grid(i-1,j)+Inf_Grid(i-1,j+1)+Inf_Grid(i,j+1)+Inf_Grid(i+1,j+1)+Inf_Grid(i+1,j)<=2
Inf_Grid(i,j)=0;
Number_b=Number_b+1;
else
Inf_Grid(i,j)=1;
Number_r=Number_r+1;
end
else
if Inf_Grid(i-1,j)+Inf_Grid(i-1,j+1)+Inf_Grid(i,j+1)+Inf_Grid(i+1,j+1)+Inf_Grid(i+1,j)>=3
Number_r=Number_r+1;
Inf_Grid(i,j)=1;
else
Inf_Grid(i,j)=0;
Number_b=Number_b+1;
end
end
else
if j==Number_Grid
if Inf_Grid(i,j)==0 %处于灭的“状态”
if Inf_Grid(i+1,j)+Inf_Grid(i+1,j-1)+Inf_Grid(i,j-1)+Inf_Grid(i-1,j-1)+Inf_Grid(i-1,j)<=2
Inf_Grid(i,j)=0;
Number_b=Number_b+1;
else
Inf_Grid(i,j)=1;
Number_r=Number_r+1;
end
else
if Inf_Grid(i+1,j)+Inf_Grid(i+1,j-1)+Inf_Grid(i,j-1)+Inf_Grid(i-1,j-1)+Inf_Grid(i-1,j)>=3
Inf_Grid(i,j)=1;
Number_r=Number_r+1;
else
Inf_Grid(i,j)=0;
Number_b=Number_b+1;
end
end
else
if Inf_Grid(i,j)==0 %处于灭的“状态”
if Inf_Grid(i-1,j-1)+Inf_Grid(i,j-1)+Inf_Grid(i+1,j-1)+Inf_Grid(i+1,j)+Inf_Grid(i+1,j+1)+Inf_Grid(i,j+1)+Inf_Grid(i-1,j+1)+Inf_Grid(i-1,j)+Inf_Grid(i,j)<=4
Inf_Grid(i,j)=0;
Number_b=Number_b+1;
else
Number_r=Number_r+1;
Inf_Grid(i,j)=1;
end
else
if Inf_Grid(i-1,j-1)+Inf_Grid(i,j-1)+Inf_Grid(i+1,j-1)+Inf_Grid(i+1,j)+Inf_Grid(i+1,j+1)+Inf_Grid(i,j+1)+Inf_Grid(i-1,j+1)+Inf_Grid(i-1,j)+Inf_Grid(i,j)>=5
Inf_Grid(i,j)=1;
Number_r=Number_r+1;
else
Inf_Grid(i,j)=0;
Number_b=Number_b+1;
end
end
end
end
end
end
end
end
Number=Number+1; %控制程序循环结束
figure(2)
%处于“生”“灭”状态元胞的个数统计曲线图
plot(Number,Number_b,'b*'),hold on
plot(Number,Number_r,'rh'),hold on
%画图(元胞自动机变化图)
figure(3)
pause(0.01)
for i=1:Number_Grid
for j=1:Number_Grid
if Inf_Grid(i,j)==0
plot(i,j,'ws', 'MarkerFaceColor','b','MarkerSize',5),hold on
else
plot(i,j,'ws', 'MarkerFaceColor','r','MarkerSize',5),hold on
end
end
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -