+#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;
}
}
+ /* printf("Counting neighbors"); */
for (int x = 0; x < b->board_x; ++x)
for (int y = 0; y < b->board_y; ++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;
}
}
}
}
+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)
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)
{
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)
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;