用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();
  }
  }
  在計算機上運行上述程序,獲得迭代次數爲4五、6九、7四、7八、9七、11六、119和156時的圖像分別如上圖所示。
  在實際模擬時,能夠取更多的生命細胞,也能夠考慮生命細胞的初始狀態是依必定機率設定的隨機狀態,變化時也可讓邊緣細胞參與變化。只要對上述程序略做更改,就會獲得另一系列美妙絕倫的圖案。
posted on 2006-03-02 21:44 Aween's Blog 閱讀( ...) 評論( ...) 編輯 收藏

轉載於:https://www.cnblogs.com/aween/archive/2006/03/02/341515.htmlhtml