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を調べて色を格納しているところだけ反転しています。
盤面処理の説明も終わりに近づいてきました。
次節では残りの関数について説明します。