そういえば、Golangでコード書いたことないや、と思って作ってみました。
Golangはコード読んだことあるけど、書いたことがなかったので、作り始める前に、 Golangのチュートリアルを半分くらいやったり、出勤時間にパッケージのAPI調べてたしました。
https://github.com/holyshared/go-gobang
ゲーム仕様
できるだけ簡単な方が作りやすいと思ったので、五目並べの仕様は次の通りにしました。
NPCのAI
NPCのAIを実装したのですが、「負けないようにするにはどうするか」という観点で実装してみました。 AIの思考パターンは次のようにしました。
- 自分の石が4つ揃っている場合、5つにする(絶対に勝つ為)
- 相手の石が4つ揃っていて、かつ隣接するマスの片方が空いてる場合、邪魔をする(絶対に揃えさせない)
- 相手の石が3つ揃っていて、かつ隣接するマスの両方が空いてる場合、邪魔をする(次の自分のターンで絶対に揃えさせない)
- 揃いそうなやつを増やす
- 自分の石が3つ揃っている場合、揃える為の残り2つのマスの空きからランダムに選ぶ
- 自分の石が2つ揃っている場合、揃える為の残り3つのマスの空きからランダムに選ぶ
- 自分の石が1つ揃っている場合、揃える為の残り4つのマスの空きからランダムに選ぶ
- どれもない場合、空いてるマスを選ぶ
これだけでもそこそこ強くなりました。
感想
設計どうするか、かなり悩みました。 マスが空いてるか、空いてないかの状態どうやって表現しようかとか(RustだったらOptionで表現するのになー)、 パッケージ分けようとして、パッケージ間でimportし合ってビルドがうまくいかなかったり....。
言語仕様がシンプルな分、ちょっと型の表現力が弱いイメージがやっぱりありますね。
そのかわり、学習コストが低いのは良かったです。
先週、みんなのGo言語買ったので、読んだ後に自分のコードもう一回読んでみます。