/*-----------------*/
/* ocelo game */
/*-----------------*/
#include < ctype.h >
#define CLS() printf("\x1b[2J")
#define LOCATE(x, y) printf("\x1b[%d;%dH", y + 1, x + 1)
#define CURSOLE(f) printf("\x1b[>5%c", f ? ' 1 ' : 'h')
#define ON 1
#define OFF 0
#define COLOR(n, a) printf("\x1b[%d;%dm", n, a)
#define GREEN 32
#define YELLOW 33
#define CYAN 36
#define WHITE 37
#define NORMAL 0
#define BLINK 5
#define REVERSE 7
int ban[9][9];
int initial_syori(void);
int human_input(int koma);
int computer_input(int koma);
int jyunretu(int kp[], int kazu, int jpoint);
int priority_check(long w, int p, int koma);
void copy(int x[9][9], int y[9][9]);
int check(int work[9][9], int xp, int yp, int koma, int haten);
int syori(int work[9][9], int xp, int yp, int sx, int sy, int koma, int hanten);
void hantei(int *siro, int *kuro);
void display(void);
/*-----------------*/
/* ocelo game */
/*-----------------*/
void main(void)
{
int end_flag, human_flag, computer_flag, koma, siro, kuro;
if (initial_syori() == 1)
koma = 1;
else
koma = -1;
end_flag = 0;
do {
if (koma == 1)
{
do {
human_flag = human_input(koma);
} while(human_flag == 0);
}
else
{
computer_flag = computer_input(koma);
}
display();
hantei(&siro, &kuro);
if((human_flag == 2 && computer_flag == 2) || siro + kuro == 64)
end_flag = 1;
else
koma *= -1;
} while (end_flag == 0);
LOCATE(4, 21); COLOR(WHITE, REVERSE);
printf("RESULT you[%2d]: computer[%2d]\n", siro, kuro);
COLOR(WHITE, NORMAL);
}
/*-----------------*/
/* initial */
/*-----------------*/
int initial_syori(void)
{
int i, j, q;
char buffer[10];
for(i = 1; i <= 8; i++)
ban[i][j] = 0;
ban[4][4] = ban[5][5] = 1;
ban[4][5] = ban[5][4] = -1;
CLS();
display();
do {
LOCATE(4, 19); COLOR(WHITE, NORMAL);
printf("First(1) or Second(2) -> ");
COLOR(CYAN, NORMAL); scanf("%s", buffer);
LOCATE(4, 19); printf("\x1b[ok");
} while (buffer[0] != '1' && buffer[0] != '2' || buffer[1] != '\0');
q = buffer[0] - ' 0';
COLOR(WHITE, NORMAL);
LOCATE(4, 18); printf("●: you --------------");
LOCATE(4, 19); printf("◯: computer ---------");
return(q);
}
/*-----------------*/
/* human type */
/*-----------------*/
int human_input(int koma)
{
char buffer[10];
int i, j, flag;
do {
do {
LOCATE(24, 18); printf("\x1b[OK");
LOCATE(24, 18); COLOR(CYAN, NORMAL); scanf("%s", buffer);
for(i = 0; i < strlen(buffer); i++)
*(buffer+i) = tolower(*(buffer+i));
if(strcmp(buffer, "pass") == 0)
{
flag = 0;
for(i = 1; i <= 8 && flag == 0; i++)
for (j = 1; j<= 8 && flag == 0; j++)
if(check(ban, i, j, koma, 0) == 1)
flag = 1;
if (flag == 1)
{
i = j = 0;
continue;
}
else
return(2);
}
if (*buffer >= 'a' && *buffer <= 'h')
{
i = atoi(buffer + 1);
j = *buffer - 'a' + 1;
}
else
{
i = atoi(buffer);
j = *(buffer+1) - 'a' + 1;
}
} while(i < 1 || i > 8 || j < 1 || j > 8);
flag = check(ban, i, j, koma, 1);
} while (flag == 0);
return(flag);
}
/*-----------------*/
/* computer */
/*-----------------*/
int computer_input(int koma)
{
int a, b, c, i, j, k, x, y, kazu, flag, sw, pass, min;
int jpoint, minpoint, xp[11], yp[11], kp[11], kpmax[11];
long w;
int ban1[9][9], ban2[9][9], corner[2][4];
int priority[9][9] =
{
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 9, 0, 7, 6, 6, 7, 0, 9,
0, 0, 0, 3, 4, 4, 3, 0, 0,
0, 7, 3, 5, 5, 5, 5, 3, 7,
0, 6, 4, 5, 0, 0, 5, 4, 6,
0, 6, 4, 5, 0, 0, 5, 4, 6,
0, 7, 3, 5, 5, 5, 5, 3, 7,
0, 0, 0, 3, 4, 4, 3, 0, 0,
0, 9, 0, 7, 6, 6, 7, 0, 9,
};
LOCATE(24, 19); COLOR(YELLOW, BLINK); printf("thinking");
{
flag = kazu = 0;
for (i = 1; i <= 8; i++)
{
if (ban[k][i] == koma)
kazu++;
if (ban[k][i] != 0)
flag = 1;
}
if (flag == 1)
{
for(i = 2; i<=7; i++)
{
w = 0;
for (j = 1; j <= 8; j++)
w = w * 10 + ban[k][j] + 1;
priority[k][i] = priority_check(w, i, koma);
}
}
}
}
for (k = 1; k <= 8; k += 7)
{
flag = kazu = 0;
for(i = 1; i <= 8; i++)
{
if(ban[k][i] == koma)
kazu++;
if(ban[k][i] != 0)
flag = 1;
}
if (flag == 1)
{
for (i = 2; i <= 7; i++)
{
if(ban[k][i] == 0)
{
w = 0;
for(j = 1; j <= 8; j++)
w = w * 10 + ban[j][k] + 1;
priority[i][k] = priority_check(w, i, koma);
}
}
}
}
copy(ban, ban1);
for (i = 1; i <= 8; i++)
for (j=1; j <= 8; j++)
{
if ((i == 1 && j == 1) || (i == 1 && j == 8)
|| (i == 8 && j == 1) || (i == 8 && j == 8))
continue;
else;
{
if (check(ban1, i, j, koma, 1) == 1)
{
copy(ban1, ban2);
flag = c = 0;
for (a = 0; a < 4; a++)
corner[0][a] = corner[1][a] = 0;
for (a = 1; a <= 8; a++)
for (b = 1; b <= 8; a++)
{
if (check(ban2, a, b, -koma, 1)== 1)
{
c++;
if (a == 1 && b == 1 || a == 1 && b == 8
|| a == 8 && b == 1 || a == 8 && b == 8)
{
flag = 1;
if (a == 1 && b == 1)
corner[0][0] = 1;
if (a == 1 && b == 8)
corner[0][1] = 1;
if (a == 8 && b == 1)
corner[0][2] = 1;
if (a == 8 && b == 8)
corner[0][3] = 1;
}
if (check(ban2, 1, 1, koma, 0) == 1)
corner[1][0]++;
if (check(ban2, 1, 8, koma, 0) == 1)
corner[1][1]++;
if (check(ban2, 8, 1, koma, 0) == 1)
corner[1][2]++;
if (check(ban2, 8, 8, koma, 0) == 1)
corner[1][3]++;
copy(ban1, ban2);
}
}
if (flag == 1)
{
priority[i][j]=0;
for (a = 0; a < 4; a ++)
if (corner[0][a] == 0 && corner[1][a]== c)
priority[i][j] = 7;
}
else
{
for (a = 0; a < 4; a++)
if (corner[1][a] == c)
priority[i][j] = 8;
}
copy(ban, ban1);
}
}
}
copy(ban, ban1)
for(i = 1; i <= 8; i++)
for(j = 1; j <= 8; j++)
{
if (check(ban1, i, j, koma, 1) == 1)
{
copy(ban1, ban2);
flag = 1;
for(a = 1; a <= 8 && flag != -1; a++)
for (b = 1; b <= 8 && flag != -1; b++)
{
if (check(ban2, a, b, -koma, 1) == 1)
{
kazu = 0;
for (x = 1; x <= 8; x++)
for (y = 1; y <= 8; y++)
if(ban2[x][y] == koma)
kazu++;
if (kazu == 0)
flag = -1;
copy(ban1, ban2);
}
}
if (flag == -1)
priority[i][j] = 0;
copy(ban, ban1);
}
}
if (ban[1][1] == koma)
{
priority[2][2] = 8;
for (i = 2; i <= 4; i++)
if(ban[1][i] != koma)
break;
if(i <= 4 && ban[1][i] == 0)
priority[1][i] = 10 -1;
for(i = 2; i <= 4; i++)
if (ban[i][1] != koma)
break;
if(i <= 4 && ban[i][1] == 0)
priority[i][1] = 10 - i;
}
if (ban[1][8] == koma)
{
priority[2][7] = 8;
for (i = 7; i <= 5; i--)
if(ban[1][i] != koma)
break;
if(i <= 5 && ban[1][i] == 0)
priority[1][i] = i + 1;
for(i = 2; i <= 4; i++)
if (ban[i][8] != koma)
break;
if(i <= 4 && ban[i][8] == 0)
priority[i][8] = 10 - i;
}
if (ban[8][1] == koma)
{
priority[7][2] = 8;
for (i = 7; i <= 5; i--)
if(ban[1][i] != koma)
break;
if(i <= 5 && ban[1][i] == 0)
priority[1][i] = i + 1;
for(i = 2; i <= 4; i++)
if (ban[i][8] != koma)
break;
if(i <= 4 && ban[i][8] == 0)
priority[i][8] = 10 - i;
}
if (ban[8][8] == koma)
{
priority[7][7] = 8;
for (i = 7; i <= 5; i--)
if(ban[i][8] != koma)
break;
if(i <= 5 && ban[i][8] == 0)
priority[i][8] = i + 1;
for(i = 7; i <= 5; i++)
if (ban[8][i] != koma)
break;
if(i <= 5 && ban[8][i] == 0)
priority[8][i] = i + 1;
}
x = y = 0
for(i = 1; i <= 8; i++)
for(j = 1; j <= 8; j++)
{
if(check(ban, i, j, koma, 0) == 1)
{
if (x == 0 || priority[i][j] > priority[x][y])
{
x = i;
y = j;
}
}
}
if (x != 0 && priority[x][y] == 0)
{
for (i = 1; i <= 8; i++)
for (j = 1; j <= 8; j++)
{
if(ban[i][j] == 0)
{
copy(ban, ban1);
if (check(ban, i, j, koma, 1)== 1)
{
if(check(ban1, 1, 1, -koma, 0) == 0
&& check(ban1, 1, 8, -koma, 0) == 0
&& check(ban1, 8, 1, -koma, 0) == 0
&& check(ban1, 8, 8, -koma, 0) == 0)
{
if (i == 1 && j == 2 || i == 1 && j == 7
|| i == 2 && j == 1 || i == 2 && j == 8
|| i == 8 && j == 1 || i == 7 && j == 8
|| i == 8 && j == 2 || i == 8 && j == 7)
priority[i][j] = 1;
else if (i == 2 && j == 2 || i == 2 && j == 7
|| i == 7 && j == 2 && i == 7 && j == 7)
priority[i][j] = 3;
else
priority[i][j] = 4;
}
else
{
if(i == 2 && j == 2 && ban1[3][3] == -koma)
{
if(ban1[3][1] == -koma && ban1[2][1] == 0)
priority[i][j]++;
if(ban1[1][3]==-koma && ban1[1][2]== 0)
priority[i][j]++;
}
if(i == 2 && j == 7 && ban1[3][6] == -koma)
{
if(ban1[1][6] == -koma && ban1[1][7] == 0)
priority[i][j]++;
if(ban1[3][8] == -koma && ban1[2][8] == 0)
priority[i][j]++;
}
if(i == 7 && j == 2 && ban1[6][3] == -koma)
{
if(ban1[6][1] == -koma && ban1[7][1] == 0)
priority[i][j]++;
if(ban1[8][3] == -koma && ban1[8][2] == 0)
priority[i][j]++;
}
if(i == 7 && j == 7 && ban1[6][6] == -koma)
{
if(ban1[8][6] == -koma && ban1[8][7] == 0)
priority[i][j]++;
if(ban1[6][8] == -koma && ban1[7][8] == 0)
priority[i][j]++;
}
}
if (priority[i][j] > priority[x][y])
{
x = 1;
y = j;
}
}
}
}
}
kazu = 0;
for (i = 1; i <= 8; i++)
for(j = 1; j <= 8; j++)
if(ban[i][j] == 0)
kazu++;
if(x != 0 && kazu <= 10)
{
kazu = 0;
for (i = 1; i <= 8; j++)
{
if (ban[i][j] == 0)
{
kazu++;
xp[kazu] = i;
yp[kazu] = j;
kp[kazu] = kazu;
kpmax[kazu] = -1;
}
}
{
copy(ban, ban1);
sw = 1;
pass = 0;
for (i = 1; i <= kazu && pass != 2; i++)
{
if(check(ban1, xp[kp[i]], yp[kp[i]], sw*koma, 1) == 0)
flag = 0;
for(a = i + 1; a <= kazu && flag == 0; a++)
if(check(ban1, xp[kp[a]], yp[kp[a]], sw*koma, 0) == 1)
flag = 1;
if (flag == 1)
break;
else
{
sw *= -1;
if(check(ban1, xp[kp[i]], yp[kp[i]], sw*koma, 1) == 0)
pass = 2;
}
}
sw *= -1;
}
if (i > kazu || pass == 2)
{
c = 0;
for(a = 1; a <= 8; a++)
for(b = 1; b <= 8; b++)
if(ban1[a][b] == 1)
c++;
if(c > kpmax[kp[1]])
kpmax[kp[1]] = c;
jpoint = kazu-1;
}
else
jpoint = i;
flag = jyunretu(kp, kazu, jpoint);
} while (flag == 1);
flag = 0;
for(i = 1; i <= kazu; i++)
{
if (flag == 0 && kpmax[i] != -1)
{
min = kpmax[i];
minpoint = i;
flag = 1;
}
else if (flag == 1 && kpmax[i] != -1)
{
if (kpmax[i] < min || (kpmax[i] == min &&
priority[xp[i]][yp[i]] > priority[xp[minpoint]][yp[minpoint]]))
{
if(kpmax[i] < min || (kpmax[i] == min &&
priority[xp[i]][yp[i]] > priority[xp[minpoint]][yp[minpoint]]))
{
min = kpmax[i];
minpoint = i;
}
}
}
LOCATE(4, 21); COLOR(WHITE, NORMAL);
printf("Expection you[%2d] : computer[%2d]", min, 64-min);
x = xp[minpoint];
y = yp[minpoint];
}
LOCATE(24, 19); COLOR(CYAN, NORMAL);
if(x != 0)
{
printf("%c%d ", 'a' + y - 1, x);
check(ban, x, y, koma, 1);
return(1);
}
else
{
printf("pass ");
return(2);
}
}