說明:
生命遊戲是一個零玩家的遊戲,一開始在一個二維陣列的世界中放入一些細胞,而這些細胞會按著規則存活或死亡
規則:
每一個細胞在當前的狀態下,檢查以自己為中心四周供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("");
}
}
}
有關生命遊戲詳細的介紹請看這裡
文章標籤
全站熱搜

你好,我對此程式很有興趣,但我是初學者,求每部分能加上註解嗎?感謝
已為程式補上註解,如有問題歡迎詢問喔