首页 > 技术文章 > 生命游戏_c语言小实现

DerekChen517 2021-03-21 22:27 原文

  什么是生命游戏呢?

  游戏开始时,每个细胞随机地设定为“生”或“死”之一的某个状态。然后,根据某种规则,计算出下一代每个细胞的状态,画出下一代细胞的生死分布图。

  应该规定什么样的迭代规则呢?需要一个简单的,但又反映生命之间既协同又竞争的生存定律。为简单起见,最基本的考虑是假设每一个细胞都遵循完全一样的生存定律;再进一步,把细胞之间的相互影响只限制在最靠近该细胞的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;
	
 } 

  最终实现如下:

  

 

  随手写的,大家可以玩下。

 

推荐阅读