为了账号安全,请及时绑定邮箱和手机立即绑定

C语言算法之:细胞生命游戏

标签:
C++ C#

只要肯花时间,一定会有所成长。

 

学技术,重在日拱一卒、一点一滴的积累。

 

今天一起分析C语言的算法之17:细胞生命游戏。


算法题目:细胞生命游戏


某一细胞的邻居包括上、下、左、右、左上、左下、右上与右下相邻之细胞,游戏规则如下:


1、孤单死亡:如果细胞的邻居小于一个,则该细胞在下一次状态将死亡。


2、拥挤死亡:如果细胞的邻居在四个以上,则该细胞在下一次状态将死亡。


3、稳定:如果细胞的邻居为二个或三个,则下一次状态为稳定存活。


4、复活:如果某位置原无细胞存活,而该位置的邻居为三个,则该位置将复活一细胞。


5、解法生命游戏的规则可简化为以下,并使用CASE比对即可使用程式实作:


邻居个数为0、1、4、5、6、7、8时,则该细胞下次状态为死亡。


邻居个数为2时,则该细胞下次状态为复活;邻居个数为3时,则该细胞下次状态为稳定。


https://img1.sycdn.imooc.com//6216e1240001577210800100.jpg

编程思路分析

编程思路: 


1、用程序实现光标移动位置;


2、数据初始化;


3、显示界面;


4、用程序实现进行判定。



https://img1.sycdn.imooc.com//6216e126000124b710800100.jpg

程序范例


#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();

    }

}


程序运行结果案例:


https://img1.sycdn.imooc.com//6216e1600001607306110591.jpg

祝读者:


学有所成;


工作顺利;


事业成功。



点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消