#include < stdio.h >
#include < stdlib.h >
#include < time.h >

//盤面の大きさ
#define BOARDSIZE 8

//状態を定義
#define NONE 0
#define BLACK 1
#define WHITE 2

//盤面
char board[BOARDSIZE][BOARDSIZE];

//向きごとの移動量
vec_y[] = {-1,-1,0,1,1,1,0,-1};
vec_x[] = {0,1,1,1,0,-1,-1,-1};

//初期化関数
void setBoard(void)
{
	int i;
	
	for(i = 0 ; i < BOARDSIZE*BOARDSIZE ; ++i){
		board[i/BOARDSIZE][i%BOARDSIZE] = NONE;
	}
	board[BOARDSIZE/2 - 1][BOARDSIZE/2] = BLACK;
	board[BOARDSIZE/2][BOARDSIZE/2 - 1] = BLACK;
	board[BOARDSIZE/2][BOARDSIZE/2] = WHITE;
	board[BOARDSIZE/2 - 1][BOARDSIZE/2 - 1] = WHITE;
	
}

//盤面表示関数
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");
	}
	
}

//vecで指定された向きについてひっくり返るコマがあるか確認する
int checkFlip(int y,int x,int turn,int vec)
{
	int flag = 0;
	while(1){
		y += vec_y[vec];
		x += vec_x[vec];
		
		//盤面の外に出ていたら終了
		if( x < 0 || y < 0 || x > BOARDSIZE-1 || y > BOARDSIZE-1) return 0;
		
		//空きマスだったら終了
		if(board[y][x] == NONE) return 0;
		
		//相手のコマがあったらフラグを立てる
		if(board[y][x] == (turn ? BLACK : WHITE)){
			flag = 1;
			continue;
		}
		
		//もしフラグがたっていればループ脱出。いなければ終了
		if(flag == 1) break;
		return 0;
	}
	return 1;
}

//その場所に置くことができるかを確認する関数
int check(int y,int x,int turn)
{
	int vec;
	
	//どれか一方向でもひっくり返るか確認
	for(vec = 0 ; vec < 8 ; ++vec){
		if(checkFlip(y,x,turn,vec) == 1) return 1;
	}
	
	return 0;
}

//実際に裏返す関数
void flip(int y,int x,int turn,int vec){
	while(1){
		y += vec_y[vec];
		x += vec_x[vec];
		
		//自分のコマがあったら終了
		if(board[y][x] == (turn ? WHITE : BLACK)) break;
		
		//それ以外なら自分のコマで塗りつぶす
		board[y][x] = (turn ? WHITE : BLACK);
	}
}

//入力を受けて裏返せるか確かめる関数
int put(int y,int x,int turn){
	int vec,flag=0;
	
	//空白でなければ終了
	if(board[y][x] != NONE) return 0;
	
	//全方向について確認
	for(vec=0 ; vec < 8 ; ++vec){
		if(checkFlip(y,x,turn,vec) == 1){
			//裏返す
			flip(y,x,turn,vec);
			flag = 1;
		}
	}
	if(flag == 1){
		//この場所にコマを置く
		board[y][x] = (turn ? WHITE : BLACK);
		return 1;
	}
	
	return 0;
}

//入力関数
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;
	}
}

//人工無能
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;
	}
}

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;
}

//勝者判定
void checkWinner(){
	int i,j,b=0,w=0;
	
	//コマを数え上げる
	for(i = 0 ; i < BOARDSIZE ; ++i){
		for(j = 0 ; j < BOARDSIZE ; ++j){
			switch(board[i][j]){
			case BLACK:
				++b;
				break;
			case WHITE:
				++w;
				break;
			default :
				break;
			}
		}
	}
	
	//最後に盤面表示
	disp();
	
	//勝者を表示
	if(b > w) printf("○:Winner BLACK!\n");
	else if(b < w) printf("●:Winner WHITE!\n");
	else printf("Drawn game.");
	
}

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;
	
}
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送