diff --git a/src/grid.c b/src/grid.c new file mode 100644 index 0000000..360628b --- /dev/null +++ b/src/grid.c @@ -0,0 +1,70 @@ +#include +#include "grid.h" + +#define MAX_EDGE_WEIGHT 100 + +mazegrid_t mazegrid_new(size_t width, size_t height) { + mazeedges_t** grid = calloc(height, sizeof(mazeedges_t*)); + for (size_t i = 0; i < height; i++) { + grid[i] = calloc(width, sizeof(mazeedges_t)); + for (size_t j = 0; j < width; j++) { + grid[i][j].up = 0; + grid[i][j].right = 0; + } + } + mazegrid_t result = { .width = width, .height = height, .grid = grid }; + return result; +} + +void mazegrid_free(mazegrid_t* g) { + for (size_t i = 0; i < g->height; i++) { + free(g->grid[i]); + } + free(g->grid); + g->width = g->height = 0; +} + +int mazegrid_set_edge(mazegrid_t* g, size_t x, size_t y, mazeedge_dir_t dir, edgeweight_t wt) { + if ((x >= g->width) || (y >= g->height)) return 0; + if ((x == 0) && (dir == EDGE_LEFT)) return 0; + if ((y == 0) && (dir == EDGE_DOWN)) return 0; + if ((x == g->width - 1) && (dir == EDGE_RIGHT)) return 0; + if ((y == g->height - 1) && (dir == EDGE_UP)) return 0; + if (dir == EDGE_LEFT) return mazegrid_set_edge(g, x - 1, y, EDGE_RIGHT, wt); + if (dir == EDGE_DOWN) return mazegrid_set_edge(g, x, y - 1, EDGE_UP, wt); + if (dir == EDGE_RIGHT) { g->grid[y][x].right = wt; return 1; } + g->grid[y][x].up = wt; return 1; +} + +edgeweight_t mazegrid_get_edge(mazegrid_t const* g, size_t x, size_t y, mazeedge_dir_t dir) { + if ((x >= g->width) || (y >= g->height)) return 0; + if ((x == 0) && (dir == EDGE_LEFT)) return 0; + if ((y == 0) && (dir == EDGE_DOWN)) return 0; + if ((x == g->width - 1) && (dir == EDGE_RIGHT)) return 0; + if ((y == g->height - 1) && (dir == EDGE_UP)) return 0; + if (dir == EDGE_LEFT) return mazegrid_get_edge(g, x - 1, y, EDGE_RIGHT); + if (dir == EDGE_DOWN) return mazegrid_get_edge(g, x, y - 1, EDGE_UP); + if (dir == EDGE_RIGHT) return g->grid[y][x].right; + else return g->grid[y][x].up; +} + +void mazegrid_randomize(mazegrid_t* g) { + for (size_t i = 0; i < g->height; i++) { + for (size_t j = 0; j < g->width; j++) { + if (i < g->height - 1) g->grid[i][j].up = (edgeweight_t)(random()%MAX_EDGE_WEIGHT); + if (j < g->width - 1) g->grid[i][j].right = (edgeweight_t)(random()%MAX_EDGE_WEIGHT); + } + } +} + +void mazegrid_print(mazegrid_t const* g, FILE * f) { + size_t row = g->height - 1; + while (1) { + for (size_t col = 0; col < g->width; col++) { + fprintf(f, "%4u,%3u", g->grid[row][col].up, g->grid[row][col].right); + } + fprintf(f, "\n"); + if (row == 0) break; + row--; + } +} diff --git a/src/grid.h b/src/grid.h index bc838e3..a886aac 100644 --- a/src/grid.h +++ b/src/grid.h @@ -1,7 +1,9 @@ #ifndef _GRID_H #define _GRID_H 1 -typedef uint8 edgeweight_t; +#include + +typedef uint8_t edgeweight_t; typedef struct { edgeweight_t up, right; @@ -25,4 +27,8 @@ void mazegrid_free(mazegrid_t* g); int mazegrid_set_edge(mazegrid_t* g, size_t x, size_t y, mazeedge_dir_t dir, edgeweight_t wt); edgeweight_t mazegrid_get_edge(mazegrid_t const* g, size_t, size_t y, mazeedge_dir_t dir); +void mazegrid_randomize(mazegrid_t* g); + +void mazegrid_print(mazegrid_t const* g, FILE * f); + #endif // !def(_GRID_H)