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

游戏

开发平台:

Visual C++

  1. ////////////////////////////////////
  2. // this one is only for perfect maze
  3. // and it is very important that we should ensure that every available way's authority should be a 
  4. //positive
  5. // Copyright: 胡小民,丁展 2002.5
  6. #include <iostream.h>
  7. #include <stdlib.h>
  8. #include "maze.h"
  9. const int fromLeft=0;
  10. const int fromUp=1; 
  11. const int fromRight=2;
  12. const int fromDown=3;
  13. #define END 0
  14. int refreshSig(int sig[CONST_MAZEX][CONST_MAZEY]);
  15. int refreshSig(int sig[CONST_MAZEX][CONST_MAZEY],int x,int y,int dir)
  16. {
  17. //确保权值在表示墙时不会相加
  18. if(y>=CONST_MAZEY||x>=CONST_MAZEX||x<0||y<0)
  19. return 0; // dingzhan added
  20. if(sig[y][x]<UNACCESSABLE)
  21. sig[y][x]=UNACCESSABLE;
  22. int temp1,temp2,temp3;
  23. // 不使用sig[y][x]==UNACCESSABLE是为了确保有些情况那儿的确是墙了,却有sig[y][x]约等于UNACCESSABLE
  24. if(sig[y][x]==END || sig[y][x]<UNACCESSABLE/2)
  25. return 0;
  26. if(x==1)
  27. {
  28. if(y==1)
  29. {
  30. if(dir==fromRight)
  31. {
  32. temp1=refreshSig(sig,x,y+1,fromUp);
  33. if(temp1!=END && temp1>UNACCESSABLE/2)
  34. sig[y][x]=temp1;
  35. else return sig[y][x];
  36. return temp1;
  37. }
  38.   else if(dir==fromDown)
  39. {
  40. temp1=refreshSig(sig,x+1,y,fromLeft);
  41. if(temp1!=END && temp1>UNACCESSABLE/2)
  42. sig[y][x]=temp1;
  43. else return sig[y][x];
  44. return temp1;
  45. }
  46. else if(dir==fromLeft)  // from the entrance
  47. {
  48. temp1=refreshSig(sig,x+1,y,fromLeft);
  49. temp2=refreshSig(sig,x,y+1,fromUp);
  50. if((temp1+temp2)>UNACCESSABLE/2 && (temp1+temp2)!=END)
  51. sig[y][x]=temp1+temp2;
  52. else return sig[y][x];
  53. return temp1+temp2;
  54. }
  55. }
  56. else if(y==SIZEX_MAZE)
  57. {
  58. if(dir==fromRight)
  59. {
  60. temp1=refreshSig(sig,x,y-1,fromDown);
  61. if(temp1!=END && temp1>UNACCESSABLE/2)
  62. sig[y][x]=temp1;
  63. else return sig[y][x];
  64. return temp1;
  65. }
  66. else if(dir==fromUp)
  67. {
  68. temp1=refreshSig(sig,x+1,y,fromLeft);
  69. if(temp1!=END && temp1>UNACCESSABLE/2)
  70. sig[y][x]=temp1;
  71. else return sig[y][x];
  72. return temp1;
  73. }
  74. }
  75. else 
  76. {
  77. if(dir==fromRight)
  78. {
  79. temp1=refreshSig(sig,x,y-1,fromDown);
  80. temp2=refreshSig(sig,x,y+1,fromUp);
  81. if((temp1+temp2)>UNACCESSABLE/2 && (temp1+temp2)!=END)
  82. sig[y][x]=temp1+temp2;
  83. else return sig[y][x];
  84. return temp1+temp2;
  85. }
  86. else if(dir==fromDown)
  87. {
  88. temp1=refreshSig(sig,x+1,y,fromLeft);
  89. temp2=refreshSig(sig,x,y-1,fromDown);
  90. if((temp1+temp2)>UNACCESSABLE/2 && (temp1+temp2)!=END)
  91. sig[y][x]=temp1+temp2;
  92. else return sig[y][x];
  93. return temp1+temp2;
  94. }
  95. else if(dir==fromUp)
  96. {
  97. temp1=refreshSig(sig,x+1,y,fromLeft);
  98. temp2=refreshSig(sig,x,y+1,fromUp);
  99. if((temp1+temp2)>UNACCESSABLE/2 && (temp1+temp2)!=END)
  100. sig[y][x]=temp1+temp2;
  101. else return sig[y][x];
  102. return temp1+temp2;
  103. }
  104. }
  105. }
  106. else if(x==SIZEY_MAZE)
  107. {
  108. if(y==1)
  109. {
  110. if(dir==fromLeft)
  111. {
  112. temp1=refreshSig(sig,x,y+1,fromUp);
  113. if(temp1!=END && temp1>UNACCESSABLE/2)
  114. sig[y][x]=temp1;
  115. else return sig[y][x];
  116. return temp1;
  117. }
  118. else if(dir==fromDown)
  119. {
  120. temp1=refreshSig(sig,x-1,y,fromRight);
  121. if(temp1!=END && temp1>UNACCESSABLE/2)
  122. sig[y][x]=temp1;
  123. else return sig[y][x];
  124. return temp1;
  125. }
  126. }
  127. else if(y==SIZEX_MAZE)
  128. {
  129. if(dir==fromLeft)
  130. {
  131. temp1=refreshSig(sig,x,y-1,fromDown);
  132. if(temp1!=END && temp1>UNACCESSABLE/2)
  133. sig[y][x]=temp1;
  134. else return sig[y][x];
  135. return temp1;
  136. }
  137. else if(dir==fromUp)
  138. {
  139. temp1=refreshSig(sig,x-1,y,fromRight);
  140. if(temp1!=END && temp1>UNACCESSABLE/2)
  141. sig[y][x]=temp1;
  142. else return sig[y][x];
  143. return temp1;
  144. }
  145. }
  146. else 
  147. {
  148. if(dir==fromLeft)
  149. {
  150. temp1=refreshSig(sig,x,y-1,fromDown);
  151. temp2=refreshSig(sig,x,y+1,fromUp);
  152. }
  153. else if(dir==fromDown)
  154. {
  155. temp1=refreshSig(sig,x-1,y,fromRight);
  156. temp2=refreshSig(sig,x,y-1,fromDown);
  157. }
  158. else if(dir==fromUp)
  159. {
  160. temp1=refreshSig(sig,x-1,y,fromRight);
  161. temp2=refreshSig(sig,x,y+1,fromUp);
  162. }
  163. else
  164. {
  165. cout<<"error in refreshSig"<<endl;
  166. exit(0);
  167. }
  168. if((temp1+temp2)>UNACCESSABLE/2 && (temp1+temp2)!=END)
  169. sig[y][x]=temp1+temp2;
  170. else return sig[y][x];
  171. return temp1+temp2;
  172. }
  173. }
  174. if(y==1)
  175. {
  176. if(dir==fromDown)
  177. {
  178. temp1=refreshSig(sig,x-1,y,fromRight);
  179. temp2=refreshSig(sig,x+1,y,fromLeft);
  180. }
  181. else if(dir==fromLeft)
  182. {
  183. temp1=refreshSig(sig,x+1,y,fromLeft);
  184. temp2=refreshSig(sig,x,y+1,fromUp);
  185. }
  186. else if(dir==fromRight)
  187. {
  188. temp1=refreshSig(sig,x-1,y,fromRight);
  189. temp2=refreshSig(sig,x,y+1,fromUp);
  190. }
  191. else
  192. {
  193. cout<<"error in refreshSig"<<endl;
  194. exit(0);
  195. }
  196. if((temp1+temp2)>UNACCESSABLE/2 && (temp1+temp2)!=END)
  197. sig[y][x]=temp1+temp2;
  198. else 
  199. return sig[y][x];
  200. return temp1+temp2;
  201. }
  202. else if(y==SIZEX_MAZE)
  203. {
  204. if(dir==fromUp)
  205. {
  206. temp1=refreshSig(sig,x-1,y,fromRight);
  207. temp2=refreshSig(sig,x+1,y,fromLeft);
  208. }
  209. else if(dir==fromLeft)
  210. {
  211. temp1=refreshSig(sig,x+1,y,fromLeft);
  212. temp2=refreshSig(sig,x,y-1,fromDown);
  213. }
  214. else if(dir==fromRight)
  215. {
  216. temp1=refreshSig(sig,x-1,y,fromRight);
  217. temp2=refreshSig(sig,x,y-1,fromDown);
  218. }
  219. else
  220. {
  221. cout<<"error in refreshSig"<<endl;
  222. exit(0);
  223. }
  224. if((temp1+temp2)>UNACCESSABLE/2 && (temp1+temp2)!=END)
  225. sig[y][x]=temp1+temp2;
  226. else return sig[y][x];
  227. return temp1+temp2;
  228. }
  229. if(dir==fromUp)
  230. {
  231. temp1=refreshSig(sig,x-1,y,fromRight);
  232. temp2=refreshSig(sig,x+1,y,fromLeft);
  233. temp3=refreshSig(sig,x,y+1,fromUp);
  234. }
  235. else if(dir==fromDown)
  236. {
  237. temp1=refreshSig(sig,x-1,y,fromRight);
  238. temp2=refreshSig(sig,x+1,y,fromLeft);
  239. temp3=refreshSig(sig,x,y-1,fromDown);
  240. }
  241. else if(dir==fromRight)
  242. {
  243. temp1=refreshSig(sig,x-1,y,fromRight);
  244. temp2=refreshSig(sig,x,y-1,fromDown);
  245. temp3=refreshSig(sig,x,y+1,fromUp);
  246. }
  247. else
  248. {
  249. temp1=refreshSig(sig,x+1,y,fromLeft);
  250. temp2=refreshSig(sig,x,y-1,fromDown);
  251. temp3=refreshSig(sig,x,y+1,fromUp);
  252. }
  253. if((temp1+temp2+temp3)>UNACCESSABLE/2 && (temp1+temp2+temp3)!=END)
  254. sig[y][x]=temp1+temp2+temp3;
  255. else return sig[y][x];
  256. return temp1+temp2+temp3;
  257. }