| 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);
}