| 1.2 盤面の生成、初期化 |
本節では盤面の生成と初期化処理について説明します。
生成とは、盤面処理に必要なパラメータ用のメモリ確保と初期化のことです。
初期化処理は、盤面をゲームの最初の状態にすることを意味します。
処理について説明する前に、まず盤面クラスBoardの構造について見てみましょう。
#define NUM_DISK ((BOARD_SIZE+1)*(BOARD_SIZE+2)+1)
#define NUM_STACK (((BOARD_SIZE-2)*3+3)*BOARD_SIZE*BOARD_SIZE)
(中略)
struct _Board
{
int Disk[NUM_DISK];
int Stack[NUM_STACK];
int *Sp;
};
Diskは、マスの状態を表す変数です。# : WALL . : EMPTY O : BLACK X : WHITE ######### #........ #........ #........ #...XO... #...OX... #........ #........ #........ ##########ただし、1行目の右端と2行目の左端、2行目の右端と3行目の左端、、、9行目の右端と10行目の左端はそれぞれつながっています。
Stackは、返した石を覚えておくためのものです。
石を返すときには以下の情報をこの順番に格納していきます。
返した石の位置1
返した石の位置2
...
返した石の位置n
着手位置
相手の色
返した石の数
逆に1手戻すときには、この情報を逆から読み込んでいきます。
相手の色を格納しておくのは、1手戻すときには返した石が相手の色になるからです。
SpはStackのどの位置にいるかを覚えておくためのものです。
Stackに値を書き込む毎に後ろに下がり、値を読み込む毎に前に移動します。
それでは盤面の生成処理を見ましょう。
board.cには以下のように記述されています。
Board *Board_New(void)
{
Board *self;
self = malloc(sizeof(Board));
if (self) {
Board_Clear(self);
}
return self;
}
たいした処理は行っていません。
それでは、盤面が必要なくなったときの処理はどうなるでしょうか。
void Board_Delete(Board *self)
{
free(self);
}
こちらもたいしたことはありません。この節の最後は盤面の初期化処理です。
void Board_Clear(Board *self)
{
int i, j;
for (i = 0; i < NUM_DISK; i++) {
self->Disk[i] = WALL;
}
for (i = 0; i < BOARD_SIZE; i++) {
for (j = 0; j < BOARD_SIZE; j++) {
self->Disk[Board_Pos(i, j)] = EMPTY;
}
}
self->Disk[E4] = BLACK;
self->Disk[D5] = BLACK;
self->Disk[D4] = WHITE;
self->Disk[E5] = WHITE;
self->Sp = self->Stack;
}
最初に配列DiskをWALLで埋めています。