備註:文末有本身用Javascript簡單實現的網頁版細胞自動機(還挺好玩)javascript
細胞自動機(英語:Cellular automaton),又稱格狀自動機、元胞自動機,它是由無限個有規律、堅硬的方格組成,每格均處於一種有限狀態。每格於t時的態由t-1時的一集有限格(這集叫那格的鄰域)的態決定。每一格的「鄰居」都是已被固定的。每次演進時,每格均聽從同一規矩一齊演進。java
固然這個細胞自動機有一個遊戲實現 ------康威生命遊戲(英語:Conway's Game of Life)git
生命遊戲中,對於任意細胞,規則以下:
每一個細胞有兩種狀態-存活或死亡,每一個細胞與以自身爲中心的周圍八格細胞產生互動。(如圖,黑色爲存活,白色爲死亡)github
當前細胞爲存活狀態時,當週圍低於2個(不包含2個)存活細胞時, 該細胞變成死亡狀態。(模擬生命數量稀少)算法
當前細胞爲存活狀態時,當週圍有2個或3個存活細胞時, 該細胞保持原樣。數組
當前細胞爲存活狀態時,當週圍有3個以上的存活細胞時,該細胞變成死亡狀態。(模擬生命數量過多)koa
當前細胞爲死亡狀態時,當週圍有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));
文件導出導入 固然加了擴展功能,保存本身喜歡的細胞自動機成文件。
速度的調整 擴展功能,調整下一步的速度。
戳=>>>>>>>>>>細胞自動機
最新版本的細胞自動機用了koa2進行了重構噢!