Euphoria
generator_maze.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "core/table.h"
4 #include "base/vec2.h"
5 #include "core/image.h"
6 #include "base/enumtostring.h"
7 
8 #include <stack>
9 
10 namespace eu
11 {
12  struct Random;
13 }
14 
15 namespace eu::core::generator
16 {
17  namespace cell
18  {
19  enum Type
20  {
21  none = 0,
22  path_north = 1 << 0,
23  path_south = 1 << 1,
24  path_east = 1 << 2,
25  path_west = 1 << 3,
26  visited = 1 << 4
27  };
28  }
29 
30  enum class Direction
31  {
32  north,
33  south,
34  east,
35  west
36  };
37 
38  using Maze = Table<int>;
39 
40  // todo(Gustav): implement more generators
41  // https://bost.ocks.org/mike/algorithms/#maze-generation
42  // https://gamedev.stackexchange.com/questions/75632/procedural-generation-of-tile-based-2d-world
43  // https://unity3d.com/learn/tutorials/s/procedural-cave-generation-tutorial
44  // https://gamedev.stackexchange.com/questions/153734/generate-cave-like-terrain-in-2d
45  // http://www.gamasutra.com/blogs/HermanTulleken/20161005/282629/Algorithms_for_making_more_interesting_mazes.php
46 
47  struct Algorithm
48  {
49  Algorithm() = default;
50  virtual ~Algorithm() = default;
51 
52  Algorithm(const Algorithm&) = delete;
53  Algorithm(Algorithm&&) = delete;
54  void operator=(const Algorithm&) = delete;
55  void operator=(Algorithm&&) = delete;
56 
57  virtual void setup() = 0;
58  virtual void update() = 0;
59  [[nodiscard]] virtual bool is_done() const = 0;
60  };
61 
63  {
64  generator::Maze* maze = nullptr;
65  Random* random = nullptr;
66 
67  std::stack<vec2i> stack;
68  int visited_cells = 0;
69 
70  void setup() override;
71  void update() override;
72  [[nodiscard]] bool is_done() const override;
73  };
74 
75  struct RandomTraversal : public Algorithm
76  {
77  generator::Maze* maze = nullptr;
78  Random* random = nullptr;
79 
80  struct Entry
81  {
84  };
85  std::vector<Entry> frontier;
86 
87  void setup() override;
88  void update() override;
89  [[nodiscard]] bool is_done() const override;
90  };
91 
92  struct Drawer
93  {
94  generator::Maze* maze = nullptr;
95 
96  int cell_size = 3;
97  int wall_size = 1;
98 
101 
107 
109 
110  Drawer();
111 
112  void draw();
113 
114  [[nodiscard]] Rgbi calc_cell_color(int x, int y) const;
115  };
116 }
Definition: assert.h:90
WEL512 Random Number Generator.
Definition: random.h:21
Definition: rgb.h:26
virtual bool is_done() const =0
void operator=(const Algorithm &)=delete
virtual ~Algorithm()=default
void operator=(Algorithm &&)=delete
Algorithm(const Algorithm &)=delete
Algorithm(Algorithm &&)=delete
RecursiveBacktracker * tracker
RandomTraversal * traversal
Rgbi calc_cell_color(int x, int y) const
Definition: vec2.h:72