→topに戻る →目次に戻る

2.3 ゲームの木の探索---先読みのプログラム---

リバーシのゲームの木を探索するプログラムを作っていくには、そのためのいくつかの関数を用意します。
1. isable(pos) ある場所に石が打てるかどうか調べる isableは、配列banで表現されている局面に対し、盤上の場所posを引数としてもち、そこに石が打てるかどうかを調べ、真か偽を値として返す。また、場所によって白は打てるが黒は打てないということもあるので、isableは白用と黒用の2つ必要。
2. put(pos) ある場所に石を打つ putは、引数posで示される場所に石を打ち、局面を変化させる。また、後で局面を前の局面に戻す必要があるので、そのための情報を蓄える。
3. reput() 2.で変化した局面を元に戻す reputは、putにより変化した局面を元に戻す。
上記3つの関数を使って、ある局面で、すべての場所について着手可能かどうか調べ、そこが着手可能ならば石を打ち(1手先の局面を生成し)、元に戻して次の場所を調べるというプログラムは下記の様になります。

【1手先の局面を生成する関数】

さて、2手先の局面を生成する関数は、どうなるでしょうか?
上の関数の9行目のところで、もう一度3行から13行を繰り返すようにします。

【2手先の局面を生成する関数】

このプログラムは、重要な特徴を持っています。それは、ループを1重から2重に変えただけで、ある局面から2手先すべての局面を生成できるという点です。
つまり、2手先すべての局面生成の時のループは2重で、3手先なら3重、60手先なら60重ということです。
リバーシの盤面は64マスで4マスは最初から埋まっていますから、最大60手で終了です。
60重のループというのは、、、、。
そうです。再帰の登場です。

【再帰を使ったすべての局面を生成する関数】

以上が、概要です。
このままでは、いろいろ不備がありますがここまでにして、次の話に移ります。(→2.4 最適な手を選ぶ)

→topに戻る
→目次に戻る

更新:2013年6月28日
最終更新:2013年7月30日