說明:

生命遊戲是一個零玩家的遊戲,一開始在一個二維陣列的世界中放入一些細胞,而這些細胞會按著規則存活或死亡

規則:

每一個細胞在當前的狀態下,檢查以自己為中心四周供8個細胞數量,依周圍細胞數量來決定下一個狀態是存活還是死亡

  1. 當周圍低於2個(不包含2個)存活細胞時, 該細胞變成死亡狀態。
  2. 當周圍有2個或3個存活細胞時, 該細胞保持原樣。
  3. 當周圍有3個以上的存活細胞時,該細胞變成死亡狀態。
  4. 當周圍有3個存活細胞時,該細胞變成存活狀態。

JAVA:

import java.util.Arrays;
import java.util.Random;

public class LifeGame {
    private int[][] tab;
	
    public static void main(String[] args){
        int [][] tab; //宣告棋盤變數
        int [][] nextTab; //儲存棋盤下一次的樣子
        LifeGame lifeGame = new LifeGame(20, 20); //建立指定大小棋盤
        tab = lifeGame.newTab(); //以亂數填入棋盤初始值
        lifeGame.print(tab); //印出初始棋盤
        System.out.println();
        nextTab = lifeGame.nextTab(tab); //計算下一次的樣子

       //比對目前及下一次的陣列是否相等,如果相等表示走不下去並結束遊戲
       //反之則印出下一次棋盤,並再計算下一次的樣子
        while(!Arrays.deepEquals(tab, nextTab)){
            lifeGame.print(nextTab);
           System.out.println();
            tab = nextTab;
            nextTab = lifeGame.nextTab(tab);
        }
    }
	
    //建立指定大小棋盤
    public LifeGame(int rowSize, int cellSize){
        this.tab = new int[rowSize][cellSize];
    }
	
    //用亂數方式在棋盤上放上 0 與 1 的初始值
   private int[][] newTab(){
       Random ran = new Random();
       //用雙層迴圈走過陣列中每一個點
        for(int i=0; i<tab.length; i++){
            for(int j=0; j<tab[i].length; j++){
                //在點中放入 0 或 1 的值做為生命初始值
                this.tab[i][j] = ran.nextInt(2);
            }
        }
        return this.tab;
    }
	
    private int[][] nextTab(int[][] tab){
       //用以存方下一次的棋盤樣貌
        int[][] nextTab = new int[tab.length][tab[0].length];
       //計算生命數
        int count;
		
       //用雙層迴圈方式掃描棋盤每一個點
        for(int i=0; i<tab.length; i++){
            for(int j=0; j<tab[i].length; j++){
                //以一個算為中心,計算周圍八個點的生命數,用雙層迴圈方式掃描
                count = 0;
                for(int x=-1; x<=1; x++){
                    for(int y=-1; y<=1; y++){
                       //將周圍八個點的=生命數加到計數的變數裡
                       //(i+x >= 0 && j+y >= 0) && (i+x < tab.length && j+y < tab[i].length) 為判斷點是否超出棋盤外
                       //!(x == 0 && y == 0) 為排除中心點
                        if((i+x >= 0 && j+y >= 0) && (i+x < tab.length && j+y < tab[i].length) && !(x == 0 && y == 0)){
                            count += tab[i+x][j+y];
                        }
                    }
                }

               //中心點下一次的狀態
                if(count == 2){ //加總為 2 時等於原樣
                    nextTab[i][j] = tab[i][j];
                }else if(count == 3){ //加總為 3 時生出新生命
                    nextTab[i][j] = 1;
                }else{ //其它狀態生命死亡
                    nextTab[i][j] = 0;
                }
            }
        }
		
        return nextTab;
    }
	
   //將棋盤顯示到畫面上
   private void print(int[][] tab){
        try {
           //每次印出前暫停 100 毫秒
            Thread.sleep(100);
        } catch (InterruptedException e) {	
        }
        System.out.println();
        for(int i=0; i<tab.length; i++){
            for(int j=0; j<tab[i].length; j++){
                System.out.print(tab[i][j]==0 ? ". " : "# ");
            }
            System.out.println("");
        }
    }
}

有關生命遊戲詳細的介紹請看這裡

arrow
arrow
    全站熱搜

    taurus770423 發表在 痞客邦 留言(1) 人氣()