Maze grid datatypes
This commit is contained in:
70
src/grid.c
Normal file
70
src/grid.c
Normal 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--;
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user