はじめに
どうも、y-tetsuです。
今回、ライフゲームでマトリックス・コード(画面の上から降ってくる緑色のコード)っぽいことをやってみたい!と思い、実際に試してみた結果を残しておきます。
ちなみに、本記事のライフゲームは通常の仕様を少しアレンジしています。詳細は過去に書いた以下の記事をご覧ください。
マトリックス・コードっぽさとは
以下の記事で紹介されている cmatrix
というコマンドの挙動は、コンソール上でマトリックスっぽさを全開していて、とても興味深いです。私も是非ここまでのものを目指したいところです。
さて、普通のライフゲームをコンソール上で実行すると、概ね以下のような動きになると思います。
こいつは、「銀河」と呼ばれるその界隈では名のあるパターンです。
このようなライフゲームの動きや見た目に、以下の3つの"それっぽさ"を加えることでマトリックス・コードに近づけられるのでは、と考えました。
- 色を付ける
- 上から降らせる
- 表示文字を変える
補足として、今回はコマンドプロンプトなどコンソール上での実行を想定しており、その範囲で出来そうな事を挙げています。
色をつける
マトリックス・コードっぽさといって真っ先に思い浮かぶのは、やはりあの緑色ではないでしょうか。
ライフゲームのセル(生きていることを表す"■"のマス目)に緑色を付けることは、マトリックスっぽさの重要な要素だと思います。また、明るい緑から少しずつ暗い緑になるエフェクトも外せません。
以前作った、色進化の設定を活用して、以下のような色の設定を入れるようにします。
elif color_type == 'matrix':
self.color_list = [
'\033[39m', # 0: default
'\033[38;2;200;255;210m', # 1: green1
'\033[38;2;170;242;186m', # 2: green2
'\033[38;2;137;198;150m', # 3: green3
'\033[38;2;137;198;150m', # 3: green3
'\033[38;2;137;198;150m', # 3: green3
'\033[38;2;92;169;108m', # 4: green4
'\033[38;2;92;169;108m', # 4: green4
'\033[38;2;92;169;108m', # 4: green4
'\033[38;2;92;169;108m', # 4: green4
'\033[38;2;92;169;108m', # 4: green4
'\033[38;2;58;109;68m', # 5: green5
'\033[38;2;58;109;68m', # 5: green5
'\033[38;2;5;45;5m', # 6: green6
]
上記はコンソール上の文字に、色を付けるためのエスケープシーケンスをリストにまとめたもので、1つ1つが特定の色を表しています。
ざっくり、新しくセルが生まれる際、上から下に色が進化するイメージです。(同じ色が複数あるのは、秘伝の配合です ※割合を調整したかったためです)
実行した感じは以下のようになりました。
当たり前ですが、一歩前進した感はありますね。
上から降らせる
マトリックス・コードっぽさの2つめは、文字が画面の上から降ってくることだと思います。デジタル雨のようにも呼ばれるようで、上から雨のようにセル群を降らせたいです。
ライフゲームの世界には、移動物体というまっすぐ進む性質の奴がいます。
宇宙船という以下のようなタイプが当てはまります。(ちなみにこいつは「軽量級宇宙船」と呼ばれています)
こいつらを上から下向きにまっすぐ進ませれば、いい感じに使えそうです。
また、上下左右をつなげた世界にアレンジする事で、セルがずっと降り続けるようになるはずです(完成形は最後に取っておきたいと思います)。
表示文字を変える
マトリックスっぽさの3つめは、あの独特の文字ですね。カタカナっぽいのを反転させたものや、よく分からない記号などが様々に散りばめられています。
これを実現するには、表示する文字をある程度ランダムに変えてあげると、それっぽくなりそうです。
これまで作ったコードにはランダムにセル(文字)を表示する機能はないため、新しくオプションを足しました。新しいセルが生まれる(描画する)際は、あらかじめ用意した表示文字からランダムに1つ選び、それを表示するようにします。(実行時に"-rand"を指定すると有効になります)
表示文字はコードにて以下のように設定しました。
self.alives = [
(' ', 0),
('■', 1), ('■', 2), ('■', 3), ('■', 4), ('■', 5),
('■', 6), ('■', 7), ('■', 8), ('■', 9), ('■', 10),
('■', 11), ('■', 12), ('■', 13), ('■', 14), ('■', 15),
('■', 16), ('■', 17), ('■', 18), ('■', 19), ('■', 20),
('≠', 21), ('<', 22), ('e', 23), ('+', 24),
('”', 25), ('Z', 26), ('ハ', 27), ('8', 28),
('I', 29), ('0', 30),
]
本来カタカナは左右反転させたいところですが、難しかったので、左右対称のものをなるべく選びました(記号っぽいものは、そのまま使いました)。また、"■"が多めに含まれてるのは、色の場合と似て、ランダムに選ばれる際の確率を上げるための措置です。
実行した感じは以下の通りです。
通常のセルの"■"以外に、それっぽい文字がちらほら表示されるようになりました。ぽいっちゃあぽい?ですね。
以上で、簡単ではありましたが、筆者の考えたマトリックス・コードっぽさを、大きく3つ実装し終えました。
できたもの
それでは、これまでに実装したマトリックスっぽさの要素を全て組み合わせてみます。
色々と試行錯誤して、最終的にできたものが以下になります。
いかがでしょうか?少しでもマトリックスっぽさを感じていただけたなら、とても嬉しく思います!!
念のため、このパターンは見た目こそ異なりますが、れっきとした「コンウェイのライフゲーム」のルールの範囲内で動いています。
ずっと見ていたい場合は、以下を実行してみて下さい。(Pythonのソースコードはこの記事の下の方にあるGitHubのリンクからダウンロードできます)
> python game_of_life.py rain -c4 -rand -t -d 1 -w 0.04 -l
おわりに
それなりの雰囲気になるまでに、思いのほか苦労しましたが、なんとか形になったかなと思います。
意外なことに、オリジナルに寄せようとするあまり文字だけで表現してしまうと、見事にライフゲーム感とマトリックスっぽさの両方が無くなってしまいました。そこで、"■"を多めに入れて、セルっぽさをしっかり残すことで、今の形に落ち着きました。
心残りは、太字がエスケープシーケンスでうまく制御できなかった部分です。これを入れられると、もう一段マトリックスっぽさを追求できたのですが、Windowsのコマンドプロンプトではどうにも原因がわからず無理でした。
筆者自身、なぜこんなものを作ったのか、実はよく分からないのですが、最近好きになったライフゲームを昔から好きなマトリックスっぽくできて非常に満足しています!
最後までお読みいただきありがとうございました。
なお、ソースコード全体の最新版は以下のGitHubリポジトリにございます。
また、ライフゲームに関する筆者の過去記事も、もし良かったら。