JavaScriptでセル・オートマトンのワイヤーワールドを作りました。

logisimやマインクラフトで回路を作ったりしていてデジタル回路を学んでいるときに、セル・オートマトンのワイヤーワールドを見つけました。セル・オートマトンでは、コンウェイのライフゲームが有名ですが、このワイヤーワールドは回路図と同じような仕組みなので非常に興味深いです。またライフゲームに比べると規則が非常にシンプルです。

規則

状態

セルは以下の4つの状態のどれかです。色は特に必要なくて、グレースケールなどでも問題ないです。見やすいように、導体(電子が流れるところ)を黄色にして、電子を青赤で表現するのが多いようです。

  • 空(Empty)は黒
  • 導体(Conductor)は、黄色
  • 電子の頭(Electron Head)は、青
  • 電子の尾(Electron Tail)は、赤

世代ルール

世代は単純に、ゲーム中の1ループのことです。

  • 電子の頭は、電子の尾になる
  • 電子の尾は、導体になる
  • 導体は、近傍セル(その導体の周りのセルの事)のうち、1つまたは2つのセルが、電子の頭であった場合、その導体セルは、電子の頭になる

最後がちょっとわかりづらいので画像で説明します。

中央の導体セルから、周り8個を見る

上記図は、中央の導体セルから、周り(近傍きんぼう)の8個のセルを見ると、画像の左側は、青が1つ、画像の右側は青が2つあります。この時に次の世代に進むと、以下画像になります。

注目してほしいのは、中央の導体セルが黄色から、世代ルールにより、青に変わったところです。

たったこれだけのルールですが、これコンピュータが作れます。

まさに電子(Electron)のよう!

ゲームループを動かすと、世代ルールが適用されて電子の頭(青)と電子の尾(赤)が移動しているのが分かります。

 

ダイオード

 

NOT回路・インバーター

確かに、世代ルールが適用されて、電子が流れなくなるので、NOT回路と同じになります。ですがこれだけ単純だと不思議な感じがします。

 

ソースコードをもう少し綺麗にしたらデモもアップロードしようと思います。現在のソースコードはgithubにアップロードしました。

ソースコード

https://github.com/dev001hajipro/wireworld

参考資料

ゲートICやレジスターを作るには以下が参考になりそうです。

https://www.quinapalus.com/wi-index.html

ワイヤーワールドでデジタル回路のNOT回路やOR回路など基本的なものを作るときの参考になりそうです。

http://karlscherer.com/Wireworld.html