C語言演算法之17:細胞生命遊戲

XYD漫漫發表於2022-02-24

專注職業教育&教研裝置+自媒體連結+智慧投資。



只要肯花時間,一定會有所成長。

 

學技術,重在日拱一卒、一點一滴的積累。

 

今天一起分析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();

    }

}


程式執行結果案例:


圖片

祝讀者:


學有所成;


工作順利;


事業成功。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70014179/viewspace-2857540/,如需轉載,請註明出處,否則將追究法律責任。

相關文章