#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 8


int board[N][N];/* board */
char *state[] = {"  ", "○ ", "● "};
char *hands[] = {"", "先攻", "後攻", "Tie"};
int _x, _y, _dx, _dy, hand = 1;
int _line[N];/* for reversable check */
int _mode=0;/* 0:player driven. 1:winnwer check */

// prototype
void pp(int *a, int n);
void print_board();
int set();
int reverseCheck();
void getLine();
int reversable();
void reverse();
int winnerCheck();

void pp(int *a, int n)
{
  while (n--)printf("%d ", *a++);
  putchar('\n');
}

void print_board()
{
  int x, y;
  printf("\033[2J");
  printf("\033[%d;%dH", 0, 0);
  printf("    0  1  2  3  4  5  6  7\n");
  for (x = 0; x < N; x++) {
    printf("%2d|", x);
    for (y = 0; y < N; y++) {
      printf("%s|", state[board[x][y]]);
    }
    printf("%d\n", x);
    printf("   --+--+--+--+--+--+--+--+\n");
  }
  printf("    0  1  2  3  4  5  6  7\n");
}

int set()/* 0:replace ok */
{
  // x, y is Irregular
  if (_x < 0 | _x >= N | _y < 0 | _y >= N)
    return -1;
  // already exist
  if (board[_x][_y])
    return -2;
  // can't reverse anywhere
  // printf("_x _y reverseCheck returns : %d %d %d\n", _x, _y, reverseCheck());
  if (reverseCheck())
    return -3;
  return 0;
}

int reverseCheck()/* 0:reversable exist */
{
  int direct[] = {1, 1, 1, 0, -1, -1, -1, 0};
  int r = 1;

  // seearch for N direction
  for (int i = 0; i < N; ++i) {
    _dx = direct[i];
    _dy = direct[(i + 2) % N];
    getLine();
    if (reversable() == 0) {
      r = 0;
      if (_mode == 0)
        reverse();
      else return 0;
    }
  }
  return r;
}

void getLine()
{
  int x = _x, y = _y;

  for (int i = 0; i < N; ++i)
    _line[i] = 0;
  _line[0] = hand;
  for (int i = 1; i < N; ++i) {
    x += _dx;
    y += _dy;
    if ((x < 0) | (x >= N) | (y < 0) | (y >= N))
      break;
    // printf("x y = %d %d\n", x,y);
    _line[i] = board[x][y];
  }
  // pp(_line,N);
}

int reversable()  /* 0:ok */
{
  if (_line[0] + _line[1] != 3) /* next is not enemy */
    return -1;
  for (int i = 2; i < N; ++i) {
    if (_line[i] == 0)/* friend not found */
      return -1;
    if (_line[i] == hand)/* friend found */
      return 0;
  }
  return -1;    /* friend not found */
}


void reverse()
{
  int x = _x, y = _y;

  // pp(_line, N);
  // printf("i am reverse\n");
  // printf("%d %d\n", _dx, _dy);

  board[x][y] = hand;
  while (1) {
    x += _dx;
    y += _dy;
    if (board[x][y] + hand != 3)/* not enemy */
      break;
    board[x][y] = hand;
  }
}

int winnerCheck()/* If winner exist return hand.(1 or 2) Tie --> return 3 else return 0 */
{
  // int continueFlag = 0; /* game continue flag*/
  int sum[3] = {};

  for (_x = 0; _x < N; ++_x) {
    for ( _y = 0; _y < N; ++_y) {
      if (set() == 0) {
        return 0;
      }
      sum[board[_x][_y]]++;
    }
  }

  // printf("%d %d\n", sum[1], sum[2]);

  return    sum[1] > sum[2] ? 1 :
            sum[1] < sum[2] ? 2 : 3;
}

int main()
{
  char buf[100];
  int w, n1 = N / 2, n2 = (N - 1) / 2, autoMode;

  // printf("%d %d\n", n1, n2);

  srand(time(NULL));
  board[n1][n2] = board[n2][n1] = 2;
  board[n1][n1] = board[n2][n2] = 1;

  printf("0:auto 1:manual\n");
  fgets(buf, 100, stdin);
  sscanf(buf, "%d", &autoMode);

  while (1) {
    print_board();

    if (autoMode == 0) {
      _x = rand() % N;
      _y = rand() % N;
    } else {
      printf("hand = %s\n", hands[hand]);
      printf("終了 = q\n" );
      printf("x y = " );
      fgets(buf, 100, stdin);
      if ((buf[0] == 'q') | (buf[0] == 'Q')) {
        printf("終了します\n" );
        return 0;
      }
      sscanf(buf, "%d%d", &_x, &_y);
    }

    _mode = 0;
    if (set() == 0)
      hand = 3 - hand;
    _mode = 1;
    w = winnerCheck();
    if (w) {
      printf("Winnng is %s\n", hands[w]);
      break;
    }
  }

  return 0;
}