當前位置:首頁 » 游戲問答 » 如何用c生命游戲

如何用c生命游戲

發布時間: 2022-05-18 01:19:56

『壹』 生命游戲c語言代碼

黑白棋游戲#include"graphics.h"/*圖形系統頭文件*/#defineLEFT0x4b00/*游標左鍵值*/#defineRIGHT0x4d00/*游標右鍵值*/#defineDOWN0x5000/*游標下鍵值*/#defineUP0x4800/*游標上鍵值*/#defineESC0x011b/*ESC鍵值*/#defineENTER0x1c0d/*回車鍵值*/inta[8][8]={0},key,score1,score2;/*具體分數以及按鍵與存放棋子的變數*/charplayone[3],playtwo[3];/*兩個人的得分轉換成字元串輸出*/voidplaytoplay(void);/*人人對戰函數*/voidDrawQp(void);/*畫棋盤函數*/voidSetPlayColor(intx);/*設置棋子第一次的顏色*/voidMoveColor(intx,inty);/*恢復原來棋盤狀態*/intQpChange(intx,inty,intz);/*判斷棋盤的變化*/voidDoScore(void);/*處理分數*/voidPrintScore(intn);/*輸出成績*/voidplayWin(void);/*輸出勝利者信息*//******主函數*********/voidmain(void){intgd=DETECT,gr;initgraph(&gd,&gr,"c:\\tc");/*初始化圖形系統*/DrawQp();/*畫棋盤*/playtoplay();/*人人對戰*/getch();closegraph();/*關閉圖形系統*/}voidDrawQp()/*畫棋盤*/{inti,j;score1=score2=0;/*棋手一開始得分都為0*/setbkcolor(BLUE);for(i=100;i=64-score1-score2)/*如果嘗試超過空格數則停步*/{MoveColor(x,y);fillellipse(x,y,15,15);break;}elsecontinue;/*如果按鍵無效*/}DoScore();/*分數的改變*/break;/*棋盤變化了,則輪對方走棋*/}else/*已經有棋子就繼續按鍵*/continue;}else/*四個方向按鍵的判斷*/if(key==LEFT&&x>120)/*左方向鍵*/{MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x-=40;fillellipse(x,y,15,15);}elseif(key==RIGHT&&x80)/*右方向鍵*/{MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x+=40;fillellipse(x,y,15,15);}elseif(key==UP&&y>120)/*上方向鍵*/{MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y-=40;fillellipse(x,y,15,15);}elseif(key==DOWN&&y1)/*判斷左邊*/{for(k=j-1;k>=0;k--)if(a[i][k]==a[i][j]||!a[i][k])break;if(a[i][k]!=0&&k>=0){for(kk=j-1;kk>k&&k>=0;kk--){a[i][kk]=a[i][j];fillellipse(120+i*40,120+kk*40,15,15);}if(kk!=j-1)yes=1;}}if(i1)/*判斷上邊*/{for(k=i-1;k>=0;k--)if(a[k][j]==a[i][j]||!a[k][j])break;if(a[k][j]!=0&&k>=0){for(kk=i-1;kk>k&&k>=0;kk--){a[kk][j]=a[i][j];fillellipse(120+kk*40,120+j*40,15,15);}if(kk!=i-1)yes=1;}}if(i>1&&j=0&&kk=0&&kkk&&k>=0;ii--,jj++){a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);}if(ii!=i-1)yes=1;}}if(i1)/*左下*/{for(k=i+1,kk=j-1;k=0;k++,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k=0){for(ii=i+1,jj=j-1;ii1&&j>1)/*左上*/{for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k>=0&&kk>=0){for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--){a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);}if(ii!=i-1)yes=1;}}if(iscore1)/*開始判斷最後的結果*/outtextxy(100,50,"blackwin!");elseif(score2#include#include#include#include#defineLEFT0x4b00#defineRIGHT0x4d00#defineDOWN0x5000#defineUP0x4800#defineESC0x011b#defineSPACE0x3920#defineBILI20#defineJZ4#defineJS3#defineN19intbox[N][N];intstep_x,step_y;intkey;intflag=1;voiddraw_box();voiddraw_cicle(intx,inty,intcolor);voidchange();voidjudgewho(intx,inty);voidjudgekey();intjudgeresult(intx,inty);voidattentoin();voidattention(){charch;window(1,1,80,25);textbackground(LIGHTBLUE);textcolor(YELLOW);clrscr();gotoxy(15,2);printf("游戲操作規則:");gotoxy(15,4);printf("PlayRules:");gotoxy(15,6);printf("1、按左右上下方向鍵移動棋子");gotoxy(15,8);printf("1.PressLeft,Right,Up,DownKeytomovePiece");gotoxy(15,10);printf("2、按空格確定落棋子");gotoxy(15,12);printf("2.PressSpacetoplacethePiece");gotoxy(15,14);printf("3、禁止在棋盤外按空格");gotoxy(15,16);printf("3.");gotoxy(15,18);printf("你是否接受上述的游戲規則(Y/N)");gotoxy(15,20);printf("?[Y/N]:");while(1){gotoxy(60,20);ch=getche();if(ch=='Y'||ch=='y')break;elseif(ch=='N'||ch=='n'){window(1,1,80,25);textbackground(BLACK);textcolor(LIGHTGRAY);clrscr();exit(0);}gotoxy(51,12);printf("");}}voiddraw_box(){intx1,x2,y1,y2;setbkcolor(LIGHTBLUE);setcolor(YELLOW);gotoxy(7,2);printf("Left,Right,Up,DownKEYtomove,Spacetoput,ESC-quit.");for(x1=1,y1=1,y2=18;x1=1;i--)if(box[i][j]==0){draw_circle(step_x,step_y,LIGHTBLUE);break;}if(i18)break;else{for(i=step_x+1,j=step_y;i18)break;step_x=i;judgewho(step_x,step_y);break;}caseDOWN:if((step_y+1)>18)break;else{for(i=step_x,j=step_y+1;j18)break;step_y=j;judgewho(step_x,step_y);break;}caseUP:if((step_y-1)=1;j--)if(box[i][j]==0){draw_circle(step_x,step_y,LIGHTBLUE);break;}if(j=1&&step_x=1&&step_y=1;j--){if(box[j][k]==flag)n1++;elsebreak;}/*水平向右數*/for(j=x,k=y;j=5){return(1);break;}/*垂直向上數*/n1=0;n2=0;for(j=x,k=y;k>=1;k--){if(box[j][k]==flag)n1++;elsebreak;}/*垂直向下數*/for(j=x,k=y;k=5){return(1);break;}/*向左上方數*/n1=0;n2=0;for(j=x,k=y;j>=1,k>=1;j--,k--){if(box[j][k]==flag)n1++;elsebreak;}/*向右下方數*/for(j=x,k=y;j=5){return(1);break;}/*向右上方數*/n1=0;n2=0;for(j=x,k=y;j=1;j++,k--){if(box[j][k]==flag)n1++;elsebreak;}/*向左下方數*/for(j=x,k=y;j>=1,k=5){return(1);break;}return(0);break;}}voidmain(){intgdriver=VGA,gmode=VGAHI;clrscr();attention();initgraph(&gdriver,&gmode,"c:\\tc");/*setwritemode(XOR_PUT);*/flag=1;draw_box();do{step_x=0;step_y=0;/*draw_circle(step_x,step_y,8);*/judgewho(step_x-1,step_y-1);do{while(bioskey(1)==0);key=bioskey(0);judgekey();}while(key!=SPACE&&key!=ESC);}while(key!=ESC);closegraph();}

『貳』 求C語言命令行程序的「生命游戲」代碼

本世紀70年代,人們曾瘋魔一種被稱作「生命游戲」的小游戲,這種游戲相當簡單。假設有一個像棋盤一樣的方格網,每個方格中放置一個生命細胞,生命細胞只有兩種狀態:「生」或「死」。游戲規則如下:
1. 如果一個細胞周圍有3個細胞為生(一個細胞周圍共有8個細胞),則該細胞為生,即該細胞若原先為死,則轉為生,若原先為生,則保
持不變;
2. 如果一個細胞周圍有2個細胞為生,則該細胞的生死狀態保持不變;
3. 在其它情況下,該細胞為死,即該細胞若原先為生,則轉為死,若原先為死,則保持不變。

依此規則進行迭代變化,使細胞生生死死,會得到一些有趣的結果。該游戲之所以被稱為「生命游戲」,是因為其簡單的游戲規則,反映了
自然界中的生存規律:如果一個生命,其周圍的同類生命太少的話,會因為得不到幫助而死亡;如果太多,則會因為得不到足夠的資源而死亡。

用計算機模擬這個「生命游戲」也相當簡單,可以用一個m×n像素的圖像來代表m×n個細胞,其中每一個像素,代表一個細胞,像素為黑色
表示細胞為生,像素為白色代表細胞為死。

設定圖像中每個像素的初始狀態後依據上述的游戲規則演繹生命的變化,由於初始狀態和迭代次數不同,將會得到令人嘆服的優美圖案。

下面給出的小程序是用tc2.0編寫。演示100×100個生命細胞初始狀態全為生時的變代情況,變化時邊緣細胞不參與變化。隨著迭代次數的不
同,在屏幕顯示的圖案精彩紛呈,像萬花筒般引人入勝。
#include <graphics.h>
main(){
int orgdata[100][100],resdata[100][100];/*分別記錄每次迭代的初始和結果狀態*/
int ncount,nrows,ncols,i,j,times; /*times記錄迭代次數*/
int graphdriver=detect,graphmode;
for (i=0;i<100;i++) /*初始化數據,令每一個細胞為生*/
for (j=0;j<100;j++) orgdata[i][j]=1;
initgraph(&graphdriver,&graphmode,′′′′); /*初始化屏幕顯示*/
setcolor(white);
rectangle(270,190,370,290); /*作顯示邊框*/
for (times=1;times<200;times++){
for (nrows=1;nrows<99;nrows++) {
for (ncols=1;ncols<99;ncols++){
/*計算每一個細胞周圍的活的細胞數*/
ncount=orgdata[nrows-1][ncols-1]+orgdata[nrows-1][ncols]
+orgdata[nrows-1][ncols+1]+orgdata[nrows][ncols-1]
+orgdata[nrows][ncols+1]+orgdata[nrows+1][ncols-1]
+orgdata[nrows+1][ncols]+orgdata[nrows+1][ncols+1];
switch(ncount){
/*周圍有3個活細胞,該細胞為生,在屏幕上用黑色像素表示*
case 3: putpixel(ncols+210,120+nrows,black);
resdata[nrows][ncols]=1;break;
/*周圍有2個活細胞,該細胞不變,在屏幕顯示也不變*/
case 2: resdata[nrows][ncols]=orgdata[nrows][ncols];
break;
/*其它情況下,細胞為死,在屏幕上用白色像素表示*/
default:resdata[nrows][ncols]=0;
putpixel(ncols+210,120+nrows,white);
}
}
}
for (i=1;i<99;i++)
for (j=1;j<99;j++) orgdata[i][j]=resdata[i][j];
getch();
}
}
在計算機上運行上述程序,得到迭代次數為45、69、74、78、97、116、119和156時的圖像分別如上圖所示。
在實際模擬時,可以取更多的生命細胞,也可以考慮生命細胞的初始狀態是依一定概率設定的隨機狀態,變化時也可以讓邊緣細胞參與變化。
只要對上述程序略作更改,就會得到另外一系列美妙絕倫的圖案。

『叄』 C 語言 修改一個生命棋生命游戲

用Visual Studio 2008編譯沒有警告或者錯誤啊!

『肆』 請高手用C++編寫程序—生命游戲

#include<iostream>

usingnamespacestd;

#include<time.h>

#defineM70

#defineN20

voidmShow(inta[N+2][M+2])

{inti,j;

for(i=0;i<N;i++,cout<<endl)

for(j=0;j<M;j++)

if(a[i+1][j+1])cout<<'*';

elsecout<<'.';

//cout<<(a[i+1][j+1])?('*'):('');

}

intmJge(inta[N+2][M+2])

{inti,j,k,s,*p[9],b[N][M];

for(i=0;i<N;i++)

{

p[0]=p[4]=p[5]=&a[i+1][1];p[4]--;p[5]++;//123

p[1]=p[2]=p[3]=p[0]-M-2;p[1]--;p[3]++;//405

p[6]=p[7]=p[8]=p[0]+M+2;p[6]--;p[8]++;//678

for(j=0;j<M;j++)

{for(k=1,s=0;k<9;k++)s+=(*p[k]);

b[i][j]=*p[0];

if(s>=3)b[i][j]=1;

elseif(s<2)b[i][j]=0;

for(k=0;k<9;k++)p[k]++;

}

}

for(i=0,s=1;i<N;i++)for(j=0;j<M;j++){a[i+1][j+1]=b[i][j];if(b[i][j]==0)s=0;}

returns;

}

voidmain()

{

inta[N+2][M+2],b[N][M],*p[9];

intt,i,j,k;

for(i=0;i<N+2;i++)for(j=0;j<M+2;j++)a[i][j]=0;

srand((unsignedint)time(NULL));

for(i=0;i<N;i++)for(j=0;j<M;j++){k=rand()%100;a[i+1][j+1]=(k>=77)?(1):(0);}

cout<<"--------T=0--------"<<endl;mShow(a);

k=0;t=0;

while(!k)

{k=mJge(a);t++;

cout<<"--------T="<<t<<"--------"<<endl;mShow(a);

}

}

a數組比實際要的數組大一圈,大出來的一圈永恆等於0,作為邊界,省得計算8連通數據時數組越界

b數組用於計算本次的結果,計算完成後復制、覆蓋a數組中間部分作為結果

主程序做直到所有空間都被活細胞占滿情況停止

以下是設置M=10,N=5的測試部分結果

『伍』 修改一個C語言生命游戲程序

去看看main的參數argc argv[]吧。
可以接受傳入的參數。

『陸』 題目24:用C語言演繹「生命游戲」

#include <graphics.h>
main(){
int orgData[100][100],resData[100][100];/*分別記錄每次迭代的初始和結果狀態*/
int nCount,nRows,nCols,i,j,times; /*times記錄迭代次數/*
int GraphDriver=DETECT,GraphMode;
for (i=0;i<100;i++)/*初始化數據,令每一個細胞為生*/
for (j=0;j<100;j++) orgData[i][j]=1;
initgraph(&GraphDriver,&GraphMode,′′′′); /*初始化屏幕顯示*/
setcolor(WHITE);
rectangle(270,190,370,290); /*作顯示邊框*/
for (times=1;times<200;times++){
for (nRows=1;nRows<99;nRows++) {
for (nCols=1;nCols<99;nCols++){
/*計算每一個細胞周圍的活的細胞數*/
nCount=orgData[nRows-1][nCols-1]+orgData[nRows-1][nCols]
+orgData[nRows-1][nCols+1]+orgData[nRows][nCols-1]
+orgData[nRows][nCols+1]+orgData[nRows+1][nCols-1]
+orgData[nRows+1][nCols]+orgData[nRows+1][nCols+1];
switch(nCount){
/*周圍有3個活細胞,該細胞為生,在屏幕上用黑色像素表示*/
case 3: putpixel(nCols+210,120+nRows,BLACK);
resData[nRows][nCols]=1;break;
/*周圍有2個活細胞,該細胞不變,在屏幕顯示也不變*/
case 2: resData[nRows][nCols]=orgData[nRows][nCols];
break;
/*其它情況下,細胞為死,在屏幕上用白色像素表示*/
default:resData[nRows][nCols]=0;
putpixel(nCols+210,120+nRows,WHITE);
}
}
}
for (i=1;i<99;i++)
for (j=1;j<99;j++) orgData[i][j]=resData[i][j];
getch();
}
}

『柒』 您好,請問生命游戲的逆問題的思路是什麼怎麼編程

真巧,我剛好編過這個程序,給你看看吧!
#include "stdafx.h"
#include "生命游戲.h"
#include "MainFrm.h"
#include "生命游戲Doc.h"
#include "生命游戲View.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMyApp
BEGIN_MESSAGE_MAP(CMyApp, CWinApp)
//{{AFX_MSG_MAP(CMyApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// Standard file based document commands
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyApp construction
CMyApp::CMyApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CMyApp object
CMyApp theApp;
/////////////////////////////////////////////////////////////////////////////
// CMyApp initialization
BOOL CMyApp::InitInstance()
{
AfxEnableControlContainer();
// Standard initialization
// If you are not using these features and wish to rece the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
// Change the registry key under which our settings are stored.
// TODO: You should modify this string to be something appropriate
// such as the name of your company or organization.
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
LoadStdProfileSettings(); // Load standard INI file options (including MRU)
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views.
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CMyView));
AddDocTemplate(pDocTemplate);
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
m_pMainWnd->MoveWindow(0,0,630,730,true);
// The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
// No message handlers
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// App command to run the dialog
void CMyApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}

『捌』 教你如何使用C語言編寫簡單小游戲

編寫程序,實現如下表所示的5-魔方陣。
17

24

1

8

15

23

5

7

14

16

4

6

13

20

22

10

12

19

21

3

11

18

25

2

9

5-魔方陣
問題分析
所謂「n-魔方陣」,指的是使用1〜n2共n2個自然數排列成一個n×n的方陣,其中n為奇數;該方陣的每行、每列及對角線元素之和都相等,並為一個只與n有關的常數,該常數為n×(n2+1)/2。
例如5-魔方陣,其第一行、第一列及主對角線上各元素之和如下:
第一行元素之和:17+24+1+8+15=65
第一列元素之和:17+23+4+10+11=65
主對角線上元素之和:17+5+13+21+9=65

n×(n2+1)/2=5×(52+1)/2=65
可以驗證,5-魔方陣中其餘各行、各列及副對角線上的元素之和也都為65。
假定陣列的行列下標都從0開始,則魔方陣的生成方法為:在第0行中間置1,對從2開始的其餘n2-1個數依次按下列規則存放:
(1)
假定當前數的下標為(i,j),則下一個數的放置位置為當前位置的右上方,即下標為(i-1,j+1)的位置。
(2)
如果當前數在第0行,即i-1小於0,則將下一個數放在最後一行的下一列上,即下標為(n-1,j+1)的位置。
(3)
如果當前數在最後一列上,即j+1大於n-1,則將下一個數放在上一行的第一列上,即下標為(i-1,0)的位置。
(4)
如果當前數是n的倍數,則將下一個數直接放在當前位置的正下方,即下標為(i+1,j)的位置。
演算法設計
在設計演算法時釆用了下面一些方法:
定義array()函數,array()函數的根據輸入的n值,生成並顯示一個魔方陣,當發現n不是奇數時,就加1使之成為奇數。
使用動態內存分配與釋放函數malloc()與free(),在程序執行過程中動態分配與釋放內存,這樣做的好處是使代碼具有通用性,同時提高內存的使用率。
在分配內存時還要注意,由於一個整型數要佔用兩個內存,因此,如果魔方陣中要存放的數有max個,則分配內存時要分配2*max個單元,從而有malloc(max+max)。在malloc()函數中使用max+max而不是2*max是考慮了程序運行的性能。
顯然應該使用二維數組來表示魔方陣,但雖然數組是二維形式的,而由於內存是一維線性的,因此在存取數組元素時,要將雙下標轉換為單個索引編號。在程序中直接定義了指針變數來指向數組空間,即使用malloc()函數分配的內存。

『玖』 如何用C語言製作一個小游戲

這種小游戲其實就是一個大型的while循環。
初始化之後開始游戲,掉入while循環,在while循環裡面的每一回合,得到玩家的滑鼠和鍵盤輸入,通過調用函數更新畫面,輸出畫面,直至玩家選擇退出遊戲,結束while循環,釋放儲存空間,退出遊戲。
想編小游戲的話,可以看看清華大學出版社的《C語言課程設計與游戲開發實踐教程》,基於easyX開發小游戲。

『拾』 如何用c語言編生命游戲程序

寫了這么多,記得追點分啊~~~~~`

這個問題分解為兩部分

1、用什麼方式表示某時刻有哪些細胞是活的
一種簡單的想法是用一個二位數組將某時刻所有的細胞的狀態都記錄下來,不過這樣的內存開銷太大,同時又給細胞網格設定了界限,而且效率也並不高
比較好的做法是用一個線形表int list[][2]來記錄某時刻的所有的活細胞的坐標,同時用一個整數int n記錄當前的活細胞數量

2、如何從某時刻的狀態推導出下一時刻有哪些細胞為活的
根據規則,顯然,某時刻某個細胞是否活著完全取決於前一時刻周圍有多少活著的細胞,以及該時刻該細胞是否活著
因此,推導下一時刻狀態時,根據當前list中的活細胞,可以得到該時刻有哪些細胞是與活細胞相臨的,進而得知這些細胞在該時刻與多少個活細胞相臨,於是可以知道下一時刻有哪些細胞是活的
具體實現時,需要一個能夠儲存坐標並給每個坐標附帶了一個計數器(記錄該坐標的細胞與多少個活細胞相臨)和一個標志(0或1,表示當前該坐標的細胞是活是死)的容器,假設為T,容器T的功能是檢查某個坐標是否在其中,以及向其中添加帶有某個標志某個坐標並將該坐標的計數器清零,以及將某個坐標的計數器累進一

比如,假設已經定義了

struct Container
{
...
};//容器類型
void Clear(Container *T);//清空容器T
int Exist(Container *T,int x,int y);//返回坐標(x,y)是否存在於T中
void Insert(Container *T,int x,int y,int flag);//將標志為flag的坐標(x,y)加入T
void Add(Container *T,int x,int y);//將坐標(x,y)的計數器累加
void Promote(Container *T,int *n,int list[][2]);//將容器中所有計數器值為3的坐標以及所有計數器為2並且標志為1的坐標添加到list中,並將其個數記錄於n

此外,為了方便找出某個坐標的所有相鄰坐標,設置以下方向常量
const int dir[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{-1,1},{1,-1},{-1,-1}};

那麼,從某時刻狀態生成下一時刻狀態的主要代碼如下

...
Container T;
int i,j;
...
Clear(&T);
for (i=0;i<n;i++) Insert(&T,list[i][0],list[i][1],1);
for (i=0;i<n;i++)
for (j=0;j<8;j++)
{
int x,y;
x=list[i][0]+dir[j][0];
y=list[i][1]+dir[j][1];
if (!Exist(&T,x,y)) Insert(&T,x,y,0);
Add(&T,x,y);
}
Promote(&T,&n,list);
...

關於容器T如何實現,一種簡單的思路是用線形表並將元素有序記錄,不過這樣的查找/插入效率難以兼顧
用哈希表的話,最後的Promote很難實現
塊狀鏈表可以兼顧查找與插入的效率,但是寫起來太惡心,效率也不是特別高
個人認為,最佳的解決方案是用平衡二叉搜索樹,常見的AVL樹或者紅黑樹什麼的,不過寫起來也太麻煩。
這里強烈推薦Size Balanced Tree,由中國一位現在讀高二的高中生所發明,原理清晰,效率高,實現簡單

熱點內容
絕地求生未來之役比賽為什麼進不去 發布:2023-08-31 22:07:08 瀏覽:1436
dota2位置什麼意思 發布:2023-08-31 22:00:04 瀏覽:870
lol電競是什麼樣子 發布:2023-08-31 21:58:40 瀏覽:1330
絕地求生八倍鏡的那個圓圈怎麼弄 發布:2023-08-31 21:58:31 瀏覽:1418
lol龍龜一個多少金幣 發布:2023-08-31 21:55:07 瀏覽:780
王者如何改游戲內名稱 發布:2023-08-31 21:55:06 瀏覽:1069
游戲主播打廣告是什麼意思 發布:2023-08-31 21:55:06 瀏覽:1759
絕地求生如何免費拿到ss7賽季手冊 發布:2023-08-31 21:52:13 瀏覽:950
pgg是哪個國家的戰隊lol 發布:2023-08-31 21:52:07 瀏覽:830
一個人的時候才發現游戲很沒意思 發布:2023-08-31 21:49:24 瀏覽:1464