#include<iostream>
using 桥旅namespace std
#include<time.h>
#define M 70
#define N 20
void mShow(int a[N+2][M+2])
{ int i,j
for ( i=0i<Ni++,cout<<endl )
for ( j=0j<Mj++ )
if ( a[i+1][j+1] ) cout<<'*'
else cout<<'.'
//cout<<( a[i+1][j+1] )?('*'):(' ')
}
int mJduge(int a[N+2][M+2])
{ int i,j,k,s,*p[9],b[N][M]
for ( i=0i<Ni++ )
{
p[0]=p[4]=p[5]=&a[i+1][1] p[4]-- p[5]++ // 1 2 3
p[1]=p[2]=p[3]=p[0]-M-2 p[1]-- p[3]++ // 4 0 5
p[6]=p[7]=p[8]=p[0]+M+2 p[6]-- p[8]++ // 6 7 8
for ( j=0j<Mj++ )
{ for ( k=1,s=0k<9k++ ) s+=(*p[k])
b[i][j]=*p[0]
if ( s>=3 ) b[i][j]=1
else if ( s<2 ) b[i][j]=0
for ( k=0k<9k++ ) p[k]++
}
}
for ( i=0,s=1i<Ni++ ) for ( j=0j<Mj++ ) { a[i+1][j+1]=b[i][j] if ( b[i][j]==0 ) s=0 }
return s
}
void main()
{
int a[N+2][M+2],b[N][M],*p[9]
int t,i,j,k
for ( i=0i<N+2i++ ) for ( j=0j<M+2j++ ) a[i][j]=0
srand((unsigned int)time(NULL))
for ( i=0i<Ni++ ) for ( j=0j<Mj++ ) { k=rand()%100 a[i+1][j+1]=( k>=77 )?(1):(0) }
cout<<"-------- T=0--------"<<endl mShow(a)
k=0 t=0
while ( !k )
{ k=mJduge(a) t++
cout<<"-------- T="<<t<<" --------"<<endl mShow(a)
}
}
a数组比实际要的数组大一圈,大出来的一圈春消运永恒等于0,作为边界,省得计算8连通数据时数组越界
b数组用于计算本次的结果扒梁,计算完成后复制、覆盖a数组中间部分作为结果
主程序做直到所有空间都被活细胞占满情况停止
以下是设置M=10,N=5的测试部分结果
这次我们使用 Python 来实现生命游戏,这是一种简单的元胞自动机。基于一定规则,程序可以自动从当前状态推演到下一状态。制作的成品如下:
先来说说生命游戏的规则:
在生命游戏中,每个单元格有两种状态,生与死。在我们的实现中,黄色的单元格代表活着的细胞,红色单元格表示死亡的细胞。而每一个细胞的下一状态,是由该细胞及周围的八个细胞的当前状态决定的。
具体而言:
当前细胞为活细胞
当前细胞为死细胞
无需安装的标准库:
第三方库:
导入模块:
首先,我们要知道细胞的生存空敬谈间是散基 N * N 的方阵,每个细胞都有两种状态:on, off。on 为 255,off 为 0。我们使用 numpy 产生 N * N 的方阵。np.random.choice 是在 State.on 和 State.off ,等概率随机抽取一个元素构造 N * N 的方阵。
其次我们要明白如何计算细胞周围活细胞的个数,尤其是边界一圈的细胞。我们可以采用余数的方式,假设棋盘大小为 9 * 9,那么对于左右边界而言,左边界的左边一个元素的计算方式: - 1 % 9 = 8,自动折到右边界上。将细胞周围八个单元格的数值加起来,除以 255,就可以得到细胞周围活细胞的个数。
接下来是对规则的翻译,即根据当前世代的状态,推演出下一世代,细胞的状态。initial 为当前世代的矩阵,data为下一世代的矩阵,我们根据 initial 的数值,计算出 data 的数值。total 为周围活细胞的个数,如果当前为活细胞,total 大于三或者小于二,下一世代就会死去。如果当前为死细胞,total 等于三,下一世代活细胞就会繁殖到该单元格上。
接下来是制作动图的过程,前面几行是绘图的基本 *** 作。之后,我们使用到了 matplotlib.animation 的方法。其中,FuncAnimation 接受的参数含义:fig 为图像句柄,generate 函数是我们更新每一帧图像所需数据的函数,下面会有介绍,fargs 为 genrate 函数的除去第一个参数的其他参数,第一个参数由 FuncAnimation 指定 framenum(帧数) 传给 generate 函数。frames 是帧数,interval 是更新图像间隔,save_count 为从帧到缓存的值的数量。
如果指定保存路径(html),则保存为 html 动画。
下面我们来看 generate 函数,NUM 为当迭代次数,frame_num 接收来自 FuncAnimation 的帧数。通过嵌套的 for 循环,我们逐个地更新方阵中各元素的状态亮掘碰。
最后,我们可以通过命令行参数,运行我们的程序:
-- size 参数为棋盘大小,--seed 为随机种子,用于产生不同的随机方阵。
高斯帕滑翔机q(Gosper Glider Gun)
可将 --gosper 更改为 --glider 滑翔机。--save 为动图保存的地址。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)