| 1.5 盤面をコピー、反転させる処理 |
本節では盤面をコピーする処理と、盤面を反転させる処理について説明します。
盤面のコピーは、同じ内容をもつ複数の盤面を用意したい場合に使います。
盤面を反転させる処理は、例えば盤面の評価を黒番のときだけに行いたい場合に使います。
void Board_Copy(const Board *self, Board *out_board)
{
*out_board = *self;
out_board->Sp = self->Sp - self->Stack + out_board->Stack;
}
最初に構造体の内容をコピーします。
ただしSpはポインタなので、そのまま値をコピーしても意味がありません。
コピー先のSpがコピー先のStackの内部を指すようにするのが2行目の処理です。
void Board_Reverse(Board *self)
{
int pos;
int *p;
int n;
for (pos = 0; pos < NUM_DISK; pos++) {
if (self->Disk[pos] == BLACK) {
self->Disk[pos] = WHITE;
} else if (self->Disk[pos] == WHITE) {
self->Disk[pos] = BLACK;
}
}
for (p = self->Sp; p > self->Stack;) {
p--;
n = *p;
p--;
*p = OPPONENT_COLOR(*p);
p -= n + 1;
}
}
まず各マスについて、そのマスに黒石があれば白石に、白石があれば黒石にしています。
次の処理はちょっとわかりにくいですが、Stackを調べて色を格納しているところだけ反転しています。
盤面処理の説明も終わりに近づいてきました。
次節では残りの関数について説明します。