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で埋めています。