※この記事はUdon Advent Calendar 2024 - Adventarの4日目の記事です。
はじめに
ライフゲームというものがあります。とりあえずWikiを載せておきます。
1970年に考案されたゲームで、以下のルールに従って進行します。
- 各セルは「生物がいる」「生物がいない」という二つの状態を持つ。
- 各セルは周りの8つのセルの状態に応じて、世代ごとに以下のように変化する。
- 生物がいるセル
- 周囲の生物が2つか3つの場合、その世代は次の世代でも生き残る。
- それ以外の場合、次の世代ではその生物は死滅する。
- 生物がいないセル
- 周囲の生物がちょうど3つの場合、次の世代ではそのセルに生物が誕生する。
- 生物がいるセル
初期状態を設定することによって、その後の各世代の状態は一意に決まることとなります。
また、チューリング完全ということが知られています。つまり、すべての計算行為がライフゲームの内部で作ることができるということです。詳細は難しいのでここでは割愛します。
大学1年生の時、C言語を用いてライフゲームを作ったのですが、まだ開発に慣れていなかったこともあり、ひどい出来でした。
なので、この機会に慣れているPythonに書き直し、実行状況がわかりやすいようにPygameを用いて実装しました。
できたもの
リポジトリは以下の通り。
使い方はREADME.md
に書いてある通りなのですが、一応ここでも書いておきます。
使い方
まず、上記のリポジトリをクローンします。
git clone https://github.com/Gitudon/lifegame_with_pygame.git
クローンしたら、以下のパスを通してください。
"~/lifegame_with_pygame/bin"
通したら、以下のコマンドが実行されます。
lifegame
これによって、以下のような画面が表示されます。
左側はセルです。数としては50×50ですね。実行モード(後述)でない場合にクリックすると、そのセルの状態が反転するようになっています。
このように、自由に初期状態を設定することができます。
右側には様々なボタンがあり、それぞれ以下の機能を実現します。
-
Start
: 実行モードを開始する。 -
Stop
: 実行モードを停止する。 -
Reset
: セルの状態を初期状態に戻す。 -
Next
: 世代を1つ進める。 -
Color
: セルの色を変更する。色は7種類。 -
Load
: 設定されたテンプレートからセルの状態を読み込む。 -
Quit
: ゲームを終了し、ウィンドウを閉じる。
実行モードに入ると、0.15秒ごとに世代が1つ進みます。ゆっくりと見たい場合は、Next
ボタンを連打するとよいです。
Load
によって読み込む場合、以下のように7つのテンプレートから選択できます。これらは動きが面白いものから選んでいます。
実行にはPygame
を用いていますが、lifegame
コマンドを実行する際に自動的にpip
でインストールされるようになっています。
終わりに
結構良い感じに実装てきたと思いますが、今後の展望としては以下のようなものがあると思います。
- Webアプリ化(クローン→パス通す→実行 という流れは冗長)
- 自分で作った初期状態を保存できる機能
- ほかの人と作ったテンプレートを共有できる機能
- 実行速度調整機能
これらは今後の課題として取り組んでいきたいと思います。
余談
実はこのリポジトリ自体は9月終わりに完成していたものでした。しかし、APの対策やら大学関係のタスクとやらで、なかなか記事にまとめていませんでした。
いい機会だったので、Advent Calendarのタイミングで記事にしてみた、という感じです。
ではまた明日の記事でお会いしましょう。