请高手用C++编写程序—生命游戏
生命游戏(Game of Life)是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。在一个二维矩形世界中,每个方格居住着一个活着的或死了的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。
规则1. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变) 。
规则2. 如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;
规则3. 在其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变)
最早研究细胞自动机的科学家是冯·诺伊曼。后来人工生命之父克里斯·朗顿进一步发展了元胞自动机理论,由此认为生命诞生于“混沌的边缘”,从此开辟了“人工生命”这一新兴的交叉学科。
本题目要求你设计一个生命游戏,开始时设置好生命的初始状态(也可以随机设置),模拟其中生命随时间的变化过程。
2. 设计提示
1)细胞的世界可以用二维数组表示,每个生命的状态只有两种,即生或死;
2)为便于在屏幕上打印,世界的大小不宜过大,可以取20行70列;
3)程序开始时,设置生命的初始状态,即哪些地方有活着的生命。然后根据上述规则计算出下一个时刻生命的状态,并打印出来; 展开
#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=0;i<N;i++,cout<<endl )
for ( j=0;j<M;j++ )
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=0;i<N;i++ )
{
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=0;j<M;j++ )
{ for ( k=1,s=0;k<9;k++ ) 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=0;k<9;k++ ) p[k]++;
}
}
for ( i=0,s=1;i<N;i++ ) for ( j=0;j<M;j++ ) { 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=0;i<N+2;i++ ) for ( j=0;j<M+2;j++ ) a[i][j]=0;
srand((unsigned int)time(NULL));
for ( i=0;i<N;i++ ) for ( j=0;j<M;j++ ) { 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的测试部分结果
你编的是Java,还是C,用C打不开啊
c++编程
我用VC++6编译运行的。
#define W 20
#define H 20
char s[W][H];
int getValue(int i,int j)
{
if(i<0 || i>=W || j<0 || j>=H) return 0;
else return s[i][j];
}
int getAlive(int i,int j)
{
return getValue(i-1,j-1) +
getValue(i-1,j) +
getValue(i-1,j+1) +
getValue(i, j-1) +
getValue(i, j+1) +
getValue(i+1,j-1) +
getValue(i+1,j) +
getValue(i+1,j+1) ;
}
int show()
{
int i,j;
printf("\n\n\n\n");
for(i = 0;i<H;i++)
{
for(j = 0;j<W;j++)
{
printf("%c",s[j][i]==0?'.':'@');
}
printf("\n");
}
//getchar();
}
int main(void)
{
int i,j;
srand(time(0));
for(i = 0;i<W;i++)
{
for(j = 0;j<H;j++)
{
s[i][j] = rand()%2;
}
}
show();
while(1)
{
for(i = 0;i<W;i++)
{
for(j = 0;j<H;j++)
{
int v = getAlive(i,j);
if(v==3)s[i][j]=1;
else if(v!=2)s[i][j]=0;
}
}
show();
}
return 0;
}
不对啊,程序停不下来!!!
生命不息,程序不止,这个模拟的是生生不息的生命过程,
如果仅仅希望看到下一个时刻的生命状态,可以把代码中的while(1)这个死循环注释掉。
// while(1) 把该语句注释掉,就仅模拟一次生命游戏过程。
{
for(i = 0;i<W;i++)
{
for(j = 0;j<H;j++)
{
int v = getAlive(i,j);
if(v==3)s[i][j]=1;
else if(v!=2)s[i][j]=0;
}
}
show();
}