4.1 盤面の取り扱いその1 |
この章では、オセロプログラムTurtle
について、私がわかっている範囲で解説をします。
Turtleのプログラムソースはこちらからダウンロードできます。
この節では、Turtleで盤面をどのように扱っているかについて説明を行います。
BOARDの定義は次のようになっています。 typedef struct { int Colour; int Square[SQUARE_NB]; int **FlipSP; int *FlipStack[FLIP_NB]; } BOARD;Colourは黒番か白番かを表し、Squareは各マスにある石を表します。 いずれも黒番(石)なら-1、白番(石)なら1です。 また空きマスは0で表されます。 定数SQUARE_NBは91で、1.1節で解説した方法と同様に、盤外のマスを空きマスで表すことにより、石を返す処理をするときに利用しています。 FlipStackは、どの石を返したかを記憶するためのスタックで、石を返したマスへのポインタが配列になっています。 データはNULLポインタで区切られます。 FlipSPはスタックへのポインタです。 MBOARDの定義は次のようになっています。 typedef struct { int Colour; MSQUARE **FlipSP; int Key[2]; MSQUARE Square[SQUARE_NB]; int Index[INDEX_NB+1]; /* Index[INDEX_NB] = dummy index */ MSQUARE *FlipStack[FLIP_NB]; } MBOARD;Squareは各マスの情報です。 Keyは局面のハッシュ値、Indexはパターンインデックスです。 Colour、FlipStackおよびFlipSPはBOARDのときと同様です。 MBOARDでは、各マスの情報を表すのにMSQUAREという構造体を使用しています。 MSQUAREの定義は次のようになっています。 typedef struct { int Disk; int Move; int FlipKey[2]; int MoveKey[2][2]; INDEX Index[4]; } MSQUARE;Diskは石の色、Moveは自身のインデックスを表します。 (すなわち、任意のiに対しMBoard->Square[i].Move=i) FlipKeyとMoveKeyはハッシュ値を生成するのに使われます。 Indexはパターンインデックスの変化量です。 構造体INDEXの定義は次のようになっています。 typedef struct { int *Index; int Inc1; /* ushort */ int Inc2; /* ushort */ } INDEX;Indexは変化させるパターンインデックスへのポインタ、Inc1、Inc2は変化量です。 Inc1は空きマスに石を置いたときの変化量で、Inc2は石が返されたときの変化量です。 EBOARDの定義は次のようになっています。 typedef struct { int Colour; ESQUARE **FlipSP; int Key[2]; ESQUARE Square[SQUARE_NB]; ESQUARE *FlipStack[FLIP_NB]; } EBOARD;Colour、Key、FlipStack、FlipSPについてはMBOARDの場合と同様です。 Squareは各マスの情報で、構造体ESQUAREの定義は次のようになっています。 typedef struct ESquare { int Disk; int Move; int FlipKey[2]; int MoveKey[2][2]; struct ESquare *Succ; struct ESquare *Pred; } ESQUARE;SuccとPredは終盤の探索の末端付近のノードで、空きマスの双方向リストを作成するのに使います。 それ以外の変数についてはMSQUAREの場合と同様です。 |
トップに戻る 4.2 盤面の取り扱いその2 |