#include <stdio.h>


// 盤面

int table[8][8];


// 現在のターン

int turn = 1;


///////////////////////////
// draw() 関数

// 画面に盤面を描画します。

///////////////////////////

void draw(){

for(int y=0; y<8; y++){

for(int x=0; x<8; x++){

switch( table[x][y] ){

case 0:

printf( "□" );

break;

case 1:

printf( "●" );

break;

case -1:

printf( "○" );

break;

}

}

printf( "\n" );

}

}


///////////////////////////
// drawTurn() 関数

// 現在のターンを表示します

///////////////////////////

void drawTurn(){

if( turn == 1 ){

printf( "黒(1P)の番です。\n" );

}else if( turn == -1 ){

printf( "白(2P)の番です。\n" );

}

}


///////////////////////////
// nextTurn() 関数

// ターンを入れ替えます

///////////////////////////

void nextTurn(){

turn = -turn;

}


///////////////////////////
// isEnd() 関数

// ゲームが終了しているかを判定します。

// ゲームが終了していれば 0 を返し、

// まだ終了していなければ 1 を返します。

///////////////////////////

int isEnd(){

for(int x=0; x<8; x++){

for(int y=0; y<8; y++){

if( table[x][y] == 0 ){

return 1;

}

}

}

return 0;

}


///////////////////////////
// turnItem() 関数
// ひっくり返す処理
///////////////////////////

int turnItem( int x, int y ){

int turnParamX[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
int turnParamY[] = { -1, -1, -1, 0, 0, 1, 1, 1 };


int count = 0;

for(int i=0; i<8; i++){

int tmpX = x + turnParamX[i];
int tmpY = y + turnParamY[i];


for( int j=0; tmpX >= 0 && tmpY >= 0 && tmpX < 8 && tmpY < 8; j++ ){


if( table[tmpX][tmpY] == -turn ){


tmpX += turnParamX[i];
tmpY += turnParamY[i];


}else{


if( table[tmpX][tmpY] == turn ){


tmpX -= turnParamX[i];
tmpY -= turnParamY[i];


while( tmpX != x || tmpY != y ){


table[tmpX][tmpY] = turn;
tmpX -= turnParamX[i];
tmpY -= turnParamY[i];
count++;


}
}

break;
}
}
}


if( count == 0 ){
return 1;

}


return 0;
}

///////////////////////////
// put() 関数

// 駒を置く位置を入力させます。

// 駒を置ける位置への入力があった場合は 0 を、

// 駒を置けない位置への入力があった場合は 1 を返します。

///////////////////////////

intput(){

int x, y;


// 駒を置くX座標の入力を受け付けます

printf( "駒を置くX座標(0~7) ... " );

scanf( "%d", &x );

if( x < 0 ){

return 1;

}

if( x >= 8 ){

return 1;

}


// 駒を置くY座標の入力を受け付けます

printf( "駒を置くY座標(0~7) ... " );

scanf( "%d", &y );

if( y < 0 ){

return 1;

}

if( y >= 8 ){

return 1;

}


// table 変数を見て置こうとしている場所が 0 でなければ、『1』を返す

if( table[x][y] != 0 ){

return 1;

}

// turnItem() 関数に入力された位置を渡して、相手の駒をひっくり返す処理を行います。

if( turnItem( x, y ) == 1 ){

// 1枚もひっくり返せなかった場合は、『1』を返す

return 1;

}


return 0;

}


///////////////////////////
// result() 関数

// 結果表示

///////////////////////////

void result(){


int result = 0;

for(int x=0; x<8; x++){

for(int y=0; y<8; y++){

result += table[x][y];

}

}


if( result > 0 ){

printf( "黒(1P)の勝ちです。" );

}else if( result < 0 ){

printf( "白(2P)の勝ちです。" );

}else{

printf( "引き分けです。" );

}

}


///////////////////////////
// main() 関数

// プログラム本体

///////////////////////////

int main(){


// 盤面をすべて 0(何も置かれていない) で初期化します。

for(int x=0; x<8; x++){

for(int y=0; y<8; y++){

table[x][y] = 0;

}

}


// センターの黒と白を配置します。

table[3][3] = 1;

table[4][4] = 1;

table[3][4] = -1;

table[4][3] = -1;


// ゲームが終了するまでループします。

while( isEnd() == 1 ){


// 盤面を表示します。

draw();


// 現在 黒(1P)の番か白(2P)の番かを表示します。

drawTurn();


// 駒を配置する場所を選択させます。

if( put() == 0 ){

// 黒(1P)と白(2P)の順番を入れ替えます。

nextTurn();

}else{

printf( "そこには置けません\nもう一度選択してください。\n" );

}

}


// 結果を表示。

result();


return 0;

}