前へ 一覧 次へ
第五課 入力を受け付ける
やっとここまで来ました。
大体折り返し地点です。
前回に続いて今回もちょっとだけ面倒ですが頑張りましょう〜。
さて、本来なら行とか列にabcdefgh12345678と名前をつけて
置く場所を指定するんですが、文字の扱いは結構面倒なんです。
なので今回はちょっと楽をして、下図のようにします。
このように数字をつけておいて、例えば[2][3]を指定したい場合は
30 + 4 = 34 で34を入力するということにします。
これで入力を整数値で扱うことができるので、
プログラムを組むのがぐっと簡単になります。
おっと、ここで忘れずにdisp関数を修正しておきましょう。
縦横それぞれの数字を表示するために以下のような変更を加えます。
//盤面表示関数
void disp(void){
int i,j;
printf(" ");
for(i = 0 ; i < BOARDSIZE ; ++i) printf("%2d",i + 1);
printf("\n");
for(i = 0 ; i < BOARDSIZE ; ++i){
printf("%d",(i + 1) * 10);
for(j=0 ; j < BOARDSIZE ; ++j){
switch(board[i][j]){
case NONE:
printf("・");
break;
case BLACK:
printf("○");
break;
case WHITE:
printf("●");
break;
default:
printf("er");
break;
}
}
printf("\n");
}
}
赤字が変更部分です。
難しいことはしていないので、各自で何をしてるかは理解しといてくださいね。
ここまで読めているなら余裕のハズです。
密かに、空白マスの表示もちょっと変更しました。こっちの方が見やすそうです。
表示も直したところで、入力関数を作ります。
入力情報の取得にはscanf関数を使うことにします。
このscanf関数、使うときに色々と注意が必要で、
数字を入力するときに文字を入力すると、情報がバッファに残ってしまい
組み方によっては無限ループしたりします。
さて、今から作る関数でするべきことは
1.入力を受ける
2.取得した数値が正しいか調べる
の2点です。
この場合、数値が正しいというのは、とり得る範囲内であるということになります。
では、実際にコードを書いてみます。
//入力関数
void input(int turn)
{
int place = 0,y,x;
while(1){
//入力する
printf(">");
if(scanf("%d",&place) == 0){
//数値がとれなかったらバッファをクリアする
scanf("%*[^\n]%*c");
printf("input error\n");
continue;
}
//数値が範囲内か確認
if(place < 11 || place > 88){
printf("input[%d]:error\n",place);
place = 0;
continue;
}
y = place / 10;
x = place % 10;
//もう少し詳しく確認
if( x < 1 || y < 1 || x > 8 || y > 8){
printf("input[%d]:error\n",place);
place = 0;
continue;
}
//if(put(y-1,x-1,turn) == 1) break;
//else printf("input[%d]:can't flip\n",place);
place = 0;
}
}
scanf関数は戻り値として入力に成功した個数を返すので、
それをifで監視して成否を確かめています。
失敗したときの処理はおまじないのようなものだと思っておいてください。
とりあえずこれで、入力と確認がなされているはずです。
最後にput関数がでています。これは実際にコマを置く関数です。
入力数値と配列上の数値には1のずれがあるので忘れずに補正して
引数として渡す必要があります。
まだ実装していないので、次回実装しようとおもいます。
実はこの入力方式をとったせいでBOARDSIZEが変更できなくなっている……。
第六課へ