この節では、盤面の基本処理について前節に引き続き説明します。
といっても定数等を並べているだけなので、読み飛ばしてもらってもかまいません。
定数
各ファイルで定義されている定数について説明します。
- board.h, board.c
#define SQUARE_NB 91
#define LEGAL_NB 60
#define EMPTY_NB 64
#define FLIP_NB (60*(18+1))
SQUARE_NB: マスの配列の数です。
LEGAL_NB: 盤面の初期配置での空きマスの数です。
EMPTY_NB: 盤内にあるマスの数です。
FLIP_NB: 返した石を記憶するスタックの配列数です。
enum { BLACK = -1, EMPTY, WHITE };
各マスの石の色に対応する値を定義しています。
enum {
PASS = 0, NO_MOVE = 1,
A1=10, B1, C1, D1, E1, F1, G1, H1,
...
};
各マスのインデックスを定義しています。
またPASSはパス、NO_MOVEは状況に応じて着手不可、着手なし、対応するマスなし等を表します。
const char SquareString[SQUARE_NB][3] = {
"PS", "--", "??", "??", "??", "??", "??", "??", "??", "??",
"A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1", "??",
...
};
各マスおよびパスに対応する文字列です。
const int BestToWorst[EMPTY_NB] = {
A1, H1, A8, H8, /* Corners */
C1, F1, A3, H3, A6, H6, C8, F8, /* A Squares */
...
};
探索を行うときにどの手から調べるかを定義しています。
隅に打つ手は良い手が多いので、隅に打つ手から調べています。
またCやXに打つ手は後の方で調べるようにしています。
- mboard.h
#define INDEX_NB 34
局面評価で使うパターンの数です。
- mboard.c
#define MAX_SQUARE_NB 10
各パターンで使うマスの数の最大値です。
static const int LineIndexNo[8] = { /* Horizontal patterns */
0, 1, 2, 3, 8, 9, 12, 13
};
局面評価で使うパターンのうち、横1列のパターンの番号です。
static const PATTERN Pattern[INDEX_NB] = {
/* Edge & Hor2 */
{ 0, 8, { A1, B1, C1, D1, E1, F1, G1, H1 } },
{ 0, 8, { A2, B2, C2, D2, E2, F2, G2, H2 } },
...
}
各パターンの方向、マスの数、構成するマスのインデックスを表す構造体です。
構造体
各ファイルで定義されている構造体(前節で説明していないもの)について説明します。
関数
関数は名前を見ればどんな処理をするかわかるので、ここでは説明しません。
ハッシュ値とパターンインデックスの計算に関係する部分はあとで説明したいと思います。
|