C言語リバーシ AI実装の準備

シェアする

  • このエントリーをはてなブックマークに追加

こんにちは。お久しぶりです。

最近は大学もテスト期間で、勉強とアニメ視聴に勤しんでおります。

さて、前回何をしたか覚えてないのですが、今回はAI実装の準備をするという話になっていたと思います。

今まで対局の流れをmain関数に書いていましたが、これは良くありません。複雑なプログラムではmain関数は極力シンプルにするのが基本です。

ということで、人vs人の対戦を行う関数をGameManVsMan()関数として作成します。

まず、現在のmain関数を掲載します。

int main(void){
	BOARD board;
	uint64_t pos, valid;
	int i;

	// 局面を初期化
	Init(&board);

	// 局面を表示
	ShowBoard(&board);

	// 石を置く
	while(board.teban != GAME_OVER){
		// 合法手を得る
		valid = GenValidMove(&board);
		// 手を受け取る
		pos = GetPos();
		if( pos == INPUT_ERROR ){
			printf("エラーです。\n");
			continue;
		}else if( (pos & valid) == 0){
			printf("非合法手です。\n");
			continue;
		}
		Put(&board, pos);
		ShowBoard(&board);

		CheckFinishPass(&board);
	}
	ShowResult(&board);

	return 0;
}

これを、GameManVsMan()関数を作成することで以下のように書き換えたいのです。

int main(void){
	int game_mode;

	while(1){
		printf("モードを選択してください。\n 先手 vs 後手\n0: 人 vs 人\n9: 終了\n");
		scanf("%d", &game_mode);

		switch(game_mode){
			case 0: GameManVsMan(); break;
			case 9: printf("終了します。\n"); return 0;
			default: printf("エラー。もう一度入力してください\n"); break;
		}
	}
	return 0;
}

switch-case文で分岐していますが、最終的にはここに2なら人vsAI、3ならAIvs人、4ならAIvsAI、みたいに機能を追加していき、ここで選択できるようにします。メニュー画面みたいな扱いです。

main関数でのwhile文を新たな関数にコピペして、変数も新たな関数で宣言します。

// 人 vs 人
void GameManVsMan(void){
	BOARD board;
	uint64_t pos, valid;

	Init(&board);
	ShowBoard(&board);

	// 石を置く
	while(board.teban != GAME_OVER){
		// 合法手を得る
		valid = GenValidMove(&board);
		// 手を受け取る
		pos = GetPos();
		if( pos == INPUT_ERROR ){
			printf("エラーです。\n");
			continue;
		}else if( (pos & valid) == 0){
			printf("非合法手です。\n");
			continue;
		}
		Put(&board, pos);
		ShowBoard(&board);

		CheckFinishPass(&board);
	}

	ShowResult(&board);

	return;
}

さらに、この関数のプロトタイプ宣言も記述します。これで正常に動きます。

こんな風に、ひとかたまりの機能は関数化して分けるのがプログラミングの基本です。

次回は何も考えないAIを作成して人vsAIの対局関数を実装したいと思います。

AIっていっても大したもんじゃないです。大変なのは強くすることです。

では、また。

スポンサーリンク
レクタングル(大)
レクタングル(大)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする