type holyshared = Engineer<mixed>

PHP、Hack、Ruby、Javascript周りの技術ブログ

Golangで五目並べ作った

そういえば、Golangでコード書いたことないや、と思って作ってみました。

Golangはコード読んだことあるけど、書いたことがなかったので、作り始める前に、 Golangチュートリアルを半分くらいやったり、出勤時間にパッケージのAPI調べてたしました。

https://github.com/holyshared/go-gobang

五目並べ

ゲーム仕様

できるだけ簡単な方が作りやすいと思ったので、五目並べの仕様は次の通りにしました。

  • ボードは25 * 25のサイズ
  • プレイヤーは白/黒の石を選べる
  • プレイヤーはNPCのプレイヤーと対戦する
  • プレイヤーが先行
  • 再対戦できる
  • フロント部分は頑張らない(Golangの学習が目的なので)

NPCのAI

NPCのAIを実装したのですが、「負けないようにするにはどうするか」という観点で実装してみました。 AIの思考パターンは次のようにしました。

  1. 自分の石が4つ揃っている場合、5つにする(絶対に勝つ為)
  2. 相手の石が4つ揃っていて、かつ隣接するマスの片方が空いてる場合、邪魔をする(絶対に揃えさせない)
  3. 相手の石が3つ揃っていて、かつ隣接するマスの両方が空いてる場合、邪魔をする(次の自分のターンで絶対に揃えさせない)
  4. 揃いそうなやつを増やす
    1. 自分の石が3つ揃っている場合、揃える為の残り2つのマスの空きからランダムに選ぶ
    2. 自分の石が2つ揃っている場合、揃える為の残り3つのマスの空きからランダムに選ぶ
    3. 自分の石が1つ揃っている場合、揃える為の残り4つのマスの空きからランダムに選ぶ
  5. どれもない場合、空いてるマスを選ぶ

これだけでもそこそこ強くなりました。

感想

設計どうするか、かなり悩みました。 マスが空いてるか、空いてないかの状態どうやって表現しようかとか(RustだったらOptionで表現するのになー)、 パッケージ分けようとして、パッケージ間でimportし合ってビルドがうまくいかなかったり....。

言語仕様がシンプルな分、ちょっと型の表現力が弱いイメージがやっぱりありますね。
そのかわり、学習コストが低いのは良かったです。

先週、みんなのGo言語買ったので、読んだ後に自分のコードもう一回読んでみます。