本世紀70年代,人們曾瘋魔一種被稱作“生命游戲”的小游戲,這種游戲相當簡單。假設有一個像棋盤一樣的方格網,每個方格中放置一個
生命細胞,生命細胞只有兩種狀態:“生”或“死”。游戲規則如下:
1. 如果一個細胞周圍有3個細胞為生(一個細胞周圍共有8個細胞),則該細胞為生,即該細胞若原先為死,則轉為生,若原先為生,則保
持不變;
2. 如果一個細胞周圍有2個細胞為生,則該細胞的生死狀態保持不變;
3. 在其它情況下,該細胞為死,即該細胞若原先為生,則轉為死,若原先為死,則保持不變。
依此規則進行迭代變化,使細胞生生死死,會得到一些有趣的結果。該游戲之所以被稱為“生命游戲”,是因為其簡單的游戲規則,反映了
自然界中的生存規律:如果一個生命,其周圍的同類生命太少的話,會因為得不到幫助而死亡;如果太多,則會因為得不到足夠的資源而死亡。
用計算機模擬這個“生命游戲”也相當簡單,可以用一個M×N像素的圖像來代表M×N個細胞,其中每一個像素,代表一個細胞,像素為黑色
表示細胞為生,像素為白色代表細胞為死。
設定圖像中每個像素的初始狀態后依據上述的游戲規則演繹生命的變化,由于初始狀態和迭代次數不同,將會得到令人嘆服的優美圖案。
下面給出的小程序是用TC2.0編寫。演示100×100個生命細胞初始狀態全為生時的變代情況,變化時邊緣細胞不參與變化。隨著迭代次數的不
同,在屏幕顯示的圖案精彩紛呈,像萬花筒般引人入勝。
。nclude
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[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]
。玱rgData[nRows-1][nCols+1]+orgData[nRows][nCols-1]
+orgData[nRows][nCols+1]+orgData[nRows+1][nCols-1]
。玱rgData[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;
。渌闆r下,細胞為死,在屏幕上用白色像素表示*/
default:resData[nRows][nCols]=0;
putpixel(nCols+210,120+nRows,WHITE);
}
}
}
for (i=1;i<99;i++)
for (j=1;j<99;j++) orgData[j]=resData[j];
getch();
}
}
在計算機上運行上述程序,得到迭代次數為45、69、74、78、97、116、119和156時的圖像分別如上圖所示。
在實際模擬時,可以取更多的生命細胞,也可以考慮生命細胞的初始狀態是依一定概率設定的隨機狀態,變化時也可以讓邊緣細胞參與變化。
只要對上述程序略作更改,就會得到另外一系列美妙絕倫的圖案。
聊城網絡公司提供