1.6 その他の盤面処理 |
本節ではこれまで述べていない盤面処理について説明します。
盤面を表示したい時など、あるマスの状態を調べたいことがあります。
そのようなときにはBoard_Disk()を呼び出してください。
これを行うにはDisk変数の内容を返せばよいです。
int Board_Disk(const Board *self, int in_pos) { return self->Disk[in_pos]; }
石差計算をしたい時などには黒石、白石の数を調べなければなりません。
そのとき必要なのがBoard_CountDisks()です。
関数の内部ですが、Disk配列のうち該当する要素がいくつあるかを数えています。
全部のマスを調べているので、処理に時間がかかります。
この関数の処理を速くする方法については後で述べます。
int Board_CountDisks(const Board *self, int in_color) { int result = 0; int pos; for (pos = 0; pos < NUM_DISK; pos++) { if (self->Disk[pos] == in_color) { result++; } } return result; }
石のX座標、Y座標から石の位置(Disk配列の何番目か)を計算できる関数があると便利です。
またその逆も計算できると便利です。
これらの関数は以下のようになります。
int Board_Pos(int in_x, int in_y) { return (in_y + 1) * (BOARD_SIZE + 1) + in_x + 1; } int Board_X(int in_pos) { return in_pos % (BOARD_SIZE + 1) - 1; } int Board_Y(int in_pos) { return in_pos / (BOARD_SIZE + 1) - 1; }
なぜこのような式になるのかは、1.2節の盤面イメージを見てください。
手番を入れ替えたいときなど、指定した色と逆の色を取得できる関数があると便利です。
これは以下のようになります。
#define OPPONENT_COLOR(c) (BLACK + WHITE - c) int Board_OpponentColor(int in_color) { return OPPONENT_COLOR(in_color); }