⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 game_of_life.m

📁 借助于MATLAB
💻 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 + -