Maze grid datatypes

This commit is contained in:
2021-04-15 18:01:19 -04:00
parent b127690a48
commit 5496a8bee8
2 changed files with 77 additions and 1 deletions

70
src/grid.c Normal file
View File

@@ -0,0 +1,70 @@
#include <stdlib.h>
#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--;
}
}

View File

@@ -1,7 +1,9 @@
#ifndef _GRID_H
#define _GRID_H 1
typedef uint8 edgeweight_t;
#include <stdio.h>
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)