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

游戏

开发平台:

Visual C++

  1. #ifndef PATH_H_
  2. #define PATH_H_
  3. #include "stdio.h"
  4. #include "stdlib.h"
  5. #include "iostream.h"
  6. const int MAX_STACK_SIZE=100;
  7. const int SIZEX_MAZE=22;
  8. const int SIZEY_MAZE=22;
  9. int maze[SIZEX_MAZE][SIZEY_MAZE];
  10. bool mark[SIZEX_MAZE][SIZEY_MAZE];
  11. bool mark2[SIZEX_MAZE][SIZEY_MAZE];
  12. const int EXIT_ROW=SIZEX_MAZE-2;
  13. const int EXIT_COL=SIZEY_MAZE-2;
  14. class element;
  15. class Stack;
  16. class offsets;
  17. void GenerateMaze();
  18. void SearchPath();
  19. void InitMark();
  20. void ShowMaze();
  21. class element
  22. {
  23. public:
  24. int row;
  25. int col;
  26. int dir;
  27. };
  28. class Stack
  29. {
  30. private:
  31. int top;
  32. element error;
  33. public:
  34. element stack[MAX_STACK_SIZE];
  35. public:
  36. Stack():top(-1)
  37. {}
  38. void StackEmpty()
  39. {
  40. top=-1;
  41. }
  42. element DeleteStack()
  43. {
  44. if(top==-1)
  45. return error;
  46. else
  47. return stack[top--];
  48. }
  49. bool AddStack(const element & pa)
  50. {
  51. if(top==MAX_STACK_SIZE-1)
  52. return false;
  53. else
  54. {
  55. stack[++top]=pa;
  56. return true;
  57. }
  58. }
  59. bool AddStack(int row,int col,int dir)
  60. {
  61. if(top==MAX_STACK_SIZE-1)
  62. return false;
  63. else
  64. {
  65. top++;
  66. stack[top].row=row;
  67. stack[top].col=col;
  68. stack[top].dir=dir;
  69. return true;
  70. }
  71. }
  72. bool Empty()
  73. {
  74. if(top==-1) 
  75. return true;
  76. else 
  77. return false;
  78. }
  79. int GetLength()
  80. {
  81. return top;
  82. }
  83. ~Stack()
  84. {}
  85. };
  86. class offsets
  87. {
  88. public:
  89. int vert;
  90. int horiz;
  91. public:
  92. void GetValue(int vert=0,int horiz=0)
  93. {
  94. this->vert=vert;
  95. this->horiz=horiz;
  96. }
  97. };
  98. offsets move[8];
  99. void GenerateMaze()
  100. {
  101. int i,j;
  102. int k;
  103. for(i=0;i<SIZEX_MAZE;i++)
  104. for(j=0;j<SIZEY_MAZE;j++)
  105. maze[i][j]=1;
  106. i=1;j=1;
  107. maze[i][j]=0;
  108. while(i!=EXIT_ROW||j!=EXIT_COL)
  109. {
  110. if(i==EXIT_ROW)
  111. {
  112. while(j!=EXIT_COL)
  113. maze[i][++j]=0;
  114. break;
  115. }
  116. if(j==EXIT_COL)
  117. {
  118. while(i!=EXIT_ROW)
  119. maze[++i][j]=0;
  120. break;
  121. }
  122. k=rand()%3;
  123. if(k==0)
  124. {
  125. i++;
  126. maze[i][j]=0;
  127. continue;
  128. }
  129. if(k==1)
  130. {
  131. i++;j++;
  132. maze[i][j]=0;
  133. continue;
  134. }
  135. if(k==2)
  136. {
  137. j++;
  138. maze[i][j]=0;
  139. continue;
  140. }
  141. }
  142. // rand();
  143. k=0;
  144. while(k<SIZEX_MAZE*4/5)
  145. {
  146. i=rand()%(SIZEX_MAZE-10)+4;
  147. j=rand()%(SIZEY_MAZE-10)+4;
  148. maze[i][j]=0;
  149. k++;
  150. }
  151. // secrete  part one
  152. int e1,f1;
  153. i=rand()%6+2;
  154. j=SIZEY_MAZE-2-rand()%7;
  155. e1=SIZEX_MAZE-2-rand()%6;
  156. f1=rand()%6+2;
  157. while(i!=e1||j!=f1)
  158. {
  159. if(i==e1)
  160. {
  161. while(j!=f1)
  162. maze[i][--j]=0;
  163. break;
  164. }
  165. if(j==f1)
  166. {
  167. while(i!=e1)
  168. maze[++i][j]=0;
  169. break;
  170. }
  171. int p=rand()%3;
  172. if(p==0)
  173. {
  174. i++;
  175. maze[i][j]=0;
  176. continue;
  177. }
  178. if(p==1)
  179. {
  180. i++;j--;
  181. maze[i][j]=0;
  182. continue;
  183. }
  184. if(p==2)
  185. {
  186. j--;
  187. maze[i][j]=0;
  188. continue;
  189. }
  190. }
  191. //secret part two 
  192. i=rand()%6+4;
  193. j=SIZEY_MAZE-7-rand()%7;
  194. e1=SIZEX_MAZE-7-rand()%6;
  195. f1=rand()%6+6;
  196. while(i!=e1||j!=f1)
  197. {
  198. if(i==e1)
  199. {
  200. while(j!=f1)
  201. maze[i][--j]=0;
  202. break;
  203. }
  204. if(j==f1)
  205. {
  206. while(i!=e1)
  207. maze[++i][j]=0;
  208. break;
  209. }
  210. int p=rand()%3;
  211. if(p==0)
  212. {
  213. i++;
  214. maze[i][j]=0;
  215. continue;
  216. }
  217. if(p==1)
  218. {
  219. i++;j--;
  220. maze[i][j]=0;
  221. continue;
  222. }
  223. if(p==2)
  224. {
  225. j--;
  226. maze[i][j]=0;
  227. continue;
  228. }
  229. }
  230. }
  231. void ShowMaze()
  232. {
  233. int i=0,j=0;
  234. for(i=1;i<SIZEX_MAZE-1;i++)
  235. {
  236. for(j=1;j<SIZEY_MAZE-1;j++)
  237. cout<<maze[i][j]<<" ";
  238. cout<<endl;
  239. }
  240. }
  241. void InitMark()
  242. {
  243. int i,j;
  244. // setvalue of the move;
  245. move[0].GetValue(-1,0);
  246. move[1].GetValue(-1,1);
  247. move[2].GetValue(0,1);
  248. move[3].GetValue(1,1);
  249. move[4].GetValue(1,0);
  250. move[5].GetValue(1,-1);
  251. move[6].GetValue(0,-1);
  252. move[7].GetValue(-1,-1);
  253. // initialize the mark
  254. for(i=0;i<SIZEX_MAZE;i++)
  255. for(j=0;j<SIZEY_MAZE;j++)
  256. mark[i][j]=0;
  257. for(i=0;i<SIZEX_MAZE;i++)
  258. for(j=0;j<SIZEY_MAZE;j++)
  259. mark2[i][j]=0;
  260. }
  261. long SearchPath(Stack & _stack)
  262. {
  263. int row,col,next_row,next_col,dir;
  264. long count=0;
  265. bool found=false;
  266. element position;
  267. InitMark();
  268. mark[1][1]=true;
  269. _stack.AddStack(1,1,1);
  270. while(!_stack.Empty()&&!found)
  271. {
  272. position=_stack.DeleteStack();
  273. row=position.row;
  274. col=position.col;
  275. dir=position.dir;
  276. while(dir<8&&!found)
  277. {
  278. next_row=row+move[dir].vert;
  279. next_col=col+move[dir].horiz;
  280. if(next_row==EXIT_ROW&&next_col==EXIT_COL)
  281. found=true;
  282. else
  283. if(!maze[next_row][next_col]&&!mark[next_row][next_col])
  284. {
  285. mark[next_row][next_col]=1;
  286. position.row=row;
  287. position.col=col;
  288. position.dir=++dir;
  289. _stack.AddStack(position);
  290. row=next_row;
  291. col=next_col;
  292. dir=0;
  293. count++;
  294. }
  295. else
  296. ++dir;
  297. }
  298. }
  299. if(found)
  300. {
  301. return count;
  302. }
  303. else
  304. return 0;
  305. }
  306. long SearchPath(Stack &_stack,Stack &_stack2)
  307. {
  308. int row,col,next_row,next_col,dir;
  309. int row2,col2,next_row2,next_col2,dir2;
  310. long count=0;
  311. long count2=0;
  312. bool found=false;
  313. element position;
  314. element position2;
  315. InitMark();
  316. mark[1][1]=true;
  317. mark2[1][1]=true;
  318. _stack.AddStack(1,1,1);
  319. _stack2.AddStack(1,1,7);
  320. while(!(_stack.Empty()&&_stack2.Empty())&&!found)
  321. {
  322. count++;
  323. position=_stack.DeleteStack();
  324. row=position.row;
  325. col=position.col;
  326. dir=position.dir;
  327. while(dir<8&&!found)
  328. {
  329. next_row=row+move[dir].vert;
  330. next_col=col+move[dir].horiz;
  331. if(next_row==EXIT_ROW&&next_col==EXIT_COL)
  332. found=true;
  333. else
  334. if(!maze[next_row][next_col]&&!mark[next_row][next_col])
  335. {
  336. mark[next_row][next_col]=1;
  337. position.row=row;
  338. position.col=col;
  339. position.dir=++dir;
  340. _stack.AddStack(position);
  341. row=next_row;
  342. col=next_col;
  343. dir=0;
  344. count++;
  345. }
  346. else
  347. ++dir;
  348. }
  349. count2++;
  350. position2=_stack2.DeleteStack();
  351. row2=position2.row;
  352. col2=position2.col;
  353. dir2=position2.dir;
  354. while(dir2>=0&&!found)
  355. {
  356. next_row2=row2+move[dir2].vert;
  357. next_col2=col2+move[dir2].horiz;
  358. if(next_row2==EXIT_ROW&&next_col2==EXIT_COL)
  359. found=true;
  360. else
  361. if(!maze[next_row2][next_col2]&&!mark2[next_row2][next_col2])
  362. {
  363. mark2[next_row2][next_col2]=1;
  364. position2.row=row2;
  365. position2.col=col2;
  366. position2.dir=--dir2;
  367. _stack2.AddStack(position2);
  368. row2=next_row2;
  369. col2=next_col2;
  370. dir2=7;
  371. count2++;
  372. }
  373. else
  374. --dir2;
  375. }
  376. }
  377. if(found)
  378. {
  379. return count+count2;
  380. }
  381. else
  382. {
  383. return 0;
  384. }
  385. }
  386. void InitAll()
  387. {
  388. GenerateMaze();
  389. InitMark();
  390. }
  391. #endif