ラングトンのアリをJavaScriptプログラムで動かす

ラングトンのアリをブラウザで動かしみたい。

そう思ってJavaScriptでプログラムを書きました。

動かし方とコードの解説をしていきます。

ラングトンのアリとは何か

ここは説明不要と思うけど念のため。

次の規則で動くプログラムのことです。

▼ こういうルールで動く

平面が格子状に構成され、各マスが白または黒で塗られる。ここで、1つのマスを「アリ」とする。アリは各ステップで前後左右のいずれかのマスに移動することができる。アリは以下の規則に従って移動する。

白いマスにアリがいた場合、90°右に方向転換し、そのマスの色を反転させ、1マス前進する。
黒いマスにアリがいた場合、90°左に方向転換し、そのマスの色を反転させ、1マス前進する。

この単純な規則で驚くほど複雑な動作をする。当初でたらめな動作をしているが、アリはいずれ例外なく10000歩ほどうろついた後に真っ直ぐな「道」を作る動作に入る。

引用元 : https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%82%B0%E3%83%88%E3%83%B3%E3%81%AE%E3%82%A2%E3%83%AA

たった2つのルールしかないんです。

でもアリは超カオスな動きをしまくります。

 

実際のラングトンのアリの挙動がこちら

あと当チャンネルで解説動画も出しました。

そして上記動画でラングトンのアリを動かしてますが、これはJavaScriptでコードを書いてブラウザ上で実行してます。

そのプログラム例をここで解説です。

1.必要なHTMLとjsファイルを作成

ここでは次の2つを作成します。

  • main.html
  • main.js

次のように空ファイルを作成してください。

▼ 各自のPCで適当なフォルダに以下2つ作成

各自のPCで適当なフォルダにmain.htmlとmain.jsの2つのファイル作成

そしてmain.htmlに以下をコピペします。

▼ 以下をmain.htmlにコピペして保存

これで下準備は完了

2.ラングトンのアリのJavaScript全体コード

そしたらmain.jsの内容について

ここにラングトンのアリのプログラムを書きます。

以下を全てコピペして貼り付けてください。

▼ ラングトンのアリ JavaScriptコード例

大丈夫、これから解説していきます。

3.上記JavaScriptプログラムの解説

ということで上記コードの細かな解説です。

初めに以下の部分で必要な定数定義してます。

コメントを見れば大体分かるはず。

座標を表すのに配列を使っています。上記の Array(GRID_WIDTH*GRID_HEIGHT).fill(0)  ですが幅×高さ分の要素を持つ配列をすべて 0 で初期化するって意味ですね。(参考 : Array() コンストラクター - JavaScript | MDN

それから LOOP_INTERVAL  の定数について

ラングトンのアリが1歩進むたびに描画処理するんですが、その描画間隔をミリ秒で指定できます。1000ミリ秒=1秒なので、100だと0.1秒間隔になります。

 

次にアリの定義がここです。

▼ Antを定義している箇所

アリの今いる座標を this.x this.y  で表し、アリが向いている方向(ベクトル)は this.vec  という配列で表します。アリが白マスを反転させる色は this.color  で表しました。

ちなみにベクトルは次の定義とします。

  • 値が [-1,0] なら左向き
  • 値が [1,0] なら右向き
  • 値が [0,-1] なら下向き
  • 値が [0,1] なら上向き

ベクトルを (x, y) の配列で表現し、左右上下のどこを向いているか定義してるだけです。こうするとアリ移動の処理が楽に書けるので、便宜上こうしてます。

 

そして肝心のstart関数はこうなってます。

▼ 上記コードのstart関数だけ抜粋

コメントを見れば大まかに分かると思う。

でも方向転換の部分は分かりにくいですね。
これは行列に対して回転操作を実行してます。

▼ 例えば90度右回転させる次のコード

▼ これは次のコードを省略したもの

行列の回転については次記事を見てください。

この知識をコードに落とし込んだだけ。三角関数なんか役に立たないと思う人は多いですが、こういう場面で意外に役立ったりします。

 

それから最後に描画関数を定義しました。

▼ 上記コードのdraw関数だけ抜粋

ここについては面倒なので解説しません。

何か不明点があればコメントから聞いてください。

4.ブラウザ上でラングトンのアリを実行

そしたらブラウザ上で動かしてみましょう。

単純にmain.htmlにブラウザからアクセスするだけ

▼ Windowsの場合はこういう感じ

Windowsの場合はこういう感じでmain.htmlをChrome上で実行する

▼ あとは開始ボタンを押すだけ
▼ こういう風にアリを眺められる

あとは開始ボタンを押すだけ。この画像のようにアリが動く様子をブラウザ上で眺められる

初期状態だと座標は1ドット単位です。

見にくいなら拡大ボタンを押してください。

複数のラングトンのアリを召喚する

初期プログラムではアリは1匹だけです。

でもJavaScriptコードを少し改変すれば、
アリをバリエーションを変えて複数匹召喚できます。

▼ 場所を変えて3匹召喚するコード例

必要な分だけアリを召喚可能です。

それから向き変更もできます。

▼ 違う向きのアリを4匹召喚する例

さて、ここで問題です。

アリに反転色(color)を持たせましたが、紹介したコードでは反転色はすべて黒です。この反転色をアレンジできるようにコードを改造してみてください。

答えはあえて載せません。

以上、JavaScriptでラングトンのアリ実装でした。

質問・指摘などはコメント欄からどうぞ。ではまた