前へ 一覧 次へ
第七課 いつ終わるの?
今回は終了判定を作成します。
でも、その前にmain関数をきちんと書いておきます。
今の状態だと、ループすらしていないので
終了判定をつくっても意味がないんです。
サクサクっと並べます。
int main()
{
int turn = 0;
//盤面の初期化
setBoard();
//ゲームのメインループ
while(turn < 2){
//どちらの手番か表示
if(turn == 0) printf("turn:○\n");
else printf("turn:●\n");
//盤面表示
disp();
//入力
input(turn);
//手番交替
turn = (turn + 1) % 2;
//終了判定
switch(checkEnd(turn)){
case 1:
printf("pass\n");
turn = (turn + 1) % 2;
break;
case 2:
printf("game end\n");
turn = 2;
break;
default:
break;
}
}
return 0;
}
書いてある通りなので特に説明はいりませんよね?(もはや解説ではない)
実際に私たちがオセロをする手順とほとんど変わりません。
turn = (turn + 1) % 2;
というのはturnが0と1の交互になるようにしているだけです。
さて、終了判定では空マス全部に対して置けるかどうかの確認を行います。
絨毯爆撃です。
置けるところが無ければ、手番を変えて再度確認。
それでも無ければゲームは終了となります。
では実際に組んでみます。
int checkEnd(int turn)
{
int i,j;
//置ける場所があるか確認
for(i = 0 ; i < BOARDSIZE ; ++i){
for(j = 0 ; j < BOARDSIZE ; ++j){
//あれば普通に続行
if(board[i][j] == NONE && check(i,j,turn) == 1) return 0;
}
}
//場所が無かったので交替して探す
turn = (turn + 1) % 2;
for(i = 0 ; i < BOARDSIZE ; ++i){
for(j = 0 ; j < BOARDSIZE ; ++j){
//あればpassして続行
if(board[i][j] == NONE && check(i,j,turn) == 1) return 1;
}
}
//なかったのでゲーム終了
return 2;
}
これも難しいことはしていません。
コメント文を読めば何をしているかは大体分かると思います。
次回でいよいよ最後、後少し、頑張りましょう。
第八課へ