說明:
生命遊戲是一個零玩家的遊戲,一開始在一個二維陣列的世界中放入一些細胞,而這些細胞會按著規則存活或死亡
規則:
每一個細胞在當前的狀態下,檢查以自己為中心四周供8個細胞數量,依周圍細胞數量來決定下一個狀態是存活還是死亡
- 當周圍低於2個(不包含2個)存活細胞時, 該細胞變成死亡狀態。
- 當周圍有2個或3個存活細胞時, 該細胞保持原樣。
- 當周圍有3個以上的存活細胞時,該細胞變成死亡狀態。
- 當周圍有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(""); } } }
有關生命遊戲詳細的介紹請看這裡
全站熱搜