奥能登の伝承娯楽『ごいた』のコンピュータ対戦プログラム書いてみた
デザスプにて、『ごいた』という石川県能登町宇出津に由来した伝承娯楽を教えてもらいました。シンプルなルールながら中毒性があり、Japanese orientedなローカルさが快いとともに、コレならプログラム書けばコンピュータ対戦でできるんじゃね?と思ってしました。伝統的な遊戯を電子化してしまうことは良し悪しあるとは思いますが、さっそく書いてみたので(保存会の許可は得ずに..)ソースを公開します。
ダウンロードと更新履歴
- 2015-01-11 Ver.0.0 まだ書き始め。手動操作のみ。
- 2015-01-12 Ver.0.1 プレイヤー以外の攻守を自動化。完全ランダム。
- 2015-01-12 Ver.0.2 ごいた自動打ちクラスを作成
- 2015-01-14 Ver.0.3 5しは同時に2人まで発生する等修正。
- 2015-01-16 Ver.0.4 必勝パターンを実装。
- 2015-01-17 Ver.0.5 受けにおいても必勝パターンを計算する
- 2015-01-25 Ver.1.0 ファイルを分割しオブジェクト指向ライクに
- 2015-01-25 Ver.1.1 攻めで残り枚数の少ない順に打つ
- 2015-01-31 Ver.1.2 必勝状態における打ち方を修正
- 2015-02-07 Ver.1.3 裏面になっている駒を考慮
- 2015-02-11 Ver.1.4 150点勝負化。自動でなしするよう実装。
- 2015-02-22 Ver.1.4.1 5し継続のバグ解消。必勝時の計算量削減。
人間との対局ももちろんできますが、設計思想としてAPI化を意識したコーディングをしています。目標はAPIを共通化した上で、s-Ake apps projectさんのAndroidアプリのような他のコンピュータプログラムにに勝ち、将来的には人間の番付上位者にも勝利することです。
つかい方
現状はコマンドラインで実行するようになっています。Rubyで書いていますので、Macユーザさんはファイルをダウンロードして解凍してから、ターミナルを起動して、cdして、
$ ruby goita.rb
で対戦ゲームが実行できるはずです。MacでなくてもRubyの実行環境があればOK。なお、持ち駒に出せる駒がない場合には自動的に"なし"となりますので、始まった途端にゲームが終了していることもしばしばです。
ルールとの違い
- 「駒を配るときに裏返して盤上に丸く輪を書くように並べて、親が上を向いて..」というのはできないため、駒は最初からランダムで配っています。
- 親は
必ずあなたから始まります。ランダムです。 - 合計150点を取得したチームが勝利
なのですが、現在は1回勝負です。 - 自分の番に出す駒がない場合は、時間短縮のため自動的になしになります。
「全自動ごいた」プログラム同士の戦い
勝率の改善のための工夫として、コードを修正したら1万回程度プログラム同士で対戦させ、勝率が良くなったときのみコミットしています。これを利用して「どの順が最も勝率が良いか?」を調べるために、コンピュータ同士で対戦させてみました。
条件
- 5歩,6歩,7歩,8歩が発生した場合はノーカウント
結果(2015-01-17のコードを利用)
第1順(親) | 第2順 | 第3順 | 第4順 | |
---|---|---|---|---|
勝った回数 | 345,516回 | 217,840回 | 215,885回 | 220,759回 |
勝率 | 34.5% | 21.8% | 21.6% | 22.1% |
平均得点 | 33.4点 | 34.4点 | 34.8点 | 34.4点 |
結果(2015-01-25のコードを利用)
第1順(親) | 第2順 | 第3順 | 第4順 | |
---|---|---|---|---|
勝った回数 | 46,185回 | 17,972回 | 16,089回 | 19,754回 |
勝率 | 46.19% | 17.97% | 16.09% | 19.75% |
平均得点 | 27.70点 | 30.27点 | 29.96点 | 29.96点 |
結果(2015-02-07のコードを利用)
第1順(親) | 第2順 | 第3順 | 第4順 | ||
---|---|---|---|---|---|
勝った回数 | 37,120回 | 19,787回 | 21,192回 | 21,901回 | |
勝率 | 37.12% | 19.79% | 21.19% | 21.90% | |
平均得点 | 30.11点 | 29.13点 | 30.41点 | 30.35点 |
わかったこと
- 親の勝率がよい。1/3以上は親が勝つ。初手で任意の駒を出せるのは有利。
- 第2順〜第4順の勝率はほとんど同じだが、第4順の方がやや高い。
- 平均得点はほとんど差がないが、親が若干低い傾向がある。ただし親は勝率が高いため、実戦ではこの数値の差は考慮不要の認識。
- 実戦は150点勝負。平均約30点なので、先に5回勝つつもりで挑むこと。
個人的な感覚
- ちなみに作成者の私は対人戦はたったの1日だけしかしたことないです。
- これそのうちCTFのネタになりそうな気がする。
- Ver.1.4の時点で、条件分岐によるプログラミングは限界に達した認識。これ以上の改善を図るには、データ収集と学習をする必要がある。