]> MadKous Network Git Server - rogue.git/commitdiff
Add Clearing master
authorMatthew Kousoulas <shaman.kous@gmail.com>
Wed, 3 Jan 2024 17:27:43 +0000 (12:27 -0500)
committerMatthew Kousoulas <shaman.kous@gmail.com>
Wed, 3 Jan 2024 17:27:43 +0000 (12:27 -0500)
src/board.c
src/board.h
src/main.c
src/term.c

index 6111cc7da78a98905044ab79607d17a4074b55e9..b580a59f23239171d5b42d7a1dcc418a779089d6 100644 (file)
@@ -1,17 +1,21 @@
+#include <stdio.h>
 #include <stdlib.h>
+#include <unistd.h>
 
 #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;
        }
 }
 
index 94eafb13800af9250e4670a162778a54cf0883f3..bdd3103f01dd8faa58456d8905bf595931bc9afa 100644 (file)
@@ -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;
index 3bf06a3ac2c1ec3e6579534d93987e1a460449fa..b34e25bb09e950eb816e63a5e26c1373dcc8966d 100644 (file)
@@ -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;
index 29d7b954c427080e97e18cfa13438cd0b53b755a..630d6acdee921e075480250c2ae23d40cf0b2c29 100644 (file)
@@ -1,4 +1,5 @@
 #include <errno.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <termios.h>
 #include <unistd.h>
@@ -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");
 }