以下是生命游戏的Mathematica代码。 在圆环面地图上共有100×100个格子。每个格子的生死遵循下面的原则:
1. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变) 。
2. 如果首漏一个细胞周围有2个细胞为生,则该旦芹尺细胞的生死状模高态保持不变;
3. 在其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变)。
Checkboard = RandomInteger[1, {100, 100}]
update[1, 2] := 1
update[_, 3] := 1
update[_, _] := 0
SetAttributes[update, Listable]
Dynamic[ArrayPlot[
Checkboard =
update[Checkboard,
Plus @@ Map[
RotateRight[Checkboard, #] &, {{-1, -1}, {-1, 0}, {-1,
1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}}]]]]
一种比较初级的生命游戏matlab代码
function ca
m=30n=30p=.7h=100
for x=1:m
for y=1:n
r=rand(1)
if r>p
a(x,y)=1
else a(x,y)=0
end
end
end
for x=1:m
for y=1:n
if a(x,y)==1
fx=[x-1,x-1,x,x]fy=[y-1,y,y,y-1]fill(fx,fy,'g'),hold on
else
end
end
end
for k=1:h
fx=[0,m,m,0]fy=[0,0,n,n]fill(fx,fy,'k'),hold on
for x=2:m-1
for y=2:n-1
b(x,y)=a(x-1,y-1)+a(x-1,y)+a(x-1,y+1)+a(x,y-1)+a(x,y+1)+a(x+1,y-1)+a(x+1,y)+a(x+1,y+1)
if b(x,y)==2,c(x,y)=a(x,y)
elseif b(x,y)==3,c(x,y)=1
else c(x,y)=0
end
end
end
c(1:m,1)=a(1:m,1)c(1:m,n)=a(1:m,n)
for x=1:m
for y=1:n
if c(x,y)==1
fx=[x-1,x-1,x,x]fy=[y-1,y,y,y-1]fill(fx,fy,'g'),hold on
else
end
end
end
pause(.05)
a=c
end
clcclear all
close all
m=30n=30p=.7h=100
%%
%生成30*30矩阵a,a的值根据随机数是否大于阈值0.7决定为1或0。
for x=1:m
for y=1:n
樱仿r=rand(1)%rand产生的是0到1(不包括1)的随机数。
if r>p
a(x,y)=1
else a(x,y)=0
end
end
end
%%
for x=1:m
for y=1:n
if a(x,y)==1
慎颂羡 fx=[x-1,x-1,x,x]
fy=[y-1,y,y,y-1]
fill(fx,fy,'g')
%fill将点[x1,y1],[x2,y2],[x3,y3],[x4,y4]按序连线,后形成的图像进行填充,参数‘g’表示绿色。
%[x1,y1],[x2,y2],[x3,y3],[x4,y4]对应写成[x1 x2 x3 x4][y1 y2 y3 y4],hold on表示画在一幅图上。
hold on
else
end
end
end
%即如果a(1,1)值为1,就在图像上在(1,1)点左下方画一个单位为宽拍1绿色的正方形。
%这一块可以不要,因为画图后被黑底覆盖。
%%
for k=1:h %运行100次
fx=[0,m,m,0]fy=[0,0,n,n]fill(fx,fy,'k'),hold on%画一个30*30黑底
for x=2:m-1
for y=2:n-1
b(x,y)=a(x-1,y-1)+a(x-1,y)+a(x-1,y+1)+a(x,y-1)+a(x,y+1)+a(x+1,y-1)+a(x+1,y)+a(x+1,y+1)
%根据生命游戏规,取矩阵a元素(x,y)周围八个元素值的和,因为最外边一圈元素周围没有八个相邻元素,
%所以不考虑,x、y范围2:m-1、2:n-1。
if b(x,y)==2,c(x,y)=a(x,y)
%如果(x,y)周围存在2个1,即游戏意义2个活细胞,则这个细胞下一刻生死与原来生死有关。
elseif b(x,y)==3,c(x,y)=1
%如果(x,y)周围存在3个1,即游戏意义2个活细胞,则这个细胞下一刻必存活(这里我假设1是存活)。
else c(x,y)=0
%如果(x,y)周围存在活细胞不是这两个值,即太多或太少,则这个细胞下一刻必死亡(这里我假设0是死亡)。
end
end
end
%%
c(1:m,1)=a(1:m,1)
c(1:m,n)=a(1:m,n)%加上两侧的两列
c(1,1:n)=a(1,1:n)%此处我感觉还应该加上最上最下两行,原程序没有。否则缺少的部分值为零,显示一直为黑。
c(m,1:n)=a(m,1:n)%注意矩阵表示与画图等于进行了矩阵的转置,缺少矩阵上下两行则左右两侧显示为黑。
for x=1:m
for y=1:n
if c(x,y)==1
fx=[x-1,x-1,x,x]fy=[y-1,y,y,y-1]fill(fx,fy,'g'),hold on
else
end
end
end
%画出c,同上画a
pause(.05)%暂停0.05秒,观察变化过程
a=c%将c赋值给a,即将此时的c当作前一时刻a,继续循环画图
end
%这个过程就是先生成一个随机30*30矩阵a,对a矩阵中间29*29部分根据生命游戏规则进行运算并显示,循环100次。
%可以发现最外边一圈图形是不变的。
你的sum和cells都是矩阵,但是维度不同。如果是这样,你在这段程序的前面给sum预分配个空间sum=zeros(size(cells,1),size(cells,2))。
然后注意遍历稿备x,y的时候,不要到边界键岩毁上,否则x+1,y+1之类的就越界了。枣纤
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)