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

游戏

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////
  2. /*Aldus-Broder algorithm: The nice thing about this algorithm is it generates all
  3.  possible Mazes of a given size with equal probability. It also requires no extra
  4.  storage or stack. Pick a point, and move to a neighboring cell at random. If an
  5.  uncarved cell is entered, carve into it from the previous cell. Keep moving to
  6.  neighboring cells until all cells have been carved into. This algorithm yields 
  7.  Mazes with a low "river" factor, only slightly higher than Kruskal's algorithm.
  8.  (This means for a given size there are more Mazes with a low "river" factor than 
  9.  high "river", since an average equal probability Maze has low "river".) The bad 
  10.  thing about this algorithm is that it's very slow, since it doesn't do any 
  11.  intelligent hunting for the last cells, where in fact it's not even guaranteed to
  12.  terminate. However since the algorithm is simple it can move over many cells 
  13.  quickly, so finishes faster than one might think. On average it takes about seven 
  14.  times longer to run than the above algorithms, although in bad cases it can take
  15.  much longer if the random number generator keeps making it avoid the last few cells.
  16. */ 
  17. //////////////////////////////////////////////////////////////////////////
  18. // Copyright: 胡小民,丁展 2002.5
  19. #ifndef _MAZE_MAKE_H
  20. #define _MAZE_MAKE_H
  21. #include <iostream.h>
  22. #include <stdlib.h>
  23. #include "maze.h"
  24. #include "head.h"
  25. void pMazeMaker(int wall[CONST_MAZEX][CONST_MAZEY]);
  26. bool newCell(int wall[CONST_MAZEX][CONST_MAZEY],int x,int y);
  27. bool covered(int wall[CONST_MAZEX][CONST_MAZEY]);
  28. bool legalArea(int x,int y); 
  29. int rand(int type)
  30. {
  31. return rand()+rand()+rand();
  32. }
  33. bool newCell(int wall[CONST_MAZEX][CONST_MAZEY],int x,int y)
  34. {
  35. if(wall[y*2-1][x*2-1]==0)
  36. return false;
  37. else 
  38. return true;
  39. }
  40. bool covered(int wall[CONST_MAZEX][CONST_MAZEY])
  41. {
  42. for(int i=1;i<=col;i++)
  43. {
  44. for(int j=1;j<=row;j++)
  45. {
  46. if(newCell(wall,i,j)==true)
  47. return false;
  48. }
  49. }
  50. return true;
  51. }
  52. bool legalArea(int x,int y)
  53. {
  54. if(x>col || x<1)
  55. return false;
  56. if(y>row || y<1)
  57. return false;
  58. return true;
  59. }
  60. void pMazeMaker(int wall[CONST_MAZEX][CONST_MAZEY])
  61. {
  62. int currX,currY;
  63. int temp1;
  64. int dir=0;
  65. // wall[][] should be initialized to 1
  66. // set the entrance to be (0,0) and the exit to be (row,col)
  67. wall[1][0]=0;
  68. wall[row*2-1][col*2]=0;
  69. // begin from (1,1)
  70. wall[1][1]=0;
  71. currX=currY=1;
  72. for(int k=0;;k++)
  73. {
  74. dir=0;
  75. if(covered(wall)==true)
  76. break;
  77. // if we do not cut some choice in the corner,it will take a lot of time to creat
  78. if(currX==1)
  79. {
  80. temp1=rand(1);
  81. if(currY==1)
  82. {
  83. if(temp1%2==0)
  84. dir=RIGHT;
  85. else
  86. dir=DOWN;
  87. }
  88. else if(currY==row)
  89. {
  90. if(temp1%2==0)
  91. dir=RIGHT;
  92. else
  93. dir=UP;
  94. }
  95. }
  96. if(currX==col)
  97. {
  98. temp1=rand(1);
  99. if(currY==1)
  100. {
  101. if(temp1%2==0)
  102. dir=LEFT;
  103. else
  104. dir=DOWN;
  105. }
  106. else if(currY==row)
  107. {
  108. if(temp1%2==0)
  109. dir=LEFT;
  110. else
  111. dir=UP;
  112. }
  113. }
  114. temp1=rand(1)%4;
  115. if(temp1==0 || dir==RIGHT)
  116. {
  117. if(dir==RIGHT)
  118. dir=0;
  119. currX++;
  120. if(legalArea(currX,currY)==false)
  121. {
  122. currX--;
  123. continue;
  124. }
  125. if(newCell(wall,currX,currY)==true)
  126. {
  127. wall[currY*2-1][currX*2-1]=0; //set the newcell
  128. wall[currY*2-1][currX*2-2]=0; //carved into from previous wall
  129. }
  130. continue;
  131. }
  132. else if(temp1==1 || dir==LEFT)
  133. {
  134. if(dir==LEFT)
  135. dir=0;
  136. currX--;
  137. if(legalArea(currX,currY)==false)
  138. {
  139. currX++;
  140. continue;
  141. }
  142. if(newCell(wall,currX,currY)==true)
  143. {
  144. wall[currY*2-1][currX*2-1]=0; //set the newcell
  145. wall[currY*2-1][currX*2]=0; //carved into from previous wall
  146. }
  147. continue;
  148. }
  149. else if(temp1==2 || dir==DOWN)
  150. {
  151. if(dir==DOWN)
  152. dir=0;
  153. currY++;
  154. if(legalArea(currX,currY)==false)
  155. {
  156. currY--;
  157. continue;
  158. }
  159. if(newCell(wall,currX,currY)==true)
  160. {
  161. wall[currY*2-1][currX*2-1]=0; //set the newcell
  162. wall[currY*2-2][currX*2-1]=0; //carved into from previous wall
  163. }
  164. continue;
  165. }
  166. else if(temp1==3 || dir==UP)
  167. {
  168. if(dir==UP)
  169. dir=0;
  170. currY--;
  171. if(legalArea(currX,currY)==false)
  172. {
  173. currY++;
  174. continue;
  175. }
  176. if(newCell(wall,currX,currY)==true)
  177. {
  178. wall[currY*2-1][currX*2-1]=0; //set the newcell
  179. wall[currY*2][currX*2-1]=0; //carved into from previous wall
  180. }
  181. continue;
  182. }
  183. }
  184. wall[1][0]=1;
  185. wall[row*2-1][col*2]=1;
  186. }
  187. #endif