Algorithm Gossip:生命游戏

/**************************************** 
*  File Name  : arithmetic.c 
*  Creat Data : 2015.1.31
*  Author     : ZY 
*****************************************/ 




/*Algorithm Gossip:生命游戏*/
/*生命游戏(game of life)为1979年由英国数学家J.H.Conway
所提出的,某一细胞的邻居包括上,下,左,右,左上,左下,
右上与右下相邻的细胞,游戏规则如下:
孤单死亡:如果细胞的邻居小于一个,则该细胞在下一次状态将死亡。
拥挤死亡:如果细胞的邻居在四个以上,则细胞在下一次状态将死亡。
稳定:如果细胞的邻居为两个或三个,则下一次状态为稳定存活。
复活:如果某位置原无细胞存活,而该位置的邻居为三个,则该位置将复活一细胞。
用case语句写程序
当邻居个数为0,1,4,5,6,7,8死亡
当邻居个数为3稳定
当邻居个数为2复活*/



#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define MAXROW 10
#define MAXCOL 25
#define DEAD 0
#define ALIVE 1

int map[MAXROW][MAXCOL],newmap[MAXROW][MAXCOL];

void init()
{
	int row,col;
	for(row  = 0;row < MAXROW;row++)
	{
		for(col = 0;col < MAXCOL;col++)
		{
			map[row][col] = DEAD;
		}
	}
	puts("Game of life Program");
	puts("Enter x,y where x,y is living cell");
	printf("0<=x<=%d,0<=y<=%d\n",MAXROW-1,MAXCOL-1);
	puts("Terminate with x,y = -1,-1");

	while(1)
	{
		scanf("%d %d",&row,&col);//输入位置坐标
		if(0 <= row && row < MAXROW && 0 <= col &&col < MAXCOL)
		{
			map[row][col] = ALIVE;
		}
		else if(row == -1||col == -1)//直到此时结束
		{
			break;
		}
		else
		{
			printf("(x,y)exceeds map ranage!");//位置坐标超过范围时
		}
	}
}

int neighbors(int row,int col)
{
	int count = 0,c,r;
	for(r = row-1;r <= row+1;r++)
	{
		for(c = col-1;c <= col+1;c++)
		{
			if(r < 0||r >= MAXROW||c < 0||c >= MAXCOL)
			{
				continue;
			}
			if(map[r][c] == ALIVE)
			{
				count++;
			}
		}
	}
	if(map[row][col] == ALIVE)
	{
		count--;
	}
	return count;
}

void outputMap()
{
	int row,col;
	printf("\n\n%20cGame of life cell status\n",' ');
	for(row = 0;row < MAXROW;row++)
	{
		printf("\n%20c",' ');
		for(col = 0;col < MAXCOL;col++)
		{
			if(map[row][col] == ALIVE)
			{
				putchar('#');
			}
			else
			{
				putchar('-');
			}
		}
	}
}


void copyMap()
{
	int row,col;
	for(row = 0;row < MAXROW;row++)
	{
		for(col = 0;col < MAXCOL;col++)
		{
			map[row][col] = newmap[row][col];
		}
	}
}


int main(void)
{
	int row,col;
	char ans;
	init();
	while(1)
	{
		outputMap();
		for(row = 0;row < MAXROW;row++)
		{
			for(col = 0;col < MAXCOL;col++)
			{
				switch(neighbors(row,col))
				{
				case 0:
				case 1:
				case 4:
				case 5:
				case 6:
				case 7:
				case 8:
					newmap[row][col] = DEAD;
					break;
				case 2:
					newmap[row][col] = map[row][col];
					break;
				case 3:
					newmap[row][col] = ALIVE;
					break;
				default:
					break;
				}
			}
		}
		copyMap();
		printf("\nContinue next Generation?");
		getchar();
		ans = toupper(getchar());//将字符c转换为大写英文字母
		if(ans != 'Y')
		{
			break;
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值