見出し画像

#93 Life Game

 ライフゲームは、生命群のシミュレーションゲームです。二次元の格子状のフィールドに、空白のセルと生命体を表すセルを配置し、単純なルールのもとで各セルの次の世代での生死を決定します。詳細は、Wikipediaを参照してください。

単純なルールにも関わらず、複雑な模様ができる様子は、現実の自然界に近しいものを感じます。学術的には、セル・オートマトンという分野で研究がなされています。

 ライフゲームのプログラム自体はそれほど難しいものではありません。Pythonで作ってみました。


lifegame.py

 プログラムはGitHubで公開しています。

main.pyを実行するとゲームがスタートします。config.pyでゲームの設定が変更できます。

$ python3 main.py
Iteration: 0
+---------------------------------------------------------------------------------------------------+
|*|*| |*|*| | | | |*| | | | |*|*| |*|*|*|*| | | | |*|*| | | | | | | |*|*| |*| | | |*|*|*| | |*|*|*|*|
|*|*| |*|*|*|*|*|*| | |*|*| |*|*|*| | |*|*| |*| |*| |*| | |*| | |*| | |*| |*|*| |*|*|*|*| | | | | |*|
| |*|*|*|*|*| | |*|*|*|*|*| | |*| |*|*| | |*|*|*|*|*| |*|*|*| |*| |*|*| |*| | | | |*|*|*| | | |*| | |
|*| |*|*| | | |*|*| | |*| |*| | |*| | |*|*| | | |*| | |*|*| |*|*|*| | |*| |*| |*| |*|*|*|*| | |*| |*|
|*| |*|*| |*|*|*| |*|*| | | | | | | |*| |*| |*|*|*| | |*|*| | | | | |*|*|*| | |*|*|*|*|*|*| |*|*|*|*|
| |*|*| |*| |*|*| |*| |*|*|*| |*| | | |*|*|*|*| |*| |*| |*| | |*|*|*| |*|*|*|*| | | |*| |*| |*| |*|*|
|*| |*| |*|*| | |*|*|*| |*|*|*|*| |*| |*| | | | | | |*| |*| | |*| | | | |*| | |*| | |*| | | |*| |*| |
|*| |*|*| | |*| | | | |*|*| |*| |*|*| | |*|*|*|*| | |*| | | |*|*| |*| | |*| |*| | |*|*|*| | |*| | | |
|*|*| | | | |*|*| |*|*|*|*|*|*| | | | |*| |*|*|*|*| | |*|*|*|*| |*|*| | | | |*| | | |*| |*| |*| | |*|
|*|*|*| |*| | | |*|*|*| |*|*| | | | |*| |*|*|*|*| | |*| |*|*|*|*|*| | | | |*| | |*| | | | | | |*|*|*|
|*| | | |*| | | | | |*| |*| |*|*| |*|*| |*| | |*|*|*| | | | |*|*| | |*|*| |*|*|*|*| | | |*| |*|*| |*|
| | |*| |*|*| | | |*| | | |*| |*|*| | |*| | | | | |*| |*|*|*| | | |*| | |*|*|*|*| | | |*| |*|*|*|*|*|
| |*| |*|*| |*| |*|*|*|*| | |*|*| |*| | |*|*|*|*|*|*|*| |*| |*| | | | | | | | |*|*|*| | | |*|*|*|*|*|
| |*|*| |*| | |*|*|*|*|*|*|*| |*| |*|*| | |*| | | |*| |*| | |*| |*| |*|*| |*| |*|*|*| | |*|*| | |*|*|
| | | |*| | | |*| |*|*| | |*|*| | | | |*|*| |*|*| | |*| |*| | | |*| | | |*| |*| |*|*|*| | |*| | | |*|
| | | |*| |*| |*| | |*| | | |*| | |*|*|*| |*|*|*|*|*|*|*|*|*|*| |*| | |*|*| |*|*|*|*|*|*| | | |*| |*|
| |*| |*| | | |*|*| | | |*| | | | | |*| | |*| |*|*| |*| |*|*|*| |*|*| |*|*| |*|*| | | |*| |*|*|*| |*|
| |*| | | | |*|*|*|*| |*| |*|*|*|*|*|*|*|*| |*| | | |*|*|*| | | | | |*|*| | |*|*| |*|*|*| | |*|*|*|*|
|*|*| | | |*| |*| | |*| |*|*| |*|*|*|*| |*| | |*|*|*| |*| |*|*|*| |*|*| | |*|*| | |*|*| | | | | | |*|
|*| | | |*|*| | |*| | | | |*| | |*| | | | |*|*|*|*|*|*| | | |*| |*|*| |*|*| |*| | |*|*|*|*| |*| |*| |
|*| | | | |*|*| | | |*|*| |*|*| |*| | |*| | |*| | |*|*|*| | | |*|*| |*|*|*|*|*|*| | | |*| | | |*|*| |
|*|*| | | |*| | | | | | |*|*|*|*|*|*|*| |*| |*| | | | |*| |*| |*|*| |*| |*|*| |*| | |*| |*| |*|*|*|*|
|*|*| |*| | |*| |*|*| | | |*| |*| | |*|*| |*|*| | |*|*|*|*|*|*|*|*| | | | | |*| |*| |*|*|*|*| | | | |
| | |*| | | | | |*|*|*|*| | | | |*|*|*| | |*|*| | | | | | |*|*| | | |*| |*|*|*| |*| | | | |*| | | | |
| |*|*| |*|*|*| |*| | | |*|*| |*| | | | | |*|*|*| |*|*|*| | |*|*| | | | | | | |*| | |*|*|*| | | | |*|
|*|*|*| | |*|*| | |*|*| | |*|*|*|*| |*| | |*| |*| | | | |*| |*|*|*| |*| | | | |*| |*|*|*|*| | |*| |*|
| | | | |*|*|*| |*| | | |*| |*| | |*| |*| | | | |*|*| | | |*| | |*|*| | | |*| |*| | | | | | |*|*| | |
| | | | | | |*| |*| | | | | |*| |*|*| |*| |*| |*|*|*|*| | |*|*|*| | |*|*|*| |*|*| |*| |*|*|*| | |*| |
|*|*|*| |*|*| | |*| | | |*| |*|*|*|*|*| |*| |*|*|*|*| | | |*| | |*| |*| | | |*|*| | | |*| | | |*|*|*|
| |*|*| |*| |*| |*| | |*| | | | | | | |*| | | | | |*|*| |*|*| | |*| | | |*|*|*|*|*|*| | |*| | | | | |
|*| | | |*|*|*|*| |*| |*| | |*|*|*|*| |*| |*|*| |*| | | | | | |*| | | |*| |*|*|*|*|*| | |*|*| | |*| |
| | | | | | | |*| | |*|*|*| |*|*| |*| | | | |*| | |*| |*|*| | |*| | |*| |*| |*|*| |*| |*|*| |*|*| | |
| |*| |*| |*| | |*| |*|*|*|*|*| | | |*| | |*|*| | | |*|*|*|*|*|*| | | | | | | |*| | | |*| |*| |*|*| |
|*|*| | | | |*| | | | | | | |*|*| | | | | | |*|*| | | | | |*|*|*|*|*| | |*|*|*|*| | | | | | | | | |*|
| | |*| |*| |*| |*| | | | |*|*| |*|*|*| |*| |*| |*|*| |*|*|*| | |*|*|*|*|*|*| |*| |*|*|*| | |*| | |*|
|*|*| |*|*|*| | |*|*|*|*|*| | | |*| | | |*|*| | | |*| |*|*|*| | | |*|*|*|*| | | | | | | |*|*|*| | |*|
| | |*| | | | | |*|*|*| | |*| |*|*| |*|*|*|*|*| |*| | |*| | | | |*| |*|*|*| |*| |*| |*|*|*| |*| | | |
| | |*|*| |*| |*|*|*| |*| |*| |*|*| | | |*| | |*|*| |*|*|*| |*|*|*|*|*| | | |*|*| | | | |*| | |*|*|*|
| | | | | | | |*| | | |*|*|*| |*|*|*|*| | | |*|*|*| | | |*| |*|*|*|*| |*| |*|*| |*| | |*| |*|*|*|*|*|
|*|*|*| | |*| |*| | |*| |*| | | | |*| | | |*|*|*|*| | | | |*| |*|*|*| | | |*|*|*|*| | | | |*|*| |*| |
|*|*|*|*| | |*| | |*| |*|*|*| |*|*|*|*| | | |*| | | |*|*|*| |*|*|*|*| |*|*|*| | |*| |*| | | |*|*|*| |
|*|*|*| | | |*|*|*|*|*|*|*| |*|*|*| |*|*| |*| | |*| |*| |*| |*| | |*| |*|*| |*|*| |*|*|*| |*| |*| | |
|*| |*|*|*|*| | |*| | |*| | |*|*| | |*| |*| | | | | |*| |*| | | |*| |*|*|*|*| |*|*|*| | | |*| | |*|*|
|*| | | |*| |*|*|*|*|*|*| | | | | |*| |*| | | | | |*| | |*|*|*|*|*|*| |*| |*|*|*| |*| | | |*| |*| | |
| |*| |*| |*|*|*| |*|*|*|*|*| | |*| |*| |*| |*| |*| | | | |*| |*| | |*| | | |*|*| |*|*|*|*| | |*| |*|
| | |*| |*|*| |*| | | |*|*| |*| | | | | |*|*| |*|*|*| | |*|*|*| |*|*|*|*| |*| | | |*| | | |*|*| |*|*|
|*|*| | |*|*|*| |*|*|*|*| |*|*|*| |*|*|*|*|*|*|*|*|*| |*| | |*|*|*| | |*|*| |*|*|*|*| |*|*|*| |*|*| |
|*| |*| |*|*| | | | |*| | |*|*|*| | | | |*| | | | |*|*| | | |*|*|*| |*| |*| | | |*| | |*|*| |*| | | |
| | |*|*| | | | |*|*|*|*|*|*| |*| | | | |*|*| |*|*| |*| |*|*| | | | |*| |*|*|*|*| | | |*| | |*|*| |*|
|*|*| |*| | | | |*|*| | |*|*| | |*|*|*| | |*|*|*|*| | | |*| |*| | | |*|*|*|*| |*| |*|*| | | |*|*|*|*|
+---------------------------------------------------------------------------------------------------+

初期配置はランダムです。エンターキーで、次の世代になります。ルールは下記の通りです。

誕生: 周囲のマスの生命がちょうど3
過疎: 周囲のマスの生命が1以下
過密: 周囲のマスの生命が4以上

世代を重ねていくと、生命が広がったり消えたりを繰り返し、800世代ほどでこれ以上変化がない状態になりました。

Iteration: 800
+---------------------------------------------------------------------------------------------------+
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |*|*| | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |*| | | | | |*|*| | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |*| | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |*| | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |*|*| | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |*| | |*| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |*|*| | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | |*|*| | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | |*| |*| | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | |*|*| | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | |*| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | |*| |*| | | | | | | | |*|*| | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | |*| |*| | | | | | | | |*|*| | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | |*| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | |*|*| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | |*|*| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |*|*| | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | |*| | |*| | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |*|*| | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | |*| | | | | | | | | | | | | | | | | | |*|*| |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | |*| | | | | | | | | | | | | | | | | | |*| |*|
| | | | | | | | | | | | | | | | | | | | | | | | | | | | |*| | | | | | | | | | | | | | | | | | | | |*|
| |*|*| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |*| |*|
| |*|*| | | | | | | | | | | | | | | | | | | | | | | | | | | | |*|*| | | | | | | | | | | | | | |*|*| |
| | | | | | |*| | | | | | | | | | | | | | | | | | | | | | | | |*|*| | | | | | | | | | | | | | | | | |
| | | | | |*| |*| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | |*| |*| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | |*| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |*|*|*| | | | | |
| | | | | | | | | | | | | | |*| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | |*| |*| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | |*| |*| | | | | | | | |*|*| | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | |*| | | | | | | | |*| | |*| | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | |*|*| | | | | | | | | | | | | | | | | | | | | |*|*| |
| | | | | | | | | |*|*| | | | | | | |*|*| | | | | | | | | | | | | | | | | | | | | | | | | | | |*|*| |
| | | | | | | | |*| | |*| | | | | |*| | |*| | | | | | | | | | | | | | | | | | | | | |*|*|*| | | | | |
| | | | | | | | | |*|*| | | | | | | |*|*| | | | | | | | | | | | |*|*| | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |*| | |*| | | | | |*| | | | | |*| | | |
| | | | | | | | | | | | | | |*| | | | | | | | | | | | | | | | | |*|*| | | | | | |*| | | | | |*| | | |
| | | | | | | | | | | | | |*| |*| | | | | | | | | | | | | | | | | | | | | | | | |*| | | | | |*| | | |
| | | | | | | | | | | | | |*| |*| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | |*| | | | | | | | | | | | | | | | | | | | | | | | | | | |*|*|*| | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+---------------------------------------------------------------------------------------------------+

眺めていると、一定周期で同じ模様を繰り返すパターンやちょっとずつ移動するパターンなどもでてきます。ぜひみなさんも試してみてください。


まとめ


 かつて、ライフゲームから着想を得て、自然界のシミュレーションゲームを作ったこともあります。あまり知識がなく、Swiftで開発したため、もう動きません。いずれリメイクしたいと思っています。



EOF

この記事が気に入ったらサポートをしてみませんか?