/golife

implement Conway's Game of Life

Primary LanguageGo

ライフゲーム○●○

https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0

ライフゲームでは初期状態のみでその後の状態が決定される。碁盤のような格子があり、一つの格子はセル(細胞)と呼ばれる。各セルには8つの近傍のセルがある (ムーア近傍) 。各セルには「生」と「死」の2つの状態があり、あるセルの次のステップ(世代)の状態は周囲の8つのセルの今の世代における状態により決定される。

セルの生死は次のルールに従う。

誕生 死んでいるセルに隣接する生きたセルがちょうど3つあれば、次の世代が誕生する。

生存 生きているセルに隣接する生きたセルが2つか3つならば、次の世代でも生存する。

過疎 生きているセルに隣接する生きたセルが1つ以下ならば、過疎により死滅する。

過密 生きているセルに隣接する生きたセルが4つ以上ならば、過密により死滅する。

使い方

$ go run main.go cli     // ターミナルでライフゲームをプレイする
$ go run main.go server  // ライフゲームのAPIサーバを起動する

todo

  • マップを設定できるようにする
    • ファイルを読み込んでworldを生成する関数をつくる
    • 生死の文字列化メソッド
    • 移動を定数化
  • バリデーションかける
  • エラー時の簡易メッセージ

development

$ docker-compose up

APIサーバ http://kd-golife.herokuapp.com/

ゲーム開始エンドポイント

curl -X POST http://kd-golife.herokuapp.com/world/create
#
curl -X POST -d $'Debug=trueGenCap=10&InitialWorld=●●○\n○○○\n○○○' http://kd-golife.herokuapp.com/world/create

memo

  • 座標をループにする。トーラス
    • 系を閉にできる。資源、シンプル、ゲーム性
    • そもそも外を知らければ、考慮しなくて良いから
  • 方向は関係なくマスの数を数える。方向別メソッドだと8つあって大変だった…
  • 畳み込みだと簡単にできるらしい
  • マイナス、プラスにかかる処理の条件分岐をなくす。そのためのどっちでも使える式を教えてもらった
  • 配列のインデックスにマイナスを使えるようにする。長さ3の配列だと、インデックス -1 と 2 は同じ値を指す、みたいな。0 1 2