生命游戏_c语言小实现
什么是生命游戏呢?
游戏开始时,每个细胞随机地设定为“生”或“死”之一的某个状态。然后,根据某种规则,计算出下一代每个细胞的状态,画出下一代细胞的生死分布图。
应该规定什么样的迭代规则呢?需要一个简单的,但又反映生命之间既协同又竞争的生存定律。为简单起见,最基本的考虑是假设每一个细胞都遵循完全一样的生存定律;再进一步,把细胞之间的相互影响只限制在最靠近该细胞的8个邻居中。也就是说,每个细胞迭代后的状态由该细胞及周围8个细胞状态所决定。作了这些限制后,仍然还有很多方法来规定“生存定律”的具体细节。例如,在康威的生命游戏中,规定了如下生存定律。
(1)当前细胞为死亡状态时,当周围有3个存活细胞时,则迭代后该细胞变成存活状态(模拟繁殖);若原先为生,则保持不变。
(2)当前细胞为存活状态时,当周围的邻居细胞低于两个(不包含两个)存活时,该细胞变成死亡状态(模拟生命数量稀少)。
(3)当前细胞为存活状态时,当周围有两个或3个存活细胞时,该细胞保持原样。
(4)当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态(模拟生命数量过多)。
可以把最初的细胞结构定义为种子,当所有种子细胞按以上规则处理后,可以得到第1代细胞图。按规则继续处理当前的细胞图,可以得到下一代的细胞图,周而复始。
上面的生存定律当然可以任意改动,发明出不同的“生命游戏”。
——上述源自百度百科
简单的在C语言中实现一下,我的开发环境是DevC++
/*Version 1.0*/
//实现高朋星云
#include<stdio.h>
#include<stdlib.h>
#include <windows.h>//ÑÓʱº¯ÊýÍ·Îļþ
#define N 15
int StartMat[N][N];
int NextMat[N][N];
void InitMat (int Mat[N][N])
{
Mat[3][5]=1;Mat[3][8]=1;Mat[3][10]=1;
Mat[4][3]=1;Mat[4][4]=1;Mat[4][6]=1,Mat[4][8]=1,Mat[4][9]=1,Mat[4][10]=1;
Mat[5][4]=1,Mat[5][11]=1;
Mat[6][3]=1,Mat[6][4]=1,Mat[6][10]=1;
Mat[8][4]=1,Mat[8][10]=1,Mat[8][11]=1;
Mat[9][3]=1,Mat[9][10]=1,
Mat[10][4]=1;Mat[10][5]=1;Mat[10][6]=1;Mat[10][8]=1;
Mat[10][10]=1;Mat[10][11]=1;
Mat[11][4]=1;Mat[11][6]=1;Mat[11][9]=1;
}
void DisplayMat(int Mat[N][N])
{
char pic=0;
for(int i=1;i<N-1;i++)
{
for(int j=1;j<N-1;j++)
{
if(Mat[i][j]==0)
printf("%c%c",0xa8,0x80);
if(Mat[i][j]==1)
printf(" ");
}
printf("\n");
}
}
void copyMat()
{
for(int i=1;i<N-1;i++)
{
for(int j=1;j<N-1;j++)
{
StartMat[i][j]=NextMat[i][j];
NextMat[i][j]=0;
}
}
}
void RefreshMat(int Mat[N][N])
{
int temp=0;
for(int i=1;i<N-1;i++)
{
for(int j=1;j<N-1;j++)
{
temp=Mat[i-1][j]+Mat[i+1][j]+Mat[i][j-1]+Mat[i][j+1];
temp=temp+Mat[i-1][j-1]+Mat[i+1][j-1]+Mat[i-1][j+1]+Mat[i+1][j+1];
//Rule1
if(Mat[i][j]==0)
{
if(temp==3) NextMat[i][j]=1;
}
//Rule2&3&4
if(Mat[i][j]==1)
{
if(temp<2||temp>3) NextMat[i][j]=0;
else if(temp==2||temp==3) NextMat[i][j]=1;
}
}
}
}
int main()
{
int time;
InitMat(StartMat);
printf("iteration=%d\n",time);
DisplayMat(StartMat);
Sleep(1000);
system("cls");
for(time=1;time<=100;time++)
{
printf("iteration=%d\n",time);
RefreshMat(StartMat);
DisplayMat(NextMat);
copyMat();
Sleep(200);
system("cls");
}
return 0;
}
最终实现如下:

随手写的,大家可以玩下。
——横眉冷对千夫指,俯首甘为孺子牛

浙公网安备 33010602011771号