最先接觸蘭頓螞蟻是在作參數化的時候,那時候只感受好奇,覺得是很複雜的東西。因無心中看到生命遊戲的 React 實現,因此但願經過蘭頓螞蟻的例子再學習一下 React。git
蘭頓螞蟻的規則很是簡單:github
若是螞蟻位於白色方塊,則向右旋轉 90°,反轉方塊的顏色,而後向前移動一步。 若是螞蟻位於黑色方塊,則向左旋轉 90°,反轉方塊的顏色,而後向前移動一步。算法
以下圖所示:redux
螞蟻在前一百步有必定規律,以後陷入混沌,直到一萬步以後將走出混沌造成一條高速公路。canvas
蘭頓螞蟻和生命遊戲都是元胞自動機的一種,關於蘭頓螞蟻的更多介紹能夠看維基百科app
在本教程中,我主要仍是說一下項目中的問題及難點,不會對整個項目作太詳細的介紹,把代碼粘貼一遍也沒什麼意義,你們能夠本身摸索一遍,其中 Webpack 用了 4.0,順便說一句,Webpack4.0 仍是有很多坑的,項目在 GitHub 中有,遇到問題能夠翻閱一下源代碼佈局
先看一下最終效果的動圖演示:學習
這個項目能夠說是 React + Redux 很是基礎的練習。主要就是繪製網格,根據螞蟻規則重繪網格。如下是項目目錄:spa
src
├── actions
│ └── index.js
├── components
│ ├── app.js
│ ├── button.js
│ └── cell.js
├── containers
│ ├── board.js
│ ├── control.js
│ └── counter.js
├── reducers
│ ├── index.js
│ ├── reducer_board.js
│ ├── reducer_generations.js
│ └── reducer_play_status.js
└── index.js
複製代碼
蘭頓螞蟻演示程序的關鍵就是螞蟻規則的算法,其實算法也很簡單,設置方向變量,模擬螞蟻的前進線路便可。如下是邏輯代碼:
// status: true -> black square
if (gameState[row][col].status) {
gameState[row][col].status = false;
// ant: turnLeft90 -> move forward 1 step
switch (dir) {
case 'T':
ant['pos'] = [row, col - 1];
ant['dir'] = 'L';
break;
case 'B':
ant['pos'] = [row, col + 1];
ant['dir'] = 'R';
break;
case 'L':
ant['pos'] = [row + 1, col];
ant['dir'] = 'B';
break;
case 'R':
ant['pos'] = [row - 1, col];
ant['dir'] = 'T';
break;
default:
}
}
// status: false -> white square
else if (!gameState[row][col].status) {
gameState[row][col].status = true;
// ant: turnRight90 -> move forward 1 step
switch (dir) {
case 'T':
ant['pos'] = [row, col + 1];
ant['dir'] = 'R';
break;
case 'B':
ant['pos'] = [row, col - 1];
ant['dir'] = 'L';
break;
case 'L':
ant['pos'] = [row - 1, col];
ant['dir'] = 'T';
break;
case 'R':
ant['pos'] = [row + 1, col];
ant['dir'] = 'B';
break;
default:
}
}
複製代碼
演示程序的網格若是隻是寫死的話就很是簡單,可是爲了有更好的體驗,我作成了響應式,不管有多少網格,總能所有顯示在屏幕上。看似很簡單的問題,其實有不少能夠學習的地方。
製做響應式網格的方式有不少,好比結合媒體查詢,百分比。爲了效果更好一點,我選擇了百分比。
其次正方形網格也有多種方式實現,好比 vw 單位,百分比+padding。其中使用 vw 單位會有一個問題,就是它的相對父元素是視窗,因此網格老是全屏顯示,比較噁心。最後使用了百分比+padding 的方式。細節方面還使用了 calc 運算。
可是百分比計算的網格存在精度問題,適當放大尺寸能夠解決。
查看在線 Demo:nzbin.github.io/langton-ant…
由於我對 React 的研究不深,因此在這個項目中遇到了一些性能問題,繪製一個 100X100 的網格的話,在 FireFox 中明顯感受到卡頓(與個人機子也有關係),Chrome 表現還能夠。
其實用 canvas 作演示程序可能更好一些,同時跑多個螞蟻也沒有問題。
因各類各樣的緣由,沒想到這篇文章又拖了半年多才寫完,與其說是教程,不如說是對蘭頓螞蟻的介紹,更慚愧的是文章內容不深,沒法幫助更多的初學者。我不是 React 的擁泵,目前專一 Angular,因此關於 React 的譯文以及簡易教程就到此爲止吧。