Simple maze

From RogueBasin
Revision as of 09:20, 24 September 2006 by Ancient (talk | contribs) (Wikified Jakub's maze algorithm)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Simple maze generator written in 10 minutes :) The source code is public domain.

  // Simple Maze Generator in C++ by Jakub Debski '2006 
  
  #include <time.h>
  #include <vector>
  #include <list>
  using namespace std;
  
  int main() 
  { 
          srand(time(0)); 
  
          const int maze_size_x=80; 
          const int maze_size_y=25; 
          vector < vector < bool > > maze; 
          list < pair < int, int> > drillers; 
  
          maze.resize(maze_size_y); 
          for (size_t y=0;y<maze_size_y;y++) 
                  maze[y].resize(maze_size_x); 
  
          for (size_t x=0;x<maze_size_x;x++) 
                  for (size_t y=0;y<maze_size_y;y++) 
                          maze[y][x]=false; 
  
          drillers.push_back(make_pair(maze_size_x/2,maze_size_y/2)); 
          while(drillers.size()>0) 
          { 
                  list < pair < int, int> >::iterator m,_m,temp; 
                  m=drillers.begin(); 
                  _m=drillers.end(); 
                  while (m!=_m) 
                  { 
                          bool remove_driller=false; 
                          switch(rand()%4) 
                          { 
                          case 0: 
                                  (*m).second-=2; 
                                  if ((*m).second<0 || maze[(*m).second][(*m).first]) 
                                  { 
                                          remove_driller=true; 
                                          break; 
                                  } 
                                  maze[(*m).second+1][(*m).first]=true; 
                                  break; 
                          case 1: 
                                  (*m).second+=2; 
                                  if ((*m).second>=maze_size_y || maze[(*m).second][(*m).first]) 
                                  { 
                                          remove_driller=true; 
                                          break; 
                                  } 
                                  maze[(*m).second-1][(*m).first]=true; 
                                  break; 
                          case 2: 
                                  (*m).first-=2; 
                                  if ((*m).first<0 || maze[(*m).second][(*m).first]) 
                                  { 
                                          remove_driller=true; 
                                          break; 
                                  } 
                                  maze[(*m).second][(*m).first+1]=true; 
                                  break; 
                          case 3: 
                                  (*m).first+=2; 
                                  if ((*m).first>=maze_size_x || maze[(*m).second][(*m).first]) 
                                  { 
                                          remove_driller=true; 
                                          break; 
                                  } 
                                  maze[(*m).second][(*m).first-1]=true; 
                                  break; 
                          } 
                          if (remove_driller) 
                                  m = drillers.erase(m); 
                          else 
                          { 
                                  drillers.push_back(make_pair((*m).first,(*m).second)); 
                                  // uncomment the line below to make the maze easier 
                                  // if (rand()%2) 
                                  drillers.push_back(make_pair((*m).first,(*m).second)); 
  
                                  maze[(*m).second][(*m).first]=true; 
                                  ++m; 
                          } 
                  } 
          } 
  
          // Done 
          for (size_t y=0;y<maze_size_y;y++) 
                  for (size_t x=0;x<maze_size_x;x++) 
                  { 
                          if (maze[y][x]==true) 
                                  printf("."); 
                          else 
                                  printf("#"); 
                  } 
  
          return 0; 
  
  } 

Sample result:

######.........#.#.......#.....#...#.....#.........#.#...#.#.......#.......##### 
######.#.###.#.#.#.#######.#.#####.#.###.#.#.#####.#.###.#.#.#######.########### 
.....#.#.#...#.#.........#.#.#.....#.###...#.#.....#.......#.......#.....####### 
.#.#.###.#.#####.#.#.#######.#.#.#.#.#####################.#.###.#######.####### 
.#.#.#...#...#...#.#...#.#.#.#.#.#.#.........#.....#...........#.#.............# 
####.#.#######.#######.#.#.#.#.#.#######.#.#.#.#.#.#.#######.#######.#######.#.# 
##...#...#####.#.#####.#...#...#.#...#.#.#.#...#.#...###...#.#.......#.......#.# 
####.###.#####.#.#####.#.###.#.###.###.#.#.###.#########.#####.###.############# 
.........###.#.....###.#...#.#.#.#.......#.#...#...#.#.#.#.......#.###...#.....# 
########.###.#.#.#.###.#.#.###.#.#.#####.#.###.#.###.#.#.#.#.###.#####.###.#.### 
.......#.....#.#.#.#...#.#...........#...#.#.....#.......#.#...#.#.........#...# 
####.#.#.#####.#.###.#######.#######.###.#.#.###.#.#####.#.#####.#.#.#####.##### 
...#.#.#.......#...#.....#.....#.#...#####.#...#.......#.#...#.....#...#.#.....# 
##.###.#.#.#.###.#####.#.#####.#.#.#######.#####.#####.#.###.#.###.#####.#####.# 
##...#...#.#.#.......#.#.....#...#.......#...#...#.....#.....#...#...........#.# 
####.#.###########.###.#.###.#####.#######.###.###########.###.###.#####.###.### 
####...###.....#...#.#.#...#...........###...#.###...#.###.###...#.....#.#.....# 
####.#####.#######.#.###.###.#.#####.#.#############.#.###.#####.#####.#.###.### 
####.........#.#...#.....#.#.#.#.....#.###.#...#.............#...#####.#...#...# 
######.#.#####.#.###.#.#.#.###.#######.###.#.#####.###.#################.####### 
######.#...#.#.....#.#.#.#...#...###...###.....#...#.......#########...#.......# 
######.###.#.#####.#####.#.###.#.###.#.###.#.###.###.#####.#########.#########.# 
######.#.#.#...###...#...#.#.#.#...#.#.....#.#.#...#.###...#########...#.......# 
########.#.###.#######.#.#.#.###.#######.###.#.#####.###############.#.###.##### 
########...###.........#.#.......#######.#.....#####.......#########.#.........#

With little changes you can get cool results, f.e.

  else 
  { 
          // drillers.push_back(make_pair((*m).first,(*m).second)); 
          // drillers.push_back(make_pair((*m).first,(*m).second)); 
          // change to 
          for (size_t index=0;index<10;index++) 
                  drillers.push_front(make_pair((*m).first,(*m).second)); 

gives "star-like" effect:

.#.#...#...#.....#...#...#...#.#...#...#.....#...#...#.......#...#.....#.....#.# 
.#.###.###.#####.###.###.###.#.###.###.#.#####.###.###.#######.###.#####.#####.# 
...#.#...#...#...#.#...#...#...#.#...#.....#...#.......#.............#.#...#...# 
##.#.###.###.###.#.###.###.###.#.###.#.#####.###.#######.#############.#.###.### 
.......#...#.#.#.....#.#.#.......#.#.....#...#...#.#...#...#...#.#.#.#...#...#.# 
######.###.#.#.#####.#.#.#######.#.###.###.###.###.#.###.###.###.#.#.#.###.###.# 
...#.#...#...#...#.......#.#...#.....#.....#...#.....#...#...#.#.......#...#...# 
##.#.###.###.###.#######.#.###.#####.#.#####.###.#####.###.###.#.#######.###.### 
.#...#.#.#.#...#.#.#.....#.#.#...#.......#...#.#...#.#.#...#.#...#.#...#.#...#.# 
.###.#.#.#.###.#.#.#####.#.#.###.#####.###.###.#.###.#.#.###.#.###.#.###.#.###.# 
.................#...#...#.#.#.#...#...#.......................................# 
####.###.###.###.###.###.#.#.#.###.###.#.###.###.###.###.###.###.###.###.###.### 
.#.#.#.#.#.#.#...........................#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.# 
.#.###.###.#####.#.#.#####.#####.#.###.#.#.###.###.###.###.###.#######.###.###.# 
.................#.#.#.....#.....#.#...#.......................................# 
##.###.#.###.#.###.#####.###.#.#.#####.###.#.#.###.#.###.###.#.#.###.#.###.#.#.# 
...#...#.#...#.#...#.....#...#.#.#.......#.#.#...#.#...#...#.#.#...#.#...#.#.#.# 
.###.#.###.#.###.#.#######.#.#.#####.#.#####.###.###.#.#######.###.###.#.###.### 
.#...#.#...#.#...#.#.......#.#.#.....#.....#...#...#.#.......#...#...#.#...#...# 
##.#.#####.###.#.###.###.###.#####.###.#.#.###.###.###.#.###.###.#.#####.#####.# 
...#.#.....#...#.#...#...#...#.....#...#.#...#...#...#.#...#...#.#.....#.....#.# 
.#.###.#.#####.###.###.###.###.#.###.#.###.#.###.###.###.#####.###.###.###.#.### 
.#.#...#.#.....#...#...#...#...#.#...#...#.#...#...#...#.....#...#...#...#.#...# 
.#####.#####.###.###.###.###.#.###.###.#####.#.###.###.###.#.###.#.#.###.###.### 
.#.....#.....#...#...#...#...#.#...#.......#.#...#...#...#.#...#.#.#...#...#...# 

or

          (*m).second-=2; 
          // if ((*m).second<0 || maze[(*m).second][(*m).first]) 
          // change to 
          if ((*m).second<0 || (maze[(*m).second][(*m).first] && rand()%5)) 

allows loops (sample loop top left corner is marked with comas):

.......#,,,,,,,,.#####.....#####...#...............#...#.###.....###...#.#.#.### 
.#######,#####.#,#######.#######.#.#############.#.###.#.###.#########.#.#.#.### 
.#...#..,,,,,#.#,,,###...#######.#.#...#.........#.....#.......................# 
.#.###.#####,#####,###.#.#########.#.#########.#####.#.#.###.#.#########.#.#.#.# 
.#.....#....,,,,,,,....#.#######.....#...#...#...###.#.......#.###.#.....#.#...# 
.#.#.#####.#.#.###.#################.#.#.###.#######.#####.###.###.#.#####.##### 
.#...#.....#.....#.#...#.......#.#...#.#.....#######...#...#...#.#.#.###...#.### 
.#.###.###.#.###.#.###.#.#######.#.#.###.#.#.#######.###########.#.#######.#.### 
...#...#.#.#.#...#.....#.....#...#.#.....#...#.#####.......#.....#.........#...# 
####.#.#.#.#####.#.#.#.###.#.###.#######.#.#.#.#######.#.#.#.#.#.###.#######.### 
...#.#.#.....#.....#.#.#...#.#...#.....#.#.#...#...#...#.#...#.#...............# 
.###.###.#####.#######.###.#.###.#.###.###.#.#.#.#####.#######.###.#######.#.#.# 
.....#.#.#...#...#...#.#...#...........#.....#.........#.#####.#...#...###...#.# 
##.###.#.#.#.#.#.#.#########.#.###.###.#.###.#######.###.#####.###.#.#.###.##### 
...#.......#...#...#.......#.#.#...#...#...#.#.#...#.#.....#...#...#.#.#...#...# 
####.#.#######.#.#.#.###.###.#.#.#####.#####.#.#.#####.#.#.#.#.#######.#####.### 
.......#...#...#.#.....#.#...#...#...............#.....#.#...#...........#...### 
##.#####.###########.#####.#########.#.###.###.#.#########.###.###.#.#.###.#.### 
.......#...#.#.......#.....#.....#...#.#.....#.#.#...........#...#.....#.#.#...# 
##.#.###.###.#.#.###.#######.#.#.#####.###.#####.###.#.#.#####.###.#.###.###.### 
##.#...#.......#...#.........#.#.......#...###.#.....#...#####...#.............# 
########.###.#.#.#########.#####.#.#####.#####.#.#####.#.#####.#####.#.#.####### 
##.........#.#...#.#...#...#...#.....#.....#...#.....#.#.#####.....#...#.....### 
######.###.#.#.###.#.###.#.#.###.#.#.#.#.#.###.#####.#.#######.#.#.###.######### 
##.......#.#...........#.#.....#.#.#.#.#.#.....###...#.###.......#...#...#######