From 47fe76964aa16c94b407b3119bf1c2b298977b90 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Thu, 19 Sep 2024 00:28:46 +0200 Subject: [PATCH] put disk (not functional) --- constant.c | 6 ++++- function.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ function.h | 2 ++ reversi.c | 14 ++++++++--- 4 files changed, 89 insertions(+), 4 deletions(-) diff --git a/constant.c b/constant.c index 8b5229d..129865d 100644 --- a/constant.c +++ b/constant.c @@ -29,8 +29,12 @@ board_t *getboard (char *name) board = initboard (10, 10); } else if (strcmp (name, "12x12") == 0) { board = initboard (12, 12); + } else if (strcmp (name, "14x14") == 0) { + board = initboard (14, 14); + } else if (strcmp (name, "16x16") == 0) { + board = initboard (16, 16); } else if (strcmp (name, "list") == 0) { - printf ("board: 6x6 8x8 10x10 12x12\n"); + printf ("board: 6x6 8x8 10x10 12x12 14x14 16x16\n"); board = (board_t *)(-1); } diff --git a/function.c b/function.c index 4b3c1ff..c6c3448 100644 --- a/function.c +++ b/function.c @@ -196,4 +196,75 @@ board_t *loadboard (char *str) return board; } +int _evaldir (int dir, int a) +{ + int dx = 0; + int dy = 0; + switch (dir) { + case 0: + dx = 1; + break; + case 1: + dx = dy = 1; + break; + case 2: + dy = 1; + break; + case 3: + dx = -1; + dy = 1; + break; + case 4: + dx = -1; + break; + case 5: + dx = dy = -1; + break; + case 6: + dy = -1; + break; + case 7: + dx = 1; + dy = -1; + break; + } + + return (a) ? dy : dx; +} + +int _checklines (board_t *board, int x, int y, int id) +{ + int ret = 0; + int dir; + + for (dir = 0; dir < 8; 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) && + (*getcell (board, x + n * dx, y + n * dy) == '0' + (id ? 0 : 1))) { + n++; + *getcell (board, x + n * dx, y + n * dy) = '0' + id; + ret = 1; + } + } + + return ret; +} + +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; + } + } + return ret; +} + /* vim: set ts=4 sw=4 et: */ diff --git a/function.h b/function.h index 0483576..7a94cf7 100644 --- a/function.h +++ b/function.h @@ -39,6 +39,8 @@ char *atos (char *str); board_t *loadboard (char *str); +int putdisk (board_t *board, int x, int y, int id); + #endif /* __FUNCTION_H__ */ /* vim: set ts=4 sw=4 et: */ diff --git a/reversi.c b/reversi.c index 3afe321..fdbe5b8 100644 --- a/reversi.c +++ b/reversi.c @@ -20,7 +20,7 @@ char *version = "0.1"; char *filename = NULL; int scale = 1; -char *boardname = "8x8"; +char *boardname = "12x12"; char *help = " Move up cursor\n" @@ -205,8 +205,9 @@ int main (int argc, char *argv[]) /* game controls */ switch (ch) { - case '\n': - case '\r': + case KEY_BACKSPACE: + case KEY_DELETE: + case 127: case ' ': id = (id == 0) ? 1 : 0; break; @@ -234,6 +235,13 @@ int main (int argc, char *argv[]) xcursor++; } break; + case '\n': + case '\r': + case 'o': + if (putdisk (board, xcursor, ycursor, id)) { + id = (id == 0) ? 1 : 0; + } + break; } } -- 2.30.2