セルオートマトン(Cellular Automaton)のよく知られた例は「ライフゲーム」であるが、一次元セルオートマトンは、もっともシンプルな形のライフゲームとも言える。
ステッパーの数値(ルール)を変えて、[Start]ボタンを押すと、さまざまな模様が描かれる。この点(セル)ひとつひとつを生物とみなし、隣り合う環境によって生死が決まる簡単なルールを適用すると、世代を追うごとに、どのように変化するかを見ることができる(おすすめは、ルール90、110、120、150など)。
以下は、爺のFlash製作メモ。興味のある人だけ読んでね。
●配列の頭と尻尾をつなげる
![Ca_001 Ca_001](http://gascon.jp/wp00/wp-content/uploads/2017/02/ca_001.png)
第1世代のセルは、点のあるなしを「1」と「0」で表し、それを360個(ステージの横幅)つなげて配列に格納する。で、次の世代は、注目するセルの前後(3つのセル)の状態をルールに照らし合わせて決める。そこで問題となるのは、配列の始まりと終わりのセルだ。頭と尻尾をつなげて「輪っか」にする必要がある。
![Ca_002 Ca_002](http://gascon.jp/wp00/wp-content/uploads/2017/02/ca_002.png)
配列の0番目と、配列の最後(配列の長さ)を特別扱いにする手もあるけれど、余計な手順が増えてしまう。そこで、配列の長さを「L」、注目するセルの番号を「N」とすると、以下の計算式で求めることができる。
left = (N + L – 1) % L
right= (N + 1) % L
※「%」は、剰余(割り算の余り)を求める演算子
●ルールを適用して次の世代を作る
![Ca_003 Ca_003](http://gascon.jp/wp00/wp-content/uploads/2017/02/ca_003.png)
自分と前後のセルを合わせた、3つのセルが取り得る値は、全部で8通り。ま、あたり前ちゃ、あたり前。なぜなら、3つのセル(3ビット)で表すことのできる数は、0~7までの8通りだから。
たとえば、セルの[1,1,1]の並びを、二進数(111)として、十進数に変換すると、
1*(2^2)+1*(2^1)+1*(2^0)
=1*4+1*2+1*1
=4+2+1
=7
いっぽう、ルールは 8ビットで、ルール「146」なら、二進数(10010010)になるが、これを桁の小さいほうから順番に、配列に格納しておく。
myRule = (0,1,0,0,1,0,0,1)
配列の番号は、左から、0番目、1番目…7番目となる。つまり、3つのセルの状態から、生死を決定するルールを取りだし、次の世代を作ることができるわけ。
![Ca_004 Ca_004](http://gascon.jp/wp00/wp-content/uploads/2017/02/ca_004.png)
新しい次の世代も配列(newGene)を用意しておき、一度、配列に格納してから、世代ごとに描画する。
■Flash8のソース(cellular_automaton.zip)
![Ca_005 Ca_005](http://gascon.jp/wp00/wp-content/uploads/2017/02/ca_005.png)
第1世代は、ランダムに決定しているが、第1世代を点1個にして、ルール90を適用させると、シェルピンスキーのギャスケットになる。