GoodMaze.cpp
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:5k
源码类别:

游戏

开发平台:

Visual C++

  1. // GoodMaze.cpp : Defines the entry point for the console application.
  2. //
  3. /************************** Generate Maze Algorithm Copyright**************************/
  4. /*You can distributed this algorithm as you like only saving this declaration above*/
  5. /********************Date: 2002.5     Author: 胡小民 丁展**************************/
  6. #include "stdafx.h"
  7. #include <iostream.h>
  8. #include <fstream.h>
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <assert.h>
  12. #include <time.h>
  13. /*Aldus-Broder algorithm: The nice thing about this algorithm is it generates all
  14.  possible Mazes of a given size with equal probability. It also requires no extra
  15.  storage or stack. Pick a point, and move to a neighboring cell at random. If an
  16.  uncarved cell is entered, carve into it from the previous cell. Keep moving to
  17.  neighboring cells until all cells have been carved into. This algorithm yields 
  18.  Mazes with a low "river" factor, only slightly higher than Kruskal's algorithm.
  19.  (This means for a given size there are more Mazes with a low "river" factor than 
  20.  high "river", since an average equal probability Maze has low "river".) The bad 
  21.  thing about this algorithm is that it's very slow, since it doesn't do any 
  22.  intelligent hunting for the last cells, where in fact it's not even guaranteed to
  23.  terminate. However since the algorithm is simple it can move over many cells 
  24.  quickly, so finishes faster than one might think. On average it takes about seven 
  25.  times longer to run than the above algorithms, although in bad cases it can take
  26.  much longer if the random number generator keeps making it avoid the last few cells.
  27. */ 
  28. //////////////////////////////////////////////////////////////////////////
  29. int row=50;
  30. int col=50;
  31. int SIZEX_MAZE=row*2+1;
  32. int SIZEY_MAZE=col*2+1;
  33. const int CONST_MAZEX=101;
  34. const int CONST_MAZEY=101;
  35. #define RIGHT 2
  36. #define LEFT -2
  37. #define DOWN  1
  38. #define UP   -1
  39. int maze[CONST_MAZEX][CONST_MAZEY]={1};
  40. void GenerateMaze();
  41. bool IsNewCell(int x,int y);
  42. bool IsCovered();
  43. bool IsLegalArea(int x,int y);
  44. bool IsNewCell(int x,int y)
  45. {
  46. if(maze[y*2-1][x*2-1]==0)
  47. return false;
  48. else
  49. return true;
  50. }
  51. bool IsCovered()
  52. {
  53. for(int i=1;i<=col;i++)
  54. {
  55. for(int j=1;j<=row;j++)
  56. {
  57. if(IsNewCell(i,j)==true)
  58. return false;
  59. }
  60. }
  61. return true;
  62. }
  63. bool IsLegalArea(int x,int y)
  64. {
  65. if(x>col || x<1 || y>row || y<1)
  66. return false;
  67. return true;
  68. }
  69. void GenerateMaze()
  70. {
  71. //step1:  设置随机种子
  72. srand(time(NULL));
  73. //step2:  初始化
  74. for(int i=0;i<SIZEX_MAZE;i++)
  75. for(int j=0;j<SIZEY_MAZE;j++)
  76. maze[i][j]=1;
  77. int currX,currY;
  78. int temp1;
  79. int dir=0;
  80. //step3:  设置入迷宫口处(1,1) and the exit to be (row,col)
  81. maze[1][1]=0;
  82. currX=currY=1;
  83. for(int k=0;;k++)
  84. {
  85. dir=0;
  86. if(IsCovered()==true)
  87. break;
  88. // if we do not cut some choice in the corner,it will take a lot of time to create
  89. if(currX==1)
  90. {
  91. temp1=rand();
  92. if(currY==1)
  93. {
  94. if(temp1%2==0)
  95. dir=RIGHT;
  96. else
  97. dir=DOWN;
  98. }
  99. else if(currY==row)
  100. {
  101. if(temp1%2==0)
  102. dir=RIGHT;
  103. else
  104. dir=UP;
  105. }
  106. }
  107. if(currX==col)
  108. {
  109. temp1=rand();
  110. if(currY==1)
  111. {
  112. if(temp1%2==0)
  113. dir=LEFT;
  114. else
  115. dir=DOWN;
  116. }
  117. else if(currY==row)
  118. {
  119. if(temp1%2==0)
  120. dir=LEFT;
  121. else
  122. dir=UP;
  123. }
  124. }
  125. temp1=rand()%4;
  126. if(temp1==0 || dir==RIGHT)
  127. {
  128. if(dir==RIGHT)
  129. dir=0;
  130. currX++;
  131. //如果当前位置在边界,则回退到刚才的位置
  132. if(IsLegalArea(currX,currY)==false)
  133. {
  134. currX--;
  135. continue;
  136. }
  137. //对角区域(currY*2-1,currX*2-1)是墙,则打通相应位置
  138. if(IsNewCell(currX,currY)==true)
  139. {
  140. maze[currY*2-1][currX*2-1]=0; //set the newcell
  141. maze[currY*2-1][currX*2-2]=0; //carved into from previous maze
  142. }
  143. continue;
  144. }
  145. else if(temp1==1 || dir==LEFT)
  146. {
  147. if(dir==LEFT)
  148. dir=0;
  149. currX--;
  150. //如果当前位置在边界,则回退到刚才的位置
  151. if(IsLegalArea(currX,currY)==false)
  152. {
  153. currX++;
  154. continue;
  155. }
  156. //对角区域(currY*2-1,currX*2-1)是墙,则打通相应位置
  157. if(IsNewCell(currX,currY)==true)
  158. {
  159. maze[currY*2-1][currX*2-1]=0; //set the newcell
  160. maze[currY*2-1][currX*2]=0; //carved into from previous maze
  161. }
  162. continue;
  163. }
  164. else if(temp1==2 || dir==DOWN)
  165. {
  166. if(dir==DOWN)
  167. dir=0;
  168. currY++;
  169. //如果当前位置在边界,则回退到刚才的位置
  170. if(IsLegalArea(currX,currY)==false)
  171. {
  172. currY--;
  173. continue;
  174. }
  175. //对角区域(currY*2-1,currX*2-1)是墙,则打通相应位置
  176. if(IsNewCell(currX,currY)==true)
  177. {
  178. maze[currY*2-1][currX*2-1]=0; //set the newcell
  179. maze[currY*2-2][currX*2-1]=0; //carved into from previous maze
  180. }
  181. continue;
  182. }
  183. else if(temp1==3 || dir==UP)
  184. {
  185. if(dir==UP)
  186. dir=0;
  187. currY--;
  188. //如果当前位置在边界,则回退到刚才的位置
  189. if(IsLegalArea(currX,currY)==false)
  190. {
  191. currY++;
  192. continue;
  193. }
  194. //对角区域(currY*2-1,currX*2-1)是墙,则打通相应位置
  195. if(IsNewCell(currX,currY)==true)
  196. {
  197. maze[currY*2-1][currX*2-1]=0; //set the newcell
  198. maze[currY*2][currX*2-1]=0; //carved into from previous maze
  199. }
  200. continue;
  201. }
  202. }
  203. }
  204. void ShowMaze()
  205. {
  206. int i,j;
  207. ofstream file("MazeData.txt",ios::out);
  208. assert(!file.fail());
  209. for(i=0;i<CONST_MAZEX;i++)
  210. {
  211. for(j=0;j<CONST_MAZEY;j++)
  212. {
  213. cout<<maze[i][j];
  214. file<<maze[i][j];
  215. }
  216. cout<<endl;
  217. file<<endl;
  218. }
  219. file.close();
  220. }
  221. int main(int argc, char* argv[])
  222. {
  223. GenerateMaze();
  224. ShowMaze();
  225. return 0;
  226. }