diff options
Diffstat (limited to 'src/maze.c')
-rw-r--r-- | src/maze.c | 72 |
1 files changed, 46 insertions, 26 deletions
@@ -4,39 +4,48 @@ #include <string.h> /** - * Returns a filled maze grid. + * Returns a filled grid. * * Arguments: - * - width: The width of the new maze - * - height: The height of the new maze - * - wall: The wall to fill the new maze with + * - width: The width of the new grid + * - height: The height of the new grid + * - fill: A string to fill the new grid with */ -char ***create_maze_grid(int width, int height, char *wall) +char ***create_grid(int width, int height, char *fill) { - char ***maze; + char ***grid; - // Fill the maze with walls - maze = malloc(height * sizeof(char **)); + // Fill the grid + grid = malloc(height * sizeof(char **)); for (int y = 0; y < height; y++) { - maze[y] = malloc(width * sizeof(char *)); + grid[y] = malloc(width * sizeof(char *)); for (int x = 0; x < width; x++) { - maze[y][x] = wall; + grid[y][x] = fill; } } - return maze; + return grid; } -struct Maze maze_create(struct MazeSize size, char *wall) +struct Maze maze_create(struct Dimensions dimens, char *wall) { - struct Maze new_maze; - new_maze.grid = create_maze_grid(size.width * 2 + 1, size.height * 2 + 1, wall); - new_maze.size = size; + struct Maze maze; + + maze.dimens = dimens; + + struct Dimensions full_dimens = { + .width = dimens.width * 2 + 1, + .height = dimens.height * 2 + 1 + }; + + maze.full_dimens = full_dimens; - return new_maze; + maze.grid = create_grid(full_dimens.width, full_dimens.height, wall); + + return maze; } void get_neighbours(struct Maze maze, struct Position pos, struct Position neighbours[3], int *neighbour_cnt) @@ -47,7 +56,7 @@ void get_neighbours(struct Maze maze, struct Position pos, struct Position neigh neighbours[*neighbour_cnt] = down_neighbour_pos; (*neighbour_cnt)++; } - if (pos.y != maze.size.height - 1 && strcmp(maze.grid[(pos.y + 1) * 2 + 1][pos.x * 2 + 1], " ") != 0) + if (pos.y != maze.dimens.height - 1 && strcmp(maze.grid[(pos.y + 1) * 2 + 1][pos.x * 2 + 1], " ") != 0) { struct Position up_neighbour_pos = {.x = pos.x, .y = pos.y + 1}; neighbours[*neighbour_cnt] = up_neighbour_pos; @@ -59,7 +68,7 @@ void get_neighbours(struct Maze maze, struct Position pos, struct Position neigh neighbours[*neighbour_cnt] = left_neighbour_pos; (*neighbour_cnt)++; } - if (pos.x != maze.size.width - 1 && strcmp(maze.grid[pos.y * 2 + 1][(pos.x + 1) * 2 + 1], " ") != 0) + if (pos.x != maze.dimens.width - 1 && strcmp(maze.grid[pos.y * 2 + 1][(pos.x + 1) * 2 + 1], " ") != 0) { struct Position right_neighbour_pos = {.x = pos.x + 1, .y = pos.y}; neighbours[*neighbour_cnt] = right_neighbour_pos; @@ -67,6 +76,16 @@ void get_neighbours(struct Maze maze, struct Position pos, struct Position neigh } } +int is_whole_maze_visited(struct Maze maze, int visited_pos_cnt) +{ + if (visited_pos_cnt == (maze.dimens.height * maze.dimens.width) - 1) + { + return 1; + } + + return 0; +} + /** * Excavates a maze. * @@ -78,7 +97,7 @@ void get_neighbours(struct Maze maze, struct Position pos, struct Position neigh */ void maze_excavate(struct Maze maze, struct Position start_pos) { - struct PositionStack *path = create_pos_stack(maze.size.width * maze.size.height); + struct PositionStack *path = create_pos_stack(maze.dimens.width * maze.dimens.height); pos_stack_push(path, start_pos); @@ -96,9 +115,8 @@ void maze_excavate(struct Maze maze, struct Position start_pos) if (neighbour_cnt == 0) { - if (visited_pos_cnt == (maze.size.height * maze.size.width) - 1) + if (is_whole_maze_visited(maze, visited_pos_cnt)) { - // The whole maze have been visited break; } @@ -118,14 +136,16 @@ void maze_excavate(struct Maze maze, struct Position start_pos) } } -void maze_print(char ***maze, int width, int height) +void maze_print(struct Maze maze) { - for (int y = 0; y < height; y++) + struct Dimensions full_dimens = maze.full_dimens; + + for (int y = 0; y < full_dimens.height; y++) { - for (int x = 0; x < width; x++) + for (int x = 0; x < full_dimens.width; x++) { - printf("%s", maze[y][x]); + printf("%s", maze.grid[y][x]); } printf("\n"); } -}
\ No newline at end of file +} |