Highslide for Wordpress Plugin

最近在唸資料結構的書,發現裡面有些很有趣的程式,就挑了幾個來寫,會陸續發表在部落格上,因為功力有限,所以沒有對程式碼做最佳化,高手路過請手下留情@_@

生命遊戲(Game of Life)是由劍橋大學的數學家 John Horton Conway 於 1970 年所提出的。他構想 :一群細胞於平面中以一定的條件成長時,會受到什麼制約?他認為細胞不會無限制的成長,於是他定義細胞在過度孤單與擁擠時會死亡,某一細胞的鄰居包括上、下、左、右、左上、左下、右上與右下相鄰之細胞,遊戲規則如下:

  1. 孤單死亡:如果細胞的鄰居小於一個,則該細胞在下一次狀態將死亡。
  2. 擁擠死亡:如果細胞的鄰居在四個以上,則該細胞在下一次狀態將死亡。
  3. 穩定:如果細胞的鄰居為二個或三個,則下一次狀態為穩定存活。
  4. 復活:如果某位置原無細胞存活,而該位置的鄰居為三個,則該位置將復活一細胞。

關於生命遊戲的wikipedia解釋 請參考

   1: #include <stdio.h>

   2: #include <stdlib.h>

   3: #include <conio.h>

   4: #define size 10

   5: /*將細胞情形輸出的函數*/

   6: void print_out(char n[size][size]);

   7: /*將鄰居個數輸出的函數,非必要(除錯用)*/ 

   8: void print_out2(int n[size][size]);

   9: /*計算鄰居個數的函數*/

  10: void produce_map(char n1[size][size],int n2[size][size]);

  11: /*處理生滅情況的函數*/

  12: void progress(char n1[size][size],int n2[size][size]);

  13: int main()

  14: {

  15:     /*map陣列為鄰居個數表,a為細胞表*/

  16:     int map[size][size]={0},i,j,key=1;

  17:     char a[size][size]={0},b;

  18:     printf("生命遊戲(game of life)為1970年由英國數學家J. H. Conway所提出,\n");

  19:     printf("某一細胞的鄰居包括↑、↓、←、→、↖、↗、↙、↘相鄰之細胞,遊戲規則如下:\n");

  20:     printf("1. 孤單死亡:如果細胞的鄰居小於一個,則該細胞在下一次狀態將死亡。\n");

  21:     printf("2. 擁擠死亡:如果細胞的鄰居在四個以上,則該細胞在下一次狀態將死亡。\n");

  22:     printf("3. 穩定:如果細胞的鄰居為二個或三個,則下一次狀態為穩定存活。\n");

  23:     printf("4. 復活:如果某位置原無細胞存活,而該位置的鄰居為三個,則該位置將復活一細胞。\n");

  24:     printf("\n請按任意鍵開始...\n"); 

  25:     getch();

  26:     do

  27:     {

  28:         i=0;

  29:         j=0;

  30:         system("cls");

  31:         printf("請輸入活細胞的座標(0 0)~(%d %d),(-1 -1)結束輸入\n",size-1,size-1);

  32:         scanf("%d %d",&i,&j);

  33:         a[i][j]='@';

  34:     }while(i!=-1 && j!=-1);

  35:     printf("第%d世代(@-活細胞):\n",key);

  36:     /*將細胞情形輸出*/

  37:     print_out(a);    

  38:     /*先印一次後,利用ASCII碼判斷是否要繼續顯示(y/Y)*/

  39:     do

  40:     {

  41:         key++;

  42:         /*計算鄰居個數*/

  43:         produce_map(a,map);

  44:         /*將鄰居個數輸出,非必要(除錯用)*/ 

  45:         print_out2(map);

  46:         printf("第%d世代(@-活細胞;X-死亡的細胞):\n",key);

  47:         /*處理生滅情況*/

  48:         progress(a,map);

  49:         /*將細胞情形輸出*/

  50:         print_out(a); 

  51:         printf("\n請選擇是否要繼續顯示下一世代(Y/N)?[N]\n");

  52:         b=getch(); 

  53:     }while(b==121 || b==89);

  54:     system("pause");

  55:     return 0;

  56: }

  57: void print_out(char n[size][size])

  58: {

  59:     int i,j;

  60:     printf("┌─");

  61:     for(i=0;i<size-1;i++)

  62:     {

  63:         printf("┬─");

  64:     }

  65:     printf("┐\n");

  66:     for(i=0;i<size;i++)

  67:     {

  68:         printf("│");

  69:         for(j=0;j<size;j++)

  70:         {

  71:             if(n[i][j]!=0)printf("%2c│",n[i][j]);

  72:             else printf(" │");

  73:         }

  74:         printf("\n");

  75:         if(i<size-1)

  76:         {

  77:             printf("├─");

  78:             for(j=0;j<size-1;j++)

  79:             {

  80:                 printf("┼─");

  81:             }

  82:             printf("┤\n");

  83:         }

  84:     }

  85:     printf("└─");

  86:     for(i=0;i<size-1;i++)

  87:     {

  88:         printf("┴─");

  89:     }

  90:     printf("┘\n");

  91: }

  92: void print_out2(int n[size][size])

  93: {

  94:     int i,j;

  95:     printf("┌─");

  96:     for(i=0;i<size-1;i++)

  97:     {

  98:         printf("┬─");

  99:     }

 100:     printf("┐\n");

 101:     for(i=0;i<size;i++)

 102:     {

 103:         printf("│");

 104:         for(j=0;j<size;j++)

 105:         {

 106:             if(n[i][j]!=0)printf("%2d│",n[i][j]);

 107:             else printf(" │");

 108:         }

 109:         printf("\n");

 110:         if(i<size-1)

 111:         {

 112:             printf("├─");

 113:             for(j=0;j<size-1;j++)

 114:             {

 115:                 printf("┼─");

 116:             }

 117:             printf("┤\n");

 118:         }

 119:     }

 120:     printf("└─");

 121:     for(i=0;i<size-1;i++)

 122:     {

 123:         printf("┴─");

 124:     }

 125:     printf("┘\n");

 126: }

 127: void produce_map(char n1[size][size],int n2[size][size])

 128: {

 129:     int i,j;

 130:     /*鄰居陣列初始化*/

 131:     for(i=0;i<size;i++)

 132:     {

 133:         for(j=0;j<size;j++)

 134:         {

 135:             /*清除舊痕跡*/

 136:             if(n2[i][j]==9 && n1[i][j]=='X')

 137:             {

 138:                 n1[i][j]=0;

 139:             }

 140:             n2[i][j]=0;

 141:         }

 142:     }

 143:     /*計算鄰居個數*/ 

 144:     for(i=0;i<size;i++)

 145:     {

 146:         for(j=0;j<size;j++)

 147:         {

 148:             if(n1[i][j]=='@')

 149:             {

 150:                 if(i>0)

 151:                 {

 152:                     if(j>0)n2[i-1][j-1]=n2[i-1][j-1]+1;

 153:                     n2[i-1][j]=n2[i-1][j]+1;

 154:                     if(j+1<size)n2[i-1][j+1]=n2[i-1][j+1]+1;

 155:                 }

 156:                 if(j>0)n2[i][j-1]=n2[i][j-1]+1;

 157:                 if(j+1<size)n2[i][j+1]=n2[i][j+1]+1;

 158:                 if(i+1<size)

 159:                 {

 160:                 if(j>0)n2[i+1][j-1]=n2[i+1][j-1]+1;

 161:                 n2[i+1][j]=n2[i+1][j]+1;

 162:                 if(j+1<size)n2[i+1][j+1]=n2[i+1][j+1]+1;

 163:                 }

 164:             }

 165:         }

 166:     }

 167: }

 168: void progress(char n1[size][size],int n2[size][size])

 169: {

 170:     int i,j;

 171:     /*處理細胞生滅*/

 172:     for(i=0;i<size;i++)

 173:     {

 174:         for(j=0;j<size;j++)

 175:         {

 176:             /*孤單死*/

 177:             if(n2[i][j]<2 && n1[i][j]=='@')

 178:             {

 179:                 n1[i][j]='X';

 180:                 n2[i][j]=9;

 181:             }

 182:             /*復活*/ 

 183:             if(n2[i][j]==3)

 184:             {

 185:                 n1[i][j]='@';

 186:             }

 187:             /*擁擠死*/

 188:             if(n2[i][j]>3 && n1[i][j]=='@')

 189:             {

 190:                 n1[i][j]='X';

 191:                 n2[i][j]=9;

 192:             }

 193:         }

 194:     }

 195: }

以上程式碼效果是利用Windows Live Writer+Code Snippet所達成。

下面提供兩個範例讓大家試玩看看:

範例一:閃爍型(會在兩種狀態切換)

2 1

2 2

2 3

-1 -1

範例二:不斷變換型(在第29世代會達到穩定)

1 6

1 8

2 6

2 7

3 7

-1 -1

Related Posts with Thumbnails
留下迴響