ProcMtd.cpp
上传用户:tjwfgggs
上传日期:2022-06-07
资源大小:4331k
文件大小:5k
源码类别:

其他游戏

开发平台:

Visual C++

  1. // ProcMtd.cpp: implementation of the ProcMtd class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Eight.h"
  6. #include "ProcMtd.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. ProcMtd::ProcMtd(NineBox* box)
  16. {
  17. this->question_solved=false;
  18. this->box=box;
  19. OK1=OK2=OK3=OK4=OK5=OK6=OK7=false;step=step2=0;
  20. Skep_3=Skep_5=false;
  21. }
  22. ProcMtd::~ProcMtd()
  23. {
  24. }
  25. int ProcMtd::solve()
  26. {
  27. if(!box) return 0;
  28. int ir=0;
  29. if(!ProcMtd::OK1)
  30. ir=Set_1();
  31. if(ir==0 && !OK2)
  32. ir=Set_2();
  33. if(!Skep_3)
  34. {
  35. if(ir==0 && !OK3)
  36. ir=Set_3();
  37. if(ir==0 && !OK4)
  38. ir=Set_4();
  39. }
  40. if(ir==0 && !OK5)//set '4'
  41. ir=Set_5();
  42. if(!Skep_5)
  43. {
  44. if(ir==0 && !OK6)
  45. ir=Set_6();
  46. if(ir==0 && !OK7)
  47. ir=Set_7();
  48. }
  49. if(ir==0)
  50. ir=Set_8();
  51. return ir;
  52. }
  53. int ProcMtd::Set_8()
  54. {
  55. static int pos[4][2]={1,0, 2,0, 2,1, 1,1};
  56. static int moving[4]={2,  4,   1,   3};
  57. int ir=0;
  58. int x,y,m,n,j,k;
  59. int i;
  60. box->GetXYByValue(6,x,y);
  61. box->GetXYByValue(7,m,n);
  62. box->GetXYByValue(8,j,k);
  63. if(x==2 && y==1 && m==2 && n==0 &&j==1 && k==0)
  64. {
  65. return 0;
  66. }
  67. else
  68. box->GetXYByValue(0,x,y);
  69. for(i=0;i<4;i++)
  70. {
  71. if(pos[i][0]==x && pos[i][1]==y) 
  72. break;
  73. }
  74. return moving[i];
  75. }
  76. int ProcMtd::Set_7()
  77. {
  78. static int pos[12][2]={1,0, 0,0, 0,1, 0,2, 1,2, 1,1, 2,1, 2,2, 1,2, 0,2, 0,1, 0,0};
  79. static int moving[12]={1,4,4,2,3,2,4,1,1,3,3,2};
  80. if((ProcMtd::step2)==12 || OK7)
  81. {
  82. ProcMtd::OK7=true;
  83. return 0;
  84. }
  85. step2++;
  86. return moving[ProcMtd::step2-1];
  87. }
  88. int ProcMtd::Set_6()
  89. {
  90. static int pos[4][2]={1,0, 2,0, 2,1, 1,1};
  91. static int moving[4]={2,  4,   1,   3};
  92. if(OK6) 
  93. return 0;
  94. int ir=0;
  95. int x,y;x=y=0;
  96. int i;
  97. box->GetXYByValue(5,x,y);
  98. if(x==1 && y==1) 
  99. {
  100. OK6=true;
  101. return 0;
  102. }
  103. else
  104. box->GetXYByValue(0,x,y);
  105. for(i=0;i<4;i++)
  106. {
  107. if(pos[i][0]==x && pos[i][1]==y) 
  108. break;
  109. }
  110. return moving[i];
  111. }
  112. int ProcMtd::Set_5()
  113. {
  114. static int pos[6][2]={1,0, 2,0, 2,1, 2,2, 1,2, 1,1};
  115. static int moving[6]={2,  4,   4,   1,   3,   3};
  116. if(OK5) 
  117. return 0;
  118. int ir=0;
  119. int x,y;x=y=0;
  120. int i;
  121. box->GetXYByValue(4,x,y);
  122. if(x==1 && y==2) 
  123. {
  124. OK5=true;
  125. //if skep '5'?
  126. box->GetXYByValue(5,x,y);
  127. if(x==2 && y==2) Skep_5=true;
  128. return 0;
  129. }
  130. else
  131. box->GetXYByValue(0,x,y);
  132. for(i=0;i<6;i++)
  133. {
  134. if(pos[i][0]==x && pos[i][1]==y) 
  135. break;
  136. }
  137. return moving[i];
  138. }
  139. int ProcMtd::Set_4()
  140. {
  141. static int pos[8][2]={1,0, 0,0, 0,1, 1,1, 1,2, 0,2, 0,1, 0,0};
  142. static int moving[8]={1,   4,   2,   4,   1,   3,   3,   2};
  143. if((ProcMtd::step)==8 || OK4)
  144. {
  145. OK4=true;
  146. return 0;
  147. }
  148. step++;
  149. return moving[ProcMtd::step-1];
  150. }
  151. int ProcMtd::Set_3()
  152. {
  153. static int pos[6][2]={1,0, 2,0, 2,1, 2,2, 1,2, 1,1};
  154. static int moving[6]={2,  4,   4,   1,   3,   3};
  155. if(OK3) 
  156. return 0;
  157. int ir=0;
  158. int x,y;x=y=0;
  159. int i;
  160. box->GetXYByValue(3,x,y);
  161. if(x==1 && y==1) 
  162. {
  163. OK3=true;
  164. return 0;
  165. }
  166. else
  167. box->GetXYByValue(0,x,y);
  168. for(i=0;i<6;i++)
  169. {
  170. if(pos[i][0]==x && pos[i][1]==y) 
  171. break;
  172. }
  173. return moving[i];
  174. }
  175. int ProcMtd::Set_2()
  176. {
  177. static int pos[8][2]={0,1, 1,1, 1,0, 2,0, 2,1, 2,2, 1,2, 0,2};
  178. static int moving[8]={2,   3,   2,   4,   4,   1,   1,   3};
  179. if(OK2) return 0;
  180. int ir=0;
  181. int x,y;x=y=0;
  182. int i;
  183. box->GetXYByValue(2,x,y);
  184. if(x==0 && y==1) 
  185. {
  186. OK2=true;
  187. //if skep '3'?
  188. box->GetXYByValue(3,x,y);
  189. if(x==0 && y==2) Skep_3=true;
  190. return 0;
  191. }
  192. else
  193. box->GetXYByValue(0,x,y);
  194. for(i=0;i<8;i++)
  195. {
  196. if(pos[i][0]==x && pos[i][1]==y) 
  197. break;
  198. }
  199. return moving[i];
  200. }
  201. int ProcMtd::Set_1()
  202. {
  203. static int pos[8][2]={0,0,1,0,2,0,2,1,2,2,1,2,1,1,0,1};
  204. static int moving[8]={2,2,4,4,1,3,1,3};
  205. if(OK1) return 0;
  206. int ir=0;
  207. int x,y;x=y=0;
  208. int i;
  209. box->GetXYByValue(1,x,y);
  210. if(x==0 && y==0) 
  211. {
  212. OK1=true;
  213. return 0;
  214. }
  215. else
  216. box->GetXYByValue(0,x,y);
  217. for(i=0;i<8;i++)
  218. {
  219. if(pos[i][0]==x && pos[i][1]==y) break;
  220. }
  221. return moving[i];
  222. }
  223. int ProcMtd::Init()
  224. {
  225. if(!box) return 0;
  226. bool _m,_n;
  227. _m=_n=false;
  228. int x,y;
  229. x=y=0;
  230. box->GetXYByValue(0,x,y);
  231. if(x==0 && y==2) _m=true;
  232. box->GetXYByValue(1,x,y);
  233. if(x==0 && y==2) _n=true;
  234. if(_m)//空格在位置C上
  235. {
  236. return 3;// <-:空格左移
  237. }
  238. if(_n)//“1”在C(0,2)上,让空格到F(1,2),空格上移
  239. {
  240. int p_x,p_y;//空格位置
  241. box->GetXYByValue(0,p_x,p_y);
  242. //p_x---->1
  243. if(p_x==0) return 2;//下
  244. if(p_x==2) return 1;//上
  245. //p_y---->2
  246. if(p_y<2) return 4;//右
  247. return 1;
  248. }
  249. return 0;
  250. }