只要肯花时间,一定会有所成长。
学技术,重在日拱一卒、一点一滴的积累。
今天一起分析C语言的算法之17:细胞生命游戏。
算法题目:细胞生命游戏
某一细胞的邻居包括上、下、左、右、左上、左下、右上与右下相邻之细胞,游戏规则如下:
1、孤单死亡:如果细胞的邻居小于一个,则该细胞在下一次状态将死亡。
2、拥挤死亡:如果细胞的邻居在四个以上,则该细胞在下一次状态将死亡。
3、稳定:如果细胞的邻居为二个或三个,则下一次状态为稳定存活。
4、复活:如果某位置原无细胞存活,而该位置的邻居为三个,则该位置将复活一细胞。
5、解法生命游戏的规则可简化为以下,并使用CASE比对即可使用程式实作:
邻居个数为0、1、4、5、6、7、8时,则该细胞下次状态为死亡。
邻居个数为2时,则该细胞下次状态为复活;邻居个数为3时,则该细胞下次状态为稳定。
编程思路分析
编程思路:
1、用程序实现光标移动位置;
2、数据初始化;
3、显示界面;
4、用程序实现进行判定。
程序范例
#include<stdio.h>
#include<windows.h>
#define High 25 //游戏尺寸
#define Width 50
//定义全局变量
int cells[High][Width]; //细胞生1死0
/*隐藏光标*/
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
/*光标移动到(x,y)位置*/
void gotoxy(int x,int y)
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle,pos);
}
/*数据初始化*/
void startup()
{
int i,j;
for(i=0;i<=High;i++)
for(j=0;j<=Width;j++)
{
/*所有细胞初始生,可用rand()随机函数使细胞初始状态随机*/
cells[i][j]=1;
}
HideCursor();
}
/*显示界面*/
void show()
{
int i,j;
gotoxy(0,0);
for(i=1;i<High;i++)
{
for(j=0;j<Width;j++)
{
if(cells[i][j]==1)
printf("*");
else
printf(" ");
}
printf("\n");
}
Sleep(200); //控制刷新速度
}
/*无需用户输入*/
void updateWithoutInput()
{
int i,j;
int NeibourNumber;
int temp[High][Width];
for(i=1;i<High;i++)
{
for(j=1;j<Width;j++)
{
NeibourNumber=cells[i-1][j-1]+cells[i-1][j]+cells[i-1][j+1]+cells[i][j-1]+cells[i][j+1]+cells[i+1][j-1]+cells[i+1][j]+cells[i+1][j+1];
/*周围有3个活细胞时,该细胞生*/
if(NeibourNumber==3)
temp[i][j]=1;
/*周围有2个活细胞时,该细胞状态不变*/
else if(NeibourNumber==2)
temp[i][j]=cells[i][j];
else
temp[i][j]=0;
}
}
for(i=1;i<High;i++)
for(j=1;j<Width;j++)
cells[i][j]=temp[i][j];
}
int main()
{
startup();
while(1)
{
show();
updateWithoutInput();
}
}
程序运行结果案例:
祝读者:
学有所成;
工作顺利;
事业成功。