GIPF

by 大原雄馬

情報提供者N.H.K.さんに感謝。

GIPFは2人用の対戦型パズルゲームです。 運の要素は全くありません。京大シミュ研に あるゲームとしてはめずらしく、理論上は 先手必勝か後手必勝かのどちらかという ゲームです。「詰めもの」と呼ばれています。

プレイヤーは自分のコマを交互に盤面に 置いていきます。コマの数には限りがあります。 コマを置けなくなると負けです。盤面に同じ色の コマが一直線上に4個以上ならぶと、その コマが手元に戻ります。このとき、そのコマと 同じ直線上にあって、かつそのコマと つながっているコマも戻ってきます --- 4個以上ならんだコマと同じ色ならば。色が異なると、 そのコマはゲームから除去されてしまいます。 わかりやすく言えば、自分の色のコマを 盤面に4個以上うまくならべれば、相手の コマを減らすことができるのです。 こうやって相手を手づまりに追いこむのです。

このゲームのコンピューター版がここにあります。
http://gf1.sourceforge.net/

このプログラムのソースコードは C++で書かれているようです。むしろJavaに 近いという印象を受けました。

コンピューターの思考ルーチンは 伝統的なminimaxのようです。 これは次のようなものです。

  1. これから先のN手でルール上可能な 手をすべて書きだす。
  2. そのうちのひとつをとりあえず やってみる。
  3. その結果、盤面がどうなったかを 見て盤面を評価する。この評価が この手に対する評価となる。
  4. この手がいままで読んだ手よりも よければ、この手を仮採用する。
"だれにとって"なのかをきちんと 説明するには再帰を使わないと いけません。ここでは例でごまかします。

たとえばN=3で、いま白の番のときには 次のようになります。可能な手(一般には 42通りあります)に1から42までの番号を つけておきます。 まず

をやってみます。このうち、白にとって 最も有利な手を仮採用します。それを と書きましょう。次に をやってみます。このうち、白にとって 最も有利な手を仮採用します。それを と書きましょう。以下同様にして を調べます。このうち黒にとって 最も有利な手を仮採用します。それを と書きましょう。このようにして がわかったら、このうち白にとって 最も有利な手を選べばいいのです。 相手が最善をつくしたとき(つまり、 自分の点数がminimumのとき)の 自分の点数を最大(maximum)にすると いうのがminimaxの語源です。

この原理は私が書いたマンカラのプログラムでも 使われています。GIPFのほうはもうひと工夫 あります。「制限時間いっぱい」まで読む らしいのです。("CPUがはやいほど強い"と 説明文にあります。何手先まで読むかを 固定していたらこうはなりません。)

問題なのは評価関数をどう書くか、 つまり盤面をどう評価するかです。 ソースコードのコメントを以下引用します。
BEGIN QUOTE

END QUOTE
詰んだ盤面の点数は1000点(白の勝ち) または-1000点(黒の勝ち)のようです。 GIPFコマの点数は一般コマの1.5倍のようです。 コマの位置による点数は のようです。