■[Flash]ライフゲームの作り方

 「ライフゲーム」は、イギリスの数学者、ジョン・ホートン・コンウェイ(1937年~)によって考案された生命の誕生、進化、淘汰のプロセスを、ものすごくシンプルな数理モデルで再現したシミュレーションゲームだ。

 過去エントリー「ライフゲーム」でも、紹介したが、たった12行のスクリプトで「ライフゲーム」を作った人がいる。今回は、その「psyark.jp」で公開されているスクリプトを使わさせて頂いた。

 では、その神技とも言えるスクリプトとは、どんな内容なのか?

copyright psyark.jp

 Flashには、「ConvolutionFilter」(たたみ込みフィルタ)の機能がある。ある注目するセルを含めた隣接する、3×3ピクセルの矩形領域の値を行列(matrix)計算することによって変換する。「ConvolutionFilter」は、ふつう、画像にぼかしをかけたり、エンボスをかけたりといった画像処理に使われる。

 「psyark.jp」のスクリプトは、「ライフゲーム」の世代更新計算を、画像処理として扱い、たった12行のスクリプトで実現している。

 「ライフゲーム」の生死を分けるルールは、注目セルが(死:0)の場合は、、それに隣接するまわりのセルに(生:1)が3つあれば、次の世代では、誕生し、注目セルが(生:1)の場合は、隣接するセルに(生:1)が2つ、あるいは3つのときは、そのまま生き残り、継続する。上記以外の場合は、すべて(死:0)となる。ちょうど、「ライフゲーム」も3×3の矩形領域を見ればいいわけね。

ライフゲームのルール

 ルールを整理すると、こんな感じになる。「psyark.jp」のスクリプトの「rule:Array」では、「1」の代わりに、「0x00FF00」(緑の点)を入れている。そのあとに続く、5つの「0」を省略してしまうほど、節約が徹底している。

 それにしても、ふつう「ライフゲーム」を作ろうとしたら、世代のデータを配列に入れて、その配列データから、次世代のデータを作成し……とゆー方法を取るが、すでに、現時点でのデータ=画像であり、ルールを適用したあとのデータ作成を画像処理によって行う、アイデアがすばらしい。しかし、そのアイデアを実現するには、行列計算や、Flashの機能を熟知している必要がある。爺も理解しているとは言えないが、プログラミングの面白さがある。

 爺は、メモリが非常に高価だった、パソコンの黎明期を経験しているが、その頃、ゴルフの「パー」にたとえ、ある機能を実現するのに「Par5」ならば、プログラムの行数を「5行」を「Par」とし、如何に「Par:5行」より、少ない行数でクリアするかを競う記事があった。皆が、バーディや、イーグル、アルバトロスを競っていたわけね。ローマ字かな変換をたった1行で実現するプログラムもあった。

 なんとなく「psyark.jp」のスクリプトは、そんな、職人芸の世界を彷彿とさせる。現在、パソコンの処理速度は向上し、メモリも安くなったので、CPUパワーやメモリを湯水のように使うことができる。書いた本人しか理解できないようなソースよりも、まわりの人が理解できるようなソースの書き方が要求される。でも、メモリ節約という面からだけでなく、効率的なアルゴリズムは、いつの時代でも求められているし、そうして発見されたアルゴリズムは、人類の叡智の結晶なんだよね。

 コンウェイの「ライフゲーム」は、パソコンの登場以前から考えられていたものだけれど、パソコンの登場によって、計算が容易になった。「ライフゲーム」の「生死」を決めるのは、簡単なルールだが、それを5000世代後まで、手計算することは難しい。「ライフゲーム」が面白いところは、初期状態とルールが決まれば、何世代後であろうと、計算可能である、決定論的な世界にもかかわらず、たったひとつの点(生)のあるなしによって、時系列で複雑に絡まり合って、予測が困難なこと。

 で、「ライフゲーム」には、安定した固定型や、二周期でパターンを繰り返す振動型のほかに、グライダーのような移動型、ブリーダーと呼ばれる繁殖型、どんぐり(acorn)のように5000世代を生き延びる長寿型などがある。

GliderGuns

acorn

【遊び方】画面内の任意の場所をクリックして、緑色の点(生命)を配置する(すでに点がある場所をクリックすると、消える)。配置を終えたら[Start]ボタンを押す。ボタンが[Stop]表示になっているとき(ゲーム続行中)に、点を置こうとしても、すぐに消えちゃうことがある。一度、[Stop]ボタンを押して、ゲームを中断してから、点(生命)を配置してね。新しい繁殖型や、長寿型を見つけたら、報告してね^^;