From 714fddd1314eb7ad9c755dd3786da34d3d26e90b Mon Sep 17 00:00:00 2001 From: Matthew Kousoulas Date: Wed, 3 Jan 2024 12:27:43 -0500 Subject: [PATCH] Add Clearing --- src/board.c | 56 +++++++++++++++++++++------------------- src/board.h | 3 ++- src/main.c | 73 +++++++++++++++++++++++++++++++---------------------- src/term.c | 4 ++- 4 files changed, 78 insertions(+), 58 deletions(-) diff --git a/src/board.c b/src/board.c index 6111cc7..b580a59 100644 --- a/src/board.c +++ b/src/board.c @@ -1,17 +1,21 @@ +#include #include +#include #include "board.h" board* make_board(int mines, int width, int height) { - board *b = malloc(sizeof(board)); + board *b = malloc(sizeof (board)); + /* printf("Creating Board"); */ b->board_x = width; b->board_y = height; b->mines = mines; - b->grid = calloc(width * height, sizeof(tile)); - b->neighbors = calloc(width * height, sizeof(char)); + b->grid = calloc(width * height, sizeof *b->grid); + b->neighbors = calloc(width * height, sizeof *b->neighbors); + /* printf("Placing Mines"); */ for (int n = 0; n < b->mines;) { int x = rand() % b->board_x; @@ -23,6 +27,7 @@ board* make_board(int mines, int width, int height) } } + /* printf("Counting neighbors"); */ for (int x = 0; x < b->board_x; ++x) for (int y = 0; y < b->board_y; ++y) { @@ -69,36 +74,35 @@ void clear_tile(board *b, int x, int y) { if (x < 0 || x >= b->board_x || y < 0 || y >= b->board_y) + { return; + } tile t = b->grid[INDEX(b, x, y)]; + + if (t & CLEARED) + { + return; + } + char n = b->neighbors[INDEX(b, x, y)]; - /* if (n == '.' && !(t & MINED)) */ - if (1) + if (n == '.' && !(t & MINED)) { - b->grid[INDEX(b, b->cursor_x, b->cursor_y)] |= CLEARED; + b->grid[INDEX(b, x, y)] |= CLEARED; - if (x + 1 < b->board_x) - { - /* if (y + 1 < b->board_y) */ - /* clear_tile(b, x+1, y+1); */ - /* clear_tile(b, x+1, y); */ - /* if (y > 0) */ - /* clear_tile(b, x+1, y-1); */ - } - /* if (y + 1 < b->board_y) */ - /* clear_tile(b, x, y+1); */ - if (y > 0) - clear_tile(b, x, y-1); - if (x > 0) - { - /* if (y + 1 < b->board_y) */ - /* clear_tile(b, x-1, y+1); */ - clear_tile(b, x-1, y); - if (y > 0) - clear_tile(b, x-1, y-1); - } + clear_tile(b, x+1, y+1); + clear_tile(b, x+1, y); + clear_tile(b, x+1, y-1); + clear_tile(b, x, y+1); + clear_tile(b, x, y-1); + clear_tile(b, x-1, y+1); + clear_tile(b, x-1, y); + clear_tile(b, x-1, y-1); + } + else if (!(t & MINED)) + { + b->grid[INDEX(b, x, y)] |= CLEARED; } } diff --git a/src/board.h b/src/board.h index 94eafb1..bdd3103 100644 --- a/src/board.h +++ b/src/board.h @@ -5,7 +5,7 @@ #define MINED 0000002 #define FLAGGED 0000004 -#define INDEX(B, X, Y) (((Y) * B->board_y) + (X)) +#define INDEX(B, X, Y) (((Y) * B->board_x) + (X)) typedef unsigned char tile; @@ -15,6 +15,7 @@ typedef struct board { int cursor_x; int cursor_y; int mines; + int flags; tile *grid; char *neighbors; } board; diff --git a/src/main.c b/src/main.c index 3bf06a3..b34e25b 100644 --- a/src/main.c +++ b/src/main.c @@ -88,8 +88,33 @@ void take_action(action a, board *b) } } +void draw_box(int x, int y, int w, int h) +{ + // ╔═╗ + // ║ ║ + // ╚═╝ + + printf("\x1b[%d;%dH", y, x); + printf("╔"); + for (int i = 0; i < w; ++i) + printf("═"); + printf("╗"); + + for (int j = y ; j < y + h; ++j) + printf("\x1b[%d;%dH║\x1b[%d;%dH║", j + 1, x, j + 1, x + w + 1); + + printf("\x1b[%d;%dH", y + h + 1, x); + printf("╚"); + for (int i = 0; i < w; ++i) + printf("═"); + printf("╝"); +} + void draw_grid(board *b) { + draw_box(1,1,b->board_x,b->board_y); + printf("\x1b[2;2H"); + /* fflush(stdout); */ for (int y = 0; y < b->board_y; ++y) { for (int x = 0; x < b->board_x; ++x) @@ -97,10 +122,11 @@ void draw_grid(board *b) if (x == b->cursor_x && y == b->cursor_y) WRITE_CTRL("[7m"); + /* printf("%03d", INDEX(b, x, y)); */ tile t = b->grid[INDEX(b, x, y)]; if (t & FLAGGED) { - write(STDOUT_FILENO, "?", 1); + write(STDOUT_FILENO, "X", 1); } else if (t & CLEARED) { @@ -121,40 +147,27 @@ void draw_grid(board *b) if (x == b->cursor_x && y == b->cursor_y) WRITE_CTRL("[27m"); } - write(STDOUT_FILENO, "\n\r", 2); + printf("\x1b[%d;2H", 3+y); + /* fflush(stdout); */ } - write(STDOUT_FILENO, "\n\rDebug: ", 9); + printf("\n\rDebug: (%d,%d)\n\r", b->cursor_x, b->cursor_y); + /* fflush(stdout); */ - char buf[16]; - sprintf(buf, "(%d,%d) %d", b->cursor_x, b->cursor_y, INDEX(b, b->cursor_x, b->cursor_y)); - write(STDOUT_FILENO, buf, 16); + /* for (int n = 0; n < b->board_x * b->board_y; ++n) */ + /* printf("%d,", b->grid[n]); */ - write(STDOUT_FILENO, "\n\r\n\r", 4); + /* write(STDOUT_FILENO, "\n\rDebug: ", 9); */ - int x = b->cursor_x; - int y = b->cursor_y; + /* char buf[16]; */ + /* sprintf(buf, "(%d,%d) %0d", b->cursor_x, b->cursor_y, INDEX(b, b->cursor_x, b->cursor_y)); */ + /* write(STDOUT_FILENO, buf, 16); */ - if (x + 1 < b->board_x) - { - if (y + 1 < b->board_y) - write(STDOUT_FILENO, "1", 1); - write(STDOUT_FILENO, "2", 1); - if (y > 0) - write(STDOUT_FILENO, "3", 1); - } - if (y + 1 < b->board_y) - write(STDOUT_FILENO, "4", 1); - if (y > 0) - write(STDOUT_FILENO, "5", 1); - if (x > 0) - { - if (y + 1 < b->board_y) - write(STDOUT_FILENO, "6", 1); - write(STDOUT_FILENO, "7", 1); - if (y > 0) - write(STDOUT_FILENO, "8", 1); - } + /* write(STDOUT_FILENO, "\n\r\n\r", 4); */ + + // 853 + // 7#2 + // 641 } int main(int argc, char** argv) @@ -162,7 +175,7 @@ int main(int argc, char** argv) init_term(); srand(time(NULL)); - board *b = make_board(10, 10, 10); + board *b = make_board(30, 25, 15); char c = '\0'; action a = nop; diff --git a/src/term.c b/src/term.c index 29d7b95..630d6ac 100644 --- a/src/term.c +++ b/src/term.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -16,6 +17,7 @@ void reset_term() void init_term() { + setvbuf(stdout, NULL, _IONBF, 0); tcgetattr(STDIN_FILENO, &orig_termios); atexit(reset_term); @@ -48,7 +50,7 @@ char read_key() void clear_screen() { - WRITE_CTRL("[2J"); + /* WRITE_CTRL("[2J"); */ WRITE_CTRL("[H"); } -- 2.45.3