【簡單好玩】細胞自動機小遊戲

細胞自動機

備註:文末有本身用Javascript簡單實現的網頁版細胞自動機(還挺好玩)javascript

什麼是細胞自動機

圖片描述

細胞自動機(英語:Cellular automaton),又稱格狀自動機元胞自動機,它是由無限個有規律、堅硬的方格組成,每格均處於一種有限狀態。每格於t時的態由t-1時的一集有限格(這集叫那格的鄰域)的態決定。每一格的「鄰居」都是已被固定的。每次演進時,每格均聽從同一規矩一齊演進。java

固然這個細胞自動機有一個遊戲實現 ------康威生命遊戲(英語:Conway's Game of Life)git

康威生命遊戲規則

生命遊戲中,對於任意細胞,規則以下:
每一個細胞有兩種狀態-存活或死亡,每一個細胞與以自身爲中心的周圍八格細胞產生互動。(如圖,黑色爲存活,白色爲死亡)github

  1. 當前細胞爲存活狀態時,當週圍低於2個(不包含2個)存活細胞時, 該細胞變成死亡狀態。(模擬生命數量稀少)算法

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

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

  4. 當前細胞爲死亡狀態時,當週圍有3個存活細胞時,該細胞變成存活狀態。 (模擬繁殖)函數

能夠把最初的細胞結構定義爲種子,當全部在種子中的細胞同時被以上規則處理後, 能夠獲得第一代細胞圖。按規則繼續處理當前的細胞圖,能夠獲得下一代的細胞圖,周而復始。spa

康威生命遊戲的自由

有了核心的算法(遊戲規則),康威生命就是一個具備生命的自由遊戲。你能夠在遊戲中創造出本身的細胞世界。周而復始。koa2

圖片描述

本身實現的一個生命遊戲

生命遊戲其實並非很複雜,本身實現一個仍是挺好玩的。因此本身就用Vue實現了一個小小的生命遊戲

核心思想

  • 下一步要作什麼,生命遊戲最重要就是下一步,無論遊戲規則是如何,下一步狀態是這個遊戲發展的動力。

    function nextStep(map) {
    let newMap;
        //@TODO對newMap進行核心算法的編寫
    return newMap;
    }

此函數就是遊戲的生命,將遊戲規則編寫進這個函數,Vue只負責渲染這個newMap就行了。

因此咱們有如下函數

function nextStep(map) {
            let new_map = Array(52).fill(Array(52).fill(0)).map((i) => i.map((j) => 0));
            let countAlive = 0;
            for (let i = 1; i < 51; i++) {
                for (let j = 1; j < 51; j++) {
                    countAlive = map[i + 1][j] + map[i - 1][j] + map[i][j + 1] + map[i][j - 1] + map[i + 1][j + 1] + map[i + 1][j - 1] + map[i - 1][j + 1] + map[i - 1][j - 1];
                    if (map[i][j] === 0 && countAlive < 3) {
                        new_map[i][j] = 0;
                    }
                    if (map[i][j] === 1 && 2 <= countAlive && countAlive <= 3) {
                        new_map[i][j] = 1;

                    }
                    if (map[i][j] === 1 && (countAlive > 3 || countAlive < 2)) {
                        new_map[i][j] = 0;
                    }
                    if (map[i][j] == 0 && countAlive === 3) {
                        new_map[i][j] = 1;
                    }
                    countAlive = 0;
                }
            }
            return new_map;
        }

  • 地圖擴展,咱們的Map默認定了一個50*50的二位數組,但是考慮到邊界對細胞算法影響,咱們擴展地圖,將地圖做爲52*52的二位數組。這樣然這個50*50的二位數組最外面包多一層,看控制邊界對細胞算法影響。細胞只在內層50*50數組內繁衍。

let new_map = Array(52).fill(Array(52).fill(0)).map((i) => i.map((j) => 0));

  • 文件導出導入 固然加了擴展功能,保存本身喜歡的細胞自動機成文件。

  • 速度的調整 擴展功能,調整下一步的速度。

實現的效果

hgz70su.gif

Gayhub源代碼,喜歡就給個Star

戳=>>>>>>>>>>細胞自動機


這是一個分割線!

最新版本的細胞自動機用了koa2進行了重構噢!

相關文章
相關標籤/搜索