return (a) ? dy : dx;
}
-int _checklines (board_t *board, int x, int y, int id)
+int _checkline (board_t *board, int x, int y, int id, int dir)
{
int ret = 0;
- int dir;
-
- for (dir = 0; dir < 8; dir++) {
- int dx = _evaldir (dir, 0);
- int dy = _evaldir (dir, 1);
-
- int n = 1;
- int line = 0;
- VERBOSE (DEBUG, printf ("dx: %d dy: %d ", dx, dy));
- while ((x + n * dx >= 0) && (x + n * dx < board->width) &&
- (y + n * dy >= 0) && (y + n * dy < board->height)) {
- char *cell = getcell (board, x + n * dx, y + n * dy);
- VERBOSE (DEBUG, printf ("cell: 0x%02x (%c) ", *cell, *cell));
- if (*cell == (id ? '0' : '1')) {
- n++;
- } else if (*cell == '0' + id) {
- line = n - 1;
- break;
- } else {
- break;
- }
+ int dx = _evaldir (dir, 0);
+ int dy = _evaldir (dir, 1);
+
+ int n = 1;
+ while ((x + n * dx >= 0) && (x + n * dx < board->width) &&
+ (y + n * dy >= 0) && (y + n * dy < board->height)) {
+ char *cell = getcell (board, x + n * dx, y + n * dy);
+ if (*cell == (id ? '0' : '1')) {
+ n++;
+ } else if (*cell == '0' + id) {
+ ret = (n > 1);
+ break;
+ } else {
+ break;
}
- if (line) {
- VERBOSE (DEBUG, printf ("n: %d", n));
- n = 1;
- while ((x + n * dx >= 0) && (x + n * dx < board->width) &&
- (y + n * dy >= 0) && (y + n * dy < board->height)) {
- char *cell = getcell (board, x + n * dx, y + n * dy);
- if (*cell == (id ? '0' : '1')) {
- n++;
- *cell = '0' + id;
- } else {
- break;
- }
- }
- ret = 1;
+ }
+ return ret;
+}
+
+void _switchdisks (board_t *board, int x, int y, int id, int dir)
+{
+ int dx = _evaldir (dir, 0);
+ int dy = _evaldir (dir, 1);
+
+ int n = 1;
+ while ((x + n * dx >= 0) && (x + n * dx < board->width) &&
+ (y + n * dy >= 0) && (y + n * dy < board->height)) {
+ char *cell = getcell (board, x + n * dx, y + n * dy);
+ if (*cell == (id ? '0' : '1')) {
+ n++;
+ *cell = '0' + id;
+ } else {
+ break;
}
- VERBOSE (DEBUG, printf ("\n"));
}
- return ret;
+ *getcell (board, x, y) = '0' + id;
}
int putdisk (board_t *board, int x, int y, int id)
{
int ret = 0;
- char *cell = getcell (board, x, y);
- if (*cell == ' ') {
- if (_checklines (board, x, y, id)) {
- *cell = '0' + id;
- ret = 1;
+ if (*getcell (board, x, y) == ' ') {
+ int dir;
+ for (dir = 0; dir < 8; dir++) {
+ if (_checkline (board, x, y, id, dir)) {
+ _switchdisks (board, x, y, id, dir);
+ ret = 1;
+ }
}
}
return ret;