#include < stdio.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;
}
}
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;
}
int main()
{
int turn = 0;
//盤面の初期化
setBoard();
//ゲームのメインループ
while(turn < 2){
//どちらの手番か表示
if(turn == 0) printf("turn:○\n");
else printf("turn:●\n");
//盤面表示
disp();
//入力
input(turn);
//手番交替
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;
}
}
return 0;
}