CSC8501_Advanced_Programming_For_Games / MazeGeneration / MazeGenerator.h
MazeGenerator.h
Raw
#pragma once
#include <iostream>
#include <cstdint>
#include <stdexcept>
#include <random>
#include <algorithm>

#include <time.h>

class MazeGenerator {
public:
		explicit MazeGenerator(uint32_t height, uint32_t width);
		~MazeGenerator();

		static constexpr uint32_t Maze_Char_Space = 32; // " " 
		static constexpr uint32_t Maze_Char_Exit = 69; // E
		static constexpr uint32_t Maze_Char_Start = 83; // S
		static constexpr uint32_t Maze_Char_Wall = 88; // X 
		static constexpr uint32_t Maze_Char_Path = 111; // o 
		static constexpr uint32_t Maze_Char_Nul = 0;

		static constexpr uint32_t Maze_Char_Entrance = 69; // E
		static constexpr uint32_t Maze_Char_Finish = 70; // F
		static constexpr uint32_t Maze_Char_Player = 80;    // P
		
		int Maze_Height_Half;
		int Maze_Width_Half;

		int Maze_Exits;
		int Maze_Max_Exits;

		int Maze_Centre_Top;
		int Maze_Centre_Bottom;
		int Maze_Centre_Left;
		int Maze_Centre_Right;
		int Maze_Centre_Size;

		int Maze_All_Nodes;
		int Maze_Available_Nodes;
		int Maze_Nodes_To_Clear;

		void InitializeMapDetails();

		void SetCell(uint32_t y, uint32_t x, uint32_t value);
		uint32_t GetCell(uint32_t y, uint32_t x) { return m_area[y][x]; }

		char** GetMaze() { return m_area; }
		void SetMaze(char** maze, uint32_t mazeHeight, uint32_t mazeWidth);

		uint32_t GetHeight() { return m_areaHeight; }
		uint32_t GetWidth() { return m_areaWidth; }

		void GenerateWalls();
		void GenerateCentreSpace(uint32_t exitEntrance = Maze_Char_Start);
		void GenerateRandomExit(int n, int* exitsLocation, int* playerLocation, uint32_t exitEntrance = Maze_Char_Space);
		void PrintMaze();
protected:
		std::random_device random_device;

		static constexpr uint32_t vertical = 0u;
		static constexpr uint32_t horizontal = 1u;

		char** m_area;
		uint32_t m_areaHeight;
		uint32_t m_areaWidth;
};