生命遊戲


生命遊戲

說明:

生命遊戲(game of life)爲1970年由英國數學家J. H. Conway所提出,某一細胞的鄰居包括上、下、左、右、左上、左下、右上與右下相鄰之細胞,遊戲規則如下:

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

生命遊戲的規則可簡化爲以下,並使用CASE比對即可使用程式實作:

  1. 鄰居個數爲0、1、4、5、6、7、8時,則該細胞下次狀態爲死亡。
  2. 鄰居個數爲2時,則該細胞下次狀態爲穩定。
  3. 鄰居個數爲3時,則該細胞下次狀態爲復活。
代碼:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class LifeGame {
     private boolean[][] map;
     private boolean[][] newmap;

     public LifeGame(int maxRow, int maxColumn) {
         map = new boolean[maxRow][maxColumn];
         newmap = new boolean[maxRow][maxColumn];
     }

     public void setCell(int x, int y) {
         map[x][y] = true;
     }

     public void next() {
         for(int row = 0; row < map.length; row++) {
             for(int col = 0; col < map[0].length; col++) {
                 switch (neighbors(row, col)) {
                     case 0:
                     case 1:
                     case 4:
                     case 5:
                     case 6:
                     case 7:
                     case 8:
                         newmap[row][col] = false;
                         break;
                     case 2:
                         newmap[row][col] = map[row][col];
                         break;
                     case 3:
                         newmap[row][col] = true;
                         break;
                 }
              }
         }
         copyMap();
     }

     public void outputMap() throws IOException {
         System.out.println("\n\nGame of life cell status");
             for(int row = 0; row < map.length; row++) {
                 System.out.print("\n ");
                 for(int col = 0; col < map[0].length; col++)
                     if(map[row][col] == true)
                         System.out.print('#');
                     else
                         System.out.print('-');
            }
     }

     private void copyMap() {
         for(int row = 0; row < map.length; row++)
             for(int col = 0; col < map[0].length; col++)
                  map[row][col] = newmap[row][col];
     }

     private int neighbors(int row, int col) {
         int count = 0;
         for(int r = row-1; r <= row+1; r++)
             for(int c = col-1; c <= col+1; c++) {
                 if(r < 0 || r >= map.length ||c < 0 || c >= map[0].length)
                     continue;
                 if(map[r][c] == true)
                     count++;
             }

        if(map[row][col] == true)
             count--;
        return count;
     }

     public static void main(String[] args) throws NumberFormatException, IOException {
         BufferedReader bufReader = new BufferedReader(new InputStreamReader(System.in));
         LifeGame game = new LifeGame(10, 25);
         System.out.println("Game of life Program");
         System.out.println("Enter x, y where x, y is living cell");
         System.out.println("0 <= x < 10, 0 <= y < 25");
         System.out.println("Terminate with x, y = -1, -1");
         while(true) {
             String[] strs = bufReader.readLine().split(" ");
             int row = Integer.parseInt(strs[0]);
             int col = Integer.parseInt(strs[1]);

             if(0 <= row && row < 10 && 0 <= col && row < 25)
                 game.setCell(row, col);
             else if(row == -1 || col == -1) {
                 break;
             }
             else {
                 System.out.print("(x, y) exceeds map ranage!");
             }
         }

          while(true) {
              game.outputMap();
              game.next();
              System.out.print("\nContinue next Generation ? ");
              String ans = bufReader.readLine().toUpperCase();
              if(!ans.equals("Y"))
                   break;
          }
     }
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章