| 6.5 局面情報の取得と登録 |
前節で局面の検索を行なえるようになりました。
本節では局面情報の取得と登録を行なえるようにします。
局面情報を取得する関数Opening_Info()は以下のようになっています。
与えられた局面から局面情報を選択し、見つかったらout_infoに格納しています。
int Opening_Info(const Opening *self, const Board *in_board, int in_color, PositionInfo *out_info)
{
PositionInfo *info;
info = Opening_Find(self, in_board, in_color);
if (!info) {
return 0;
}
*out_info = *info;
return 1;
}
次に局面情報の登録関数です。
Opening_SetInfo()は以下のようになっています。
int Opening_SetInfo(Opening *self, const Board *in_board, int in_color, const PositionInfo *in_info)
{
PositionInfo *info;
PositionData *data;
info = Opening_Find(self, in_board, in_color);
if (info) {
*info = *in_info;
} else {
if (self->Num >= self->Max) {
self->Max += NUM_INFO_BLOCK;
data = realloc(self->Data, self->Max * sizeof(PositionData));
if (!data) {
return 0;
}
self->Data = data;
}
Board_Key(in_board, in_color, &self->Data[self->Num].key);
self->Data[self->Num].info = *in_info;
self->Num++;
}
return 1;
}
目的の局面情報が見つかれば、渡された情報をコピーします。
見つからなかった場合には空いている定石データ領域に登録します。
定石データ領域に空きがなければ、メモリ領域の確保を行なって定石データ領域の拡張を行います。
本節でOpeningクラスの説明は終わりです。
次節からはOpeningクラスを使用した定石の探索と、定石の登録について説明します。