前へ 一覧 次へ
第六課 裏返せ!
今回はコマを裏返す一連の処理を実装したいと思います。
具体的には、input関数からput関数に受け渡された座標に対して
・空白でなければ0を返す
・checkFlip関数を呼び出して、置けるならflip関数を呼び出して裏返す
・裏返した場合は1を返す
これで、input側は0か1のどちらが戻ってくるかで成否を知ることができます。
サクサク組みます。まずはflip関数から。
//実際に裏返す関数
void flip(int y,int x,int turn,int vec){
while(1){
y += vec_y[vec];
x += vec_x[vec];
//自分のコマがあったら終了
if(board[y][x] == (turn ? WHITE : BLACK)) break;
//それ以外なら自分のコマで塗りつぶす
board[y][x] = (turn ? WHITE : BLACK);
}
}
これでOKです。
flip関数が呼ばれる時はその方向に裏返せることが保証されているので
自分のコマがでるまでガシガシ裏返していきます。
お次はput関数ですね。
//入力を受けて裏返せるか確かめる関数
int put(int y,int x,int turn){
int vec,flag=0;
//空白でなければ終了
if(board[y][x] != NONE) return 0;
//全方向について確認
for(vec=0 ; vec < 8 ; ++vec){
if(checkFlip(y,x,turn,vec) == 1){
//裏返す
flip(y,x,turn,vec);
flag = 1;
}
}
if(flag == 1){
//この場所にコマを置く
board[y][x] = (turn ? WHITE : BLACK);
return 1;
}
return 0;
}
大体できましたー。
いままで作ってきた関数をきちんと並べて実行すると↓のように動作テストも可能です。
第七課へ