前へ 一覧
補講 無能な相手
……前回で最後とか言っておきながら、ちょっとだけ追加します。
できたはいいんですけど、あれ、一人だとなかなか遊べないんですよね。
バカでもいいから相手してほしい、ということで
今回はAIを作りましょう。
と言っても、ランダムに指してくるだけですが。
……いえ、意外とバカにできないですよ?ランダムも。
さっき言った通り、今回の仕様は
・ランダムに打ち返してくる
だけです。
別に「置ける場所に」とか面倒なことは言いません。
置けなかったらエラーで戻して再トライ。
ものすっごい効率悪いですが、簡単にできます。
C言語にはランダムに数値を返してくれるrand()関数があるのでこれを利用します。
とりあえず、stdlib.hを#includeしましょう。この中に入ってます。
rand()関数が返す数値の最大値はコンパイラによって違うので
注意が必要だったりするんですが、
今回必要な値は最大でも88なので全く問題ありません。
通常、rand()で最大値Aの乱数を得たいときは
rand()%(A+1)
のように剰余をとって対応します。
さっさとコードを書いてしまいます。
以前作ったinput()を利用すると簡単に書けます。
#include < stdlib.h >
//人工無能
void ai_rand(int turn)
{
int place = 0,y,x;
while(1){
//適当に決める
place = rand() % 89;
//数値が範囲内か確認
if(place < 11 || place > 88){
place = 0;
continue;
}
y = place / 10;
x = place % 10;
//もう少し詳しく確認
if( x < 1 || y < 1 || x > 8 || y > 8){
place = 0;
continue;
}
if(put(y-1,x-1,turn) == 1){
printf(">%d\n",place);
break;
}
place = 0;
}
}
ランダムに決定する以上、どうしても何回かは
無意味な数値を選択するんですが、そのたびにエラー文を
出力していては興ざめなので、成功したとき以外の
printf()を削除します。
あとは、main()でこれを呼び出せばいいんですが、
rand()を使う前に初期化をしておかないといけません。
#include < time.h >
int main()
{
int turn = 0;
//盤面の初期化
setBoard();
//乱数の初期化
srand(time(NULL));
//ゲームのメインループ
while(turn < 2){
//どちらの手番か表示
if(turn == 0) printf("turn:○\n");
else printf("turn:●\n");
//盤面表示
disp();
//入力
switch(turn){
case 0:
input(turn);
break;
case 1:
ai_rand(turn);
break;
default:
printf("error\n");
return -1;
}
//手番交替
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;
}
}
checkWinner();
return 0;
}
最初の赤字の部分で、
現在の時刻で乱数を初期化しています。
time()を使うのにtime.hを#includeしておく必要があります。
今の設定では、先:人 後:AIとなっていますが、
case 0:
case 1:
の辺りを書き換えることで色々変更できます。
もう少しきちんと書けば、ゲームの開始前に
色々選択できるようにもできます。
その辺りは皆さん自力で頑張ってください。
一覧へ