Alife(人工生命)をScratchで作ってみよう
人工生命の簡単なモデルであるライフゲームをScratchで作ってみましょう。ライフゲームは平面のマス目上に配置された”生命”のパターンが、まわりの状態によって増えたり、減ったりするのをシミュレートするプログラムです。
ライフゲームは、次のような簡単なルールによって生命の振る舞いをシミュレートします。すなわち、生きたセルは、上下左右、斜めを含んだ8マスのうち、2個または3個に生きたセルがあると生き残り、それ以外の場合は消滅してしまいます。また、空白のセルのまわりにちょうど3つの生きたセルがあると、新しいセルが生まれます。
たったこれだけのルールですが、ルールにしたがってセルを増やしたり、減らしたりしていくと、あたかも粘菌のような生物が平面上で活動しているような様子を見ることができます。
ライフゲームの動きをよく見ていくと、いくつか特徴を持ったパターンがあらわれるのに気が付きます。
例えば、次のようなパターンはルールによって変化せず、周りから別のセルが近寄ってきて飲み込まれたりしない限りは、ずっと変わりません。
また、次のパターンでは、横のパターンと縦のパターンを交互に繰り返します。このような安定したパターンからは、私たちはあまり生命を見ている感じを受けることはありませんね。
一方で「グライダー」と呼ばれる次のパターンでは、セルは形を変えながら一方向に移動していきます。このようなパターンからは、生命が移動しているような感覚や、デザインされたシステムを見ているような印象を受ける人がいるかも知れません。
グライダーのパターンは、上の動画の0:39あたりで発生するので、ぜひ探してみてください。
さて、ライフゲームのScratchでの実装は少し大変です。ライフゲームでは、セルの増減のルールの適応を、すべてのマスに対して一斉に計算してから、その後で各マスに反映させる、という流れで行います。
これは、セルの状態を2次元配列に格納して行うと簡単にできますが、Scranchでは1次元の配列しかありませんので、1次元配列を決まった長さで折り返して2次元配列を表現するような工夫が必要となってきます。
また、ルールの適用計算は、各マスのクローンに同時並行で行わせたいので(そうしないと、1世代を計算するのにすごく時間がかかります)、これが一つの世代の中で過不足なく行われるようにタイミングをそろえてあげる必要があります。
意外と苦労の多い実装にはなりますが、Scratchの挙動を理解したり、ロジカルなプログラミングができるようになる練習としても良い題材だと思いますので、ぜひ挑戦してみてください。