ライフゲームでマトリックスっぽいことやってみたい！

# はじめに
どうも、y-tetsuです。

今回、ライフゲームでマトリックス・コード(画面の上から降ってくる緑色のコード)っぽいことをやってみたい！と思い、実際に試してみた結果を残しておきます。

ちなみに、本記事のライフゲームは通常の仕様を少しアレンジしています。詳細は過去に書いた以下の記事をご覧ください。

https://qiita.com/y-tetsu/items/264d263717f933ad3cb2


# マトリックス・コードっぽさとは
以下の記事で紹介されている `cmatrix` というコマンドの挙動は、コンソール上でマトリックスっぽさを全開していて、とても興味深いです。私も是非ここまでのものを目指したいところです。

https://zenn.dev/kou_pg_0131/articles/cmatrix-introduction

https://github.com/abishekvashok/cmatrix

さて、普通のライフゲームをコンソール上で実行すると、概ね以下のような動きになると思います。

![galaxy.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653390/4694c1a6-71bf-a2a6-7730-64ebeb927298.gif)

こいつは、「銀河」と呼ばれるその界隈では名のあるパターンです。

このようなライフゲームの動きや見た目に、以下の3つの"それっぽさ"を加えることでマトリックス・コードに近づけられるのでは、と考えました。

- 色を付ける
- 上から降らせる
- 表示文字を変える

補足として、今回はコマンドプロンプトなど**コンソール上での実行**を想定しており、その範囲で出来そうな事を挙げています。


## 色をつける
マトリックス・コードっぽさといって真っ先に思い浮かぶのは、やはりあの**緑色**ではないでしょうか。

ライフゲームのセル(生きていることを表す"■"のマス目)に緑色を付けることは、マトリックスっぽさの重要な要素だと思います。また、明るい緑から少しずつ暗い緑になるエフェクトも外せません。

以前作った、**色進化**の設定を活用して、以下のような色の設定を入れるようにします。

```python
   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つが特定の色を表しています。

ざっくり、新しくセルが生まれる際、上から下に色が進化するイメージです。(同じ色が複数あるのは、秘伝の配合です ※割合を調整したかったためです)

実行した感じは以下のようになりました。

![green.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653390/309d95d4-25c6-3243-0405-202405a4d87a.gif)

当たり前ですが、一歩前進した感はありますね。


## 上から降らせる
マトリックス・コードっぽさの2つめは、文字が画面の上から降ってくることだと思います。**デジタル雨**のようにも呼ばれるようで、上から雨のようにセル群を降らせたいです。

ライフゲームの世界には、移動物体という**まっすぐ進む性質**の奴がいます。

宇宙船という以下のようなタイプが当てはまります。(ちなみにこいつは「軽量級宇宙船」と呼ばれています)

![l-spaceship.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653390/c1c731a7-189a-28ab-e133-79964063ae05.gif)

こいつらを**上から下向き**にまっすぐ進ませれば、いい感じに使えそうです。

また、上下左右をつなげた世界にアレンジする事で、セルがずっと降り続けるようになるはずです(完成形は最後に取っておきたいと思います)。


## 表示文字を変える
マトリックスっぽさの3つめは、あの独特の文字ですね。カタカナっぽいのを反転させたものや、よく分からない記号などが様々に散りばめられています。

これを実現するには、表示する文字をある程度**ランダム**に変えてあげると、それっぽくなりそうです。

これまで作ったコードにはランダムにセル(文字)を表示する機能はないため、新しくオプションを足しました。新しいセルが生まれる(描画する)際は、あらかじめ用意した表示文字からランダムに1つ選び、それを表示するようにします。(実行時に"-rand"を指定すると有効になります)

表示文字はコードにて以下のように設定しました。

```python
    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), ('ｅ', 23), ('＋', 24),
        ('”', 25), ('Ｚ', 26), ('ハ', 27), ('８', 28),
        ('Ｉ', 29), ('０', 30),
    ]
```

本来カタカナは左右反転させたいところですが、難しかったので、左右対称のものをなるべく選びました(記号っぽいものは、そのまま使いました)。また、"■"が多めに含まれてるのは、色の場合と似て、ランダムに選ばれる際の**確率を上げる**ための措置です。

実行した感じは以下の通りです。

![rand.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653390/109a1fca-73bb-6d92-d196-fa3d5450d7de.gif)

通常のセルの"■"以外に、それっぽい文字がちらほら表示されるようになりました。ぽいっちゃあぽい？ですね。

以上で、簡単ではありましたが、筆者の考えたマトリックス・コードっぽさを、**大きく３つ実装**し終えました。


# できたもの
それでは、これまでに実装したマトリックスっぽさの要素を**全て組み合わせて**みます。

色々と試行錯誤して、最終的にできたものが以下になります。

![matrix.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653390/7af18491-088b-7673-1c6d-6c95867d3467.gif)

いかがでしょうか？少しでもマトリックスっぽさを感じていただけたなら、とても嬉しく思います！！

念のため、このパターンは見た目こそ異なりますが、れっきとした「コンウェイのライフゲーム」のルールの範囲内で動いています。

ずっと見ていたい場合は、以下を実行してみて下さい。(Pythonのソースコードはこの記事の下の方にあるGitHubのリンクからダウンロードできます)
```
> python game_of_life.py rain -c4 -rand -t -d 1 -w 0.04 -l
```

# おわりに
それなりの雰囲気になるまでに、思いのほか苦労しましたが、なんとか形になったかなと思います。

意外なことに、オリジナルに寄せようとするあまり文字だけで表現してしまうと、見事にライフゲーム感とマトリックスっぽさの**両方**が無くなってしまいました。そこで、"■"を多めに入れて、セルっぽさをしっかり残すことで、今の形に落ち着きました。

心残りは、太字がエスケープシーケンスでうまく制御できなかった部分です。これを入れられると、もう一段マトリックスっぽさを追求できたのですが、Windowsのコマンドプロンプトではどうにも原因がわからず無理でした。

筆者自身、なぜこんなものを作ったのか、実はよく分からないのですが、**最近好きになったライフゲームを昔から好きなマトリックスっぽく**できて非常に満足しています！

最後までお読みいただきありがとうございました。

なお、ソースコード全体の最新版は以下のGitHubリポジトリにございます。

https://github.com/y-tetsu/game_of_life

また、ライフゲームに関する筆者の過去記事も、もし良かったら。

https://qiita.com/y-tetsu/items/264d263717f933ad3cb2

https://qiita.com/y-tetsu/items/2db7ce8dd2f8884c2028

https://qiita.com/y-tetsu/items/b845f494ffd19450015e