前へ 一覧
補講 無能な相手

……前回で最後とか言っておきながら、ちょっとだけ追加します。
できたはいいんですけど、あれ、一人だとなかなか遊べないんですよね。
バカでもいいから相手してほしい、ということで
今回は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:
の辺りを書き換えることで色々変更できます。
もう少しきちんと書けば、ゲームの開始前に
色々選択できるようにもできます。
その辺りは皆さん自力で頑張ってください。

一覧へ
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送