1. 程式人生 > >生命遊戲Java實現

生命遊戲Java實現

關於生命遊戲

之前在學校看到ThoughtWorks舉辦的線下結對程式設計的比賽一等獎是大疆無人機,衝著無人機就拉著實驗室小夥伴馬總一起報了個名。然後題目就是實現一個介面版的生命遊戲,所以才瞭解了生命遊戲。
關於生命遊戲,可以參考維基百科
下圖是效果圖:

規則

生命遊戲中,對於任意細胞,規則如下:
每個細胞有兩種狀態-存活或死亡,每個細胞與以自身為中心的周圍八格細胞產生互動。(如圖,黑色為存活,白色為死亡)
當前細胞為存活狀態時,當週圍低於2個(不包含2個)存活細胞時, 該細胞變成死亡狀態。(模擬生命數量稀少)

當前細胞為存活狀態時,當週圍有2個或3個存活細胞時, 該細胞保持原樣。

當前細胞為存活狀態時,當週圍有3個以上的存活細胞時,該細胞變成死亡狀態。(模擬生命數量過多)

當前細胞為死亡狀態時,當週圍有3個存活細胞時,該細胞變成存活狀態。 (模擬繁殖)
可以把最初的細胞結構定義為種子,當所有在種子中的細胞同時被以上規則處理後, 可以得到第一代細胞圖。按規則繼續處理當前的細胞圖,可以得到下一代的細胞圖,周而復始。

根據上面的規則得出下面的程式碼:

 /**
     * 上一個狀態到下一個狀態的轉移
     * 根據規則可以總結得出兩條規則:
     * 1. 對於周圍活著的細胞為3的情況,下一個狀態該細胞總是為活
     * 2. 對於周圍活著的細胞為2的情況,下一個狀態與上一狀態相同
     */
public void transform(){ int[][] nextMatrix=new int[height][width]; for (int y = 0; y < matrix.length; y++) { for (int x = 0; x < matrix[0].length; x++) { nextMatrix[y][x]=0; int nearNum= findLifedNum(y,x); //等於3,則下一狀態總是活
if(nearNum==3){ nextMatrix[y][x]=1; } //等於2,則與上一狀態一樣 else if(nearNum==2){ nextMatrix[y][x]=matrix[y][x]; } } } matrix=nextMatrix; } /** * 統計每個細胞周圍活著的個數 * @param x 橫座標 * @param y 縱座標 * @return */ public int findLifedNum(int y, int x){ int num=0; //左邊 if(x!=0){ num+=matrix[y][x-1]; } //左上角 if(x!=0&&y!=0){ num+=matrix[y-1][x-1]; } //上邊 if(y!=0){ num+=matrix[y-1][x]; } //右上 if(x!=width-1&&y!=0){ num+=matrix[y-1][x+1]; } //右邊 if(x!=width-1){ num+=matrix[y][x+1]; } //右下 if(x!=width-1&&y!=height-1){ num+=matrix[y+1][x+1]; } //下邊 if(y!=height-1){ num+=matrix[y+1][x]; } //左下 if(x!=0&&y!=height-1){ num+=matrix[y+1][x-1]; } return num; }

實現

首先看我們做的效果,如下圖:

關於初始狀態的輸入

初始狀態是通過檔案載入的方式來實現的,為了載入很多的情況,又寫了一個工具類負責隨機產生case,程式碼如下:

/**
     * 建立測試案例
     */
    private static void createCaseFile() {

        Random random = new Random();
        int rows = 1 + random.nextInt(100);
        int cols = 1 + random.nextInt(100);
        int duration = 200;
        int num = 300;
        File file = new File(cols+"_"+rows+"_"+System.nanoTime() + ".txt");
        PrintWriter writer = null;
        try {
            writer = new PrintWriter(new FileWriter(file));
            StringBuilder sb = new StringBuilder(cols + " " + rows + " " + duration + " " + num);
            writer.write(sb.append("\n").toString());

            //開始逐行初始化
            for (int y = 0; y < rows; y++) {
                sb = new StringBuilder();
                for (int x = 0; x < cols; x++) {

                    if (random.nextInt(3) % 3 == 0) {
                        sb.append("1 ");
                    } else {
                        sb.append("0 ");
                    }
                }
                sb.deleteCharAt(sb.length()-1).append("\n");
                writer.write(sb.toString());
            }


        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                writer.close();
            }
        }

    }

關於介面

使用的Swing程式設計,java的介面做出來確實不咋的。不過我們加入了暫停、繼續功能,這個是通過控制一個變數來做的,每兩幀動畫之間通過執行緒睡眠實現的。核心程式碼如下:

 private class GameControlTask implements Runnable {

        @Override
        public void run() {

            while (!stop) {
                cellMatrix.transform();
                showMatrix();

                try {
                    TimeUnit.MILLISECONDS.sleep(duration);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }

        }
    }

其中cellMatrix代表了一幀的狀態,呼叫transform()將會進行下一次變換,showMatrix負責更新介面。

總結

最後,由於介面比較酷炫,可以支援暫停、繼續功能,程式碼結構比較優美及註釋比較完整,最後和我的小夥伴拿了個無人機,還是挺爽的。
關於程式碼,可以參考TxGameOfLife

相關推薦

生命遊戲Java實現

關於生命遊戲 之前在學校看到ThoughtWorks舉辦的線下結對程式設計的比賽一等獎是大疆無人機,衝著無人機就拉著實驗室小夥伴馬總一起報了個名。然後題目就是實現一個介面版的生命遊戲,所以才瞭解了生命遊戲。 關於生命遊戲,可以參考維基百科。 下圖是效果圖:

資料結構與演算法書中,字謎遊戲java實現

看《資料結構與演算法c實現》書中有個字謎遊戲的作業,用java寫了一份,算是完成書中第一章的課後作業吧。 package test; /**  * 輸入時一些字母和單次,輸出是找出這些單次  * 可以橫豎斜,方向任意  * */ public class PuzzleGam

java實現生命遊戲

一、分析與思考 軟體工程實驗課第一節課讓用java做了一個比較簡單的程式-生命遊戲 1. 遊戲規則 生命遊戲在初始化之後,按照以下規則不斷演化繁殖:每個細胞的‘生’或‘死’由它8個鄰居細胞的狀態決定。 (1)“人口過少”:任何活細胞如果活鄰居少

java 實現猜數字遊戲 隨機給定一個數字,猜大小直到正確

個數字 blog spa 猜數字 style ring imp code ont package com.swift; import java.util.Random; import java.util.Scanner; public class GuessBigSm

java實現的簡單的五子棋小遊戲

import java.util.Scanner; public class Five{ String [][] arr=new String[16][16]; int[] arr1=new int[16]; //函式:給二維陣列賦值為* void show1(){ for

JAVA實現簡單控制檯五子棋遊戲

GobangMain這個類是遊戲的主方法,主要用於控制遊戲的執行,值得注意的是輸入的座標的格式是3,4的樣式,不能是其他的格式,也不能出現空格。 package com.qf.Gobang; import java.util.Scanner; import org.omg.COR

Java實現貪吃蛇小遊戲(附完整原始碼)

今天我就從零開始來完成這個小遊戲,完成的方式也是一步一步的新增功能這樣的方式來實現。 第一步完成的功能:寫一個介面 大家見到的貪吃蛇小遊戲,介面肯定是少不了的。因此,第一步就是寫一個小介面。 實現程式碼如下: 第二步完成的功能:在介面上畫成一格一格的 我們見過的貪吃蛇遊戲

JAVA實現拼圖遊戲

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Life Game生命遊戲的C++實現

因為上了鮑老師的課,每週都要做一次課堂練習。所以大三才想起來開C++的坑= = 程式碼是課上一個半小時寫出來的。難免有考慮不周的地方。如果有什麼問題,請各位不吝賜教~ 首先解釋一下Life Game。開局一張棋盤,隨便放幾個棋子,然後每回合棋盤做一次更新,對棋盤的每個格子來說,看它周圍的

[文件和原始碼分享] 基於JAVA實現的塔防遊戲

塔防遊戲主要代表一類通過在遊戲地圖上裝置炮塔,阻止敵人進攻的策略型遊戲。本遊戲是在地圖上的特定地點裝置多種能力不同的炮臺以抵禦多種怪獸的入侵。同時玩家每場戰鬥將擁有多種道具讓玩家防守更加輕鬆。遊戲原型是【保衛蘿蔔】和【皇城守衛】,總體設計風格和遊戲背景音樂音效向【皇城守衛】靠攏,而遊戲機制是參照了【保衛蘿蔔】

[文件和原始碼分享] 基於JAVA實現的迷宮遊戲

程式開始執行時顯示一個迷宮地圖,迷宮中央有一隻老鼠,迷宮的右下方有一個糧倉。遊戲的任務是使用鍵盤上的方向鍵操縱老鼠在規定的時間內走到糧倉處。 老鼠形象可辨認,可用鍵盤操縱老鼠上下左右移動;迷宮的牆足夠結實,老鼠不能穿牆而過正確檢測結果,若老鼠在規定時間內走到糧倉處,提示成功,否則提示失敗;新增編輯迷宮功能,

CSP20160404-遊戲Java實現

問題描述   小明在玩一個電腦遊戲,遊戲在一個n×m的方格圖上進行,小明控制的角色開始的時候站在第一行第一列,目標是前往第n行第m列。   方格圖上有一些方格是始終安全的,有一些在一段時間是危險的,如果小明控制的角色到達一個方格的時候方格是危險的,則小明輸掉

Java實現24點遊戲

24點遊戲 程式設計要求: 24點遊戲是經典的紙牌益智遊戲。 常見遊戲規則: 從撲克中每次取出4張牌。使用加減乘除,第一個能得出24者為贏。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求程式設計解決24點遊戲。 基本要求: 隨機生成4個代表撲克

java實現人機猜拳小遊戲

通過構建玩家類,計算機類,遊戲類,三個類,實現了簡單的人機猜拳小遊戲。 /** * @author 萬星明 * @version 建立時間:2018年10月20日 下午3:01:09 * 計算機類 */ public class Computer { p

Java過橋遊戲程式碼實現

題目: 過橋遊戲:小明一家過一座橋,過橋的時候是黑夜,所以必須要有燈。現在小明過橋要2分鐘,小明弟弟要5分鐘,小明的爸爸要6分鐘,小明媽媽要9分鐘,小明爺爺要13分鐘,每次此橋最多可以過兩個人,而過橋的速度根據過橋最慢者而定, 而且燈在點燃後40分鐘就熄滅,問小明一家如何過橋時間最短?

Java實現人機猜拳遊戲實現剪刀石頭布功能)

猜拳遊戲 遊戲規則:人和電分別出剪刀、石頭、布,直到人戰勝電腦,遊戲結束。 整體分析: 總體是一個迴圈 ->>>(while迴圈終止條件是人戰勝電腦,break;) 人的出拳數字從鍵盤獲得 ->>>(Scanner) 電腦的

[原始碼和文件分享]基於JAVA實現的紙牌遊戲

1 專案介紹 1.1 背景和目的 單人紙牌遊戲,牌桌上有7個堆共28張牌,第一堆1張牌,第二堆2張,。。。第7堆7張,每一堆的第一張牌朝上,其他朝下。牌桌上還有4個suitpiles,一個deck card堆和一個discard card堆(參考Windows的紙牌遊戲) 設計一個簡單的

【LeetCode-演算法】55. 跳躍遊戲Java實現

題目 給定一個非負整數陣列,你最初位於陣列的第一個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後一個位置。 示例1 輸入: [2,3,1,1,4] 輸出: true 解釋: 從位置 0 到 1 跳 1 步, 然後跳 3 步到達最後

Java實現貪吃蛇遊戲(含賬號註冊登入,排行榜功能)

原文在部落格園:https://www.cnblogs.com/leixiao-/p/9984836.html 這是我第一次工程實踐的作業,選題很多,但我只對其中的遊戲開發感興趣,可遊戲就兩三個型別,最終還是選擇了貪吃蛇。其實就貪吃蛇本身的程式碼實現還算是比較簡單的,可是實踐要求程式碼行達到

[原始碼和文件分享]基於JAVA實現的迷宮鼠迷宮小遊戲

1 功能說明 1.1 問題描述 用JAVA實現電腦鼠走迷宮的程式,一個假想的小車能在圖示的迷宮中穿行輸出其可能的組合式。 1.2 題目要求 根據國際比賽規則,電老鼠走迷宮分為三個階段: 從起點走到終點從終點 進一步遍歷完整個迷宮,獲得整個迷宮的地圖(牆和通路)