C语言练习-生命游戏

/**
	生命游戏 
	1-一个细胞周围8个细胞中如果有3个细胞为生,则该细胞为生
	2-如果该细胞周围只有2个细胞为生,则该细胞的生死保持不变
	3-在其他情况下,该细胞为死 
*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>

#define High_Max 100
#define Width_Max 100

int High =20;
int Width =50;
int Canvas [High_Max][Width_Max];
int Breed_Num=0;

void gotoxy(int x,int y)//清屏
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle,pos);
}


void State_Init ()
{
	int i , j;
	srand(time(NULL));//初始化随机数 
	for(i=0;i<=High;i++)
	{
		for(j=0;j<=Width;j++)
		{
			Canvas[i][j]=rand()%2;//随机赋值  
		}
	}
}

void Show ()//生输出 ■ 死输出 □
{
	gotoxy(0,0);
	int i , j;
	for(i=0;i<High;i++)
	{
		for(j=0;j<Width;j++)
		{
			if(Canvas[i][j]==1)
				printf("■");
				else
					printf("□");
		}
		printf("\n");
		//printf("\n");
	}
}


void Copy_arr(int tmp_map[][Width_Max],int map[][Width_Max]) 
{	
	int i,j;
    for ( i = 0; i < High; i++)
        for ( j = 0; j < Width; j++)
            tmp_map[i][j] = map[i][j];
}

void Auto_Up()//自动更新 
{
	int NewCanvas[High_Max][Width_Max];//缓存 
	int RoundNum ;//周围的个数 
	int i , j ;
	Copy_arr(NewCanvas,Canvas);//先缓存 
	for(i=0;i<High;i++)
	{
		for(j=0;j<Width;j++)//比较缓存后的值在更新原本值 
		{
			RoundNum=NewCanvas[i-1][j-1]+NewCanvas[i-1][j]+NewCanvas[i-1][j+1]
					+NewCanvas[i][j-1] /*NewCanvas[i][j]*/+NewCanvas[i][j+1]
					+NewCanvas[i+1][j-1]+NewCanvas[i+1][j]+NewCanvas[i+1][j+1];//将附近8个全部相加 
				if(RoundNum==3)
					Canvas[i][j]=1;
					else if(RoundNum==2);//维持原状
						else 
							Canvas[i][j]=0;	
		}
	}
	Breed_Num++;
}		

int main ()
{
	int i;
	State_Init(); 
	Show();
	while(1)
	{
		Show();
		Auto_Up();
		Sleep(100);
		printf("第%d代: ",Breed_Num);
	}
	return 0;
}
posted @ 2019-03-15 13:26  年小猫  阅读(710)  评论(0编辑  收藏  举报