#define EXTERN_GAME_H
#include "main.h"
char visited[WIDTH][HEIGHT];
int qx[SIZE], qy[SIZE];
int sx[SIZE], sy[SIZE];
int qfront = 0, qrear = 0, top = 0;
int go_isdead(int x, int y)
{
top = 0;
if (!bounded(x, y) || board[x][y] != color)
return 0;
int dx[] = {0, 0, -1, 1};
int dy[] = {1, -1, 0, 0};
memset(visited, false, sizeof(visited));
qfront = qrear = 0;
qx[qrear] = x;
qy[qrear] = y;
qrear = (qrear+1) % SIZE;
visited[x][y] = true;
while (qfront != qrear) {
x = qx[qfront];
y = qy[qfront];
qfront = (qfront+1) % SIZE;
sx[top] = x;
sy[top++] = y;
for (int i = 0; i < 4; ++i) {
x += dx[i];
y += dy[i];
if (bounded(x, y) && !visited[x][y]) {
if (board[x][y] == color) {
qx[qrear] = x;
qy[qrear] = y;
qrear = (qrear+1) % SIZE;
visited[x][y] = true;
} else if (board[x][y] == BLANK) {
return 0;
}
}
x -= dx[i];
y -= dy[i];
}
}
return top;
}
int go_do_eat(int x, int y)
{
int ret = top = go_isdead(x, y);
while (top--) {
x = sx[top];
y = sy[top];
set_board(x, y, BLANK);
}
return ret;
}
int go_eat(int x, int y)
{
color = flip(color);
int ret
= go_do_eat(x, y+1)
+ go_do_eat(x, y-1)
+ go_do_eat(x-1, y)
+ go_do_eat(x+1, y);
if (ret)
MSG("提子: %d", ret);
color = flip(color);
return ret;
}
bool rule_go(int x, int y)
{
board[x][y] = color;
int flag_dead = go_isdead(x, y);
int flag_eat = go_eat(x, y);
if (flag_dead && !flag_eat) {
board[x][y] = BLANK;
MSG("此处不可落子");
} else {
set_board(x, y, color);
color = flip(color);
}
return false;
}