1. 程式人生 > >生命遊戲的三種玩法

生命遊戲的三種玩法

cas none 版本 clas lose .com size 一個接一個 max

生命遊戲

每個細胞有兩種狀態——存活或者死亡,每個細胞只與以其自身為中心的細胞產生互動。

當細胞為死亡狀態,若周圍有3個存活細胞,則該細胞變成存活狀態(模擬繁殖)

當細胞為存活狀態,若周圍有2個或3個存活細胞,保持原樣

    若周圍有3個以上存活細胞,該細胞變成死亡(模擬極度擁擠)

    若周圍有低於2個一下存活細胞,該細胞死亡(模擬人口稀疏)

這個遊戲也叫康威生命遊戲、細胞自動機、元胞自動機等。

圖案介紹

“脈沖星”:它周期為3,看起來像一顆爆發的星星

技術分享圖片

“滑翔者”:每4個回合它會延右下方移動一格,雖然細胞早就不是原來的細胞,但它能保持原來額形狀

技術分享圖片

“輕量級飛船”:它周期為4,每兩個“回合”向右走一格

技術分享圖片

“滑翔者槍”:它會不斷的產生一個有一個“滑翔者”

技術分享圖片

“繁殖者”:它會向右進行,留下一個接一個的“滑翔者槍”

技術分享圖片

C/C++實現

用C/C++模擬了最簡單的規則,代碼

技術分享圖片
  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<time.h> 
  4 
  5 const int DATH = 0;
  6 const int ALIVE = 1;
  7 const int maxn = 50;
  8 const int maxr = 100,maxl = 100;
  9 const int dx[] = { -1
,-1,-1,0,1,1,1,0 }, dy[] = { -1,0,1,1,1,0,-1,-1 }; 10 11 int map[maxr][maxl], newmap[maxr][maxl]; 12 int m, n, general = 0;; 13 14 //初始化,生成隨機數(無法避免隨機數的浪費) 15 void rule1() 16 { 17 srand(time(NULL)); 18 for(int i = 0;i < m;i++) 19 for (int j = 0; j < n; j++) 20 map[i][j] = rand() % 2
; //假設約n/2 21 } 22 23 //"脈沖星",周期為3 24 void rule2() 25 { 26 for (int i = 0; i < m; i++) 27 for (int j = 0; j < n; j++) 28 map[i][j] = 0; 29 map[4][2] = map[5][2] = map[6][2] = 1; 30 map[4][7] = map[5][7] = map[6][7] = 1; 31 map[2][4] = map[2][5] = map[2][6] = 1; 32 map[7][4] = map[7][5] = map[7][6] = 1; 33 34 map[10][2] = map[11][2] = map[12][2] = 1; 35 map[10][7] = map[11][7] = map[12][7] = 1; 36 map[9][4] = map[9][5] = map[9][6] = 1; 37 map[14][4] = map[14][5] = map[14][6] = 1; 38 39 map[4][9] = map[5][9] = map[6][9] = 1; 40 map[4][14] = map[5][14] = map[6][14] = 1; 41 map[2][10] = map[2][11] = map[2][12] = 1; 42 map[7][10] = map[7][11] = map[7][12] = 1; 43 44 map[10][9] = map[11][9] = map[12][9] = 1; 45 map[10][14] = map[11][14] = map[12][14] = 1; 46 map[9][10] = map[9][11] = map[9][12] = 1; 47 map[14][10] = map[14][11] = map[14][12] = 1; 48 } 49 50 //計算(x,y)周圍存活細胞的個數 51 int neighbor_num(int x, int y,int map[][maxl]) 52 { 53 int cnt = 0; 54 for (int i = 0; i < 8; i++) 55 { 56 int nx = x + dx[i], ny = y + dy[i]; 57 if (nx >= 0 && nx < m && ny >= 0 && ny < n && map[nx][ny]) cnt++; 58 } 59 return cnt; 60 } 61 62 //打印第i代的結果 63 void print_general() 64 { 65 printf("第%d代:\n", general); 66 for (int i = 0; i < m; i++) 67 { 68 for (int j = 0; j < n; j++) 69 if (map[i][j]) printf(""); 70 else printf(""); 71 printf("\n"); 72 } 73 } 74 75 //將map復制到tmp_map 76 void copy_map(int map[][maxl], int tmp_map[][maxl]) 77 { 78 for (int i = 0; i < m; i++) 79 for (int j = 0; j < n; j++) 80 tmp_map[i][j] = map[i][j]; 81 } 82 83 //得到下一代 84 void iteration() 85 { 86 int tmp_map[maxr][maxl]; 87 copy_map(map, tmp_map); //保存之前圖像,使得當前元素狀態的改變還是基於之前的地圖,而不是被修改了的 88 for(int i = 0;i < m;i++) 89 for (int j = 0; j < n; j++) 90 { 91 int cnt = neighbor_num(i, j, tmp_map); 92 switch (cnt) 93 { 94 case 2: continue; 95 case 3: map[i][j] = ALIVE; break; 96 default: map[i][j] = DATH; break; 97 } 98 } 99 100 general++; 101 print_general(); 102 } 103 104 int main() 105 { 106 scanf("%d%d", &m, &n); 107 rule1(); 108 print_general(); 109 while (1) 110 iteration(); 111 112 return 0; 113 }
View Code

Excel中的VBA實現

某位大神寫的,自帶滑翔機,鏈接

模擬軟件Golly

自帶各種規則和圖案,體驗感極好,當然也可以編寫規則和圖案,貼吧裏有一些教程,鏈接

各種版本的下載鏈接:http://golly.sourceforge.net/

附(其生成的一些有趣圖片):

官網logo

技術分享圖片

謝賓斯基三角形

技術分享圖片

柔和的曲線

技術分享圖片

生命遊戲的三種玩法