TakeGame.cpp
上传用户:bsw_2008
上传日期:2013-07-09
资源大小:2446k
文件大小:12k
源码类别:

棋牌游戏

开发平台:

Visual C++

  1. // TakeGame.cpp: implementation of the TakeGame class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "CGameHallFrame.h"
  6. #include "TakeGame.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. int RAILWAY[17][17]={
  16. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  17. {0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0},
  18. {0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0},
  19. {0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0},
  20. {0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0},
  21. {0,0,0,0,0,1,1,3,1,3,1,1,0,0,0,0,0},
  22. {0,1,1,1,1,1,1,3,1,3,1,1,1,1,1,1,0},
  23. {0,1,0,0,0,2,2,0,2,0,2,2,0,0,0,1,0},
  24. {0,1,0,0,0,1,1,3,1,3,1,1,0,0,0,1,0},
  25. {0,1,0,0,0,2,2,0,2,0,2,2,0,0,0,1,0},
  26. {0,1,1,1,1,1,1,3,1,3,1,1,1,1,1,1,0},
  27. {0,0,0,0,0,1,1,3,1,3,1,1,0,0,0,0,0},
  28. {0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0},
  29. {0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0},
  30. {0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0},
  31. {0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0},
  32. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  33. };
  34. int d[4][2]={
  35. {0,1},
  36. {1,0},
  37. {0,-1},
  38. {-1,0},
  39. };
  40. TakeGame::TakeGame()
  41. {
  42. war_kind=FALSE;
  43. }
  44. TakeGame::~TakeGame()
  45. {
  46. }
  47. BOOL TakeGame::CanMove(CPoint from, CPoint to)
  48. {
  49. int i,a;
  50. engineer=FALSE;
  51. if(board[from.x][from.y]>0&&board[from.x][from.y]<12)
  52. {
  53. if(board[from.x][from.y]==11)
  54. return FALSE;
  55. if(from.x==to.x&&from.y==to.y)
  56. return FALSE;
  57. if(IsSameSide(to))
  58. return FALSE;
  59. if(RAILWAY[from.x][from.y]==1&&RAILWAY[to.x][to.y]==1)
  60. {
  61. if(from.x==to.x)
  62. {
  63. a=(from.y<to.y)?1:-1;top=0;
  64. for(i=from.y+a;i!=to.y;i=i+a)
  65. {
  66. stack[top].x=from.x;
  67. if(a==1)
  68. stack[top].d=0;
  69. else
  70. stack[top].d=2;
  71. stack[top++].y=i;
  72. }
  73. return IsRouteCan();
  74. }else if(from.y==to.y)
  75. {
  76. a=(from.x<to.x)?1:-1;top=0;
  77. for(i=from.x+a;i!=to.x;i=i+a)
  78. {
  79. stack[top].y=from.y;
  80. if(a==1)
  81. stack[top].d=1;
  82. else
  83. stack[top].d=3;
  84. stack[top++].x=i;
  85. }
  86. return IsRouteCan();
  87. }else
  88. {
  89. if(from.x==10&&from.y<6&&to.x>10&&to.y==6)
  90. {
  91. top=0;
  92. for(i=from.y+1;i<6;i++)
  93. {
  94. stack[top].x=from.x;
  95. stack[top].d=0;
  96. stack[top++].y=i;
  97. }
  98. stack[top].x=11;stack[top].d=0;stack[top++].y=5;
  99. for(i=11;i<to.x;i++)
  100. {
  101. stack[top].x=i;
  102. stack[top].y=6;
  103. stack[top++].d=1;
  104. }
  105. return IsRouteCan();
  106. }
  107. if(to.x==10&&to.y<6&&from.x>10&&from.y==6)
  108. {
  109. top=0;
  110. for(i=from.x-1;i>10;i--)
  111. {
  112. stack[top].x=i;
  113. stack[top].d=3;
  114. stack[top++].y=6;
  115. }
  116. stack[top].x=11;stack[top].d=2;stack[top++].y=5;
  117. for(i=5;i>to.y;i--)
  118. {
  119. stack[top].x=10;
  120. stack[top].y=i;
  121. stack[top++].d=2;
  122. }
  123. return IsRouteCan();
  124. }
  125. if(to.x==10&&to.y>10&&from.x>10&&from.y==10)
  126. {
  127. top=0;
  128. for(i=from.x-1;i>10;i--)
  129. {
  130. stack[top].x=i;
  131. stack[top].y=10;
  132. stack[top++].d=3;
  133. }
  134. stack[top].x=11;stack[top].d=0;stack[top++].y=11;
  135. for(i=11;i<to.y;i++)
  136. {
  137. stack[top].x=10;
  138. stack[top].y=i;
  139. stack[top].d=0;
  140. }
  141. return IsRouteCan();
  142. }
  143. if(to.x>10&&to.y==10&&from.x==10&&from.y>10)
  144. {
  145. top=0;
  146. for(i=from.y-1;i>10;i--)
  147. {
  148. stack[top].x=10;
  149. stack[top].y=i;
  150. stack[top++].d=2;
  151. }
  152. stack[top].x=11;stack[top].d=2;stack[top++].y=11;
  153. for(i=11;i<to.x;i++)
  154. {
  155. stack[top].x=i;
  156. stack[top].y=10;
  157. stack[top++].d=1;
  158. }
  159. return IsRouteCan();
  160. }
  161. if(to.x==6&&to.y<6&&from.x<6&&from.y==6)
  162. {
  163. top=0;
  164. for(i=from.x+1;i<6;i++)
  165. {
  166. stack[top].x=i;
  167. stack[top].y=6;
  168. stack[top++].d=1;
  169. }
  170. stack[top].x=5;stack[top].y=5;stack[top++].d=1;
  171. for(i=5;i>to.y;i--)
  172. {
  173. stack[top].x=6;
  174. stack[top].d=2;
  175. stack[top].y=i;
  176. }
  177. return IsRouteCan();
  178. }
  179. if(to.x<6&&to.y==6&&from.x==6&&from.y<6)
  180. {
  181. top=0;
  182. for(i=from.y+1;i<6;i++)
  183. {
  184. stack[top].x=6;
  185. stack[top].y=i;
  186. stack[top++].d=0;
  187. }
  188. stack[top].x=5;stack[top].y=5;stack[top++].d=0;
  189. for(i=5;i>to.x;i--)
  190. {
  191. stack[top].x=i;
  192. stack[top].y=6;
  193. stack[top++].d=3;
  194. }
  195. return IsRouteCan();
  196. }
  197. if(to.x<6&&to.y==10&&from.x==6&&from.y>10)
  198. {
  199. top=0;
  200. for(i=from.y-1;i>10;i--)
  201. {
  202. stack[top].x=6;
  203. stack[top].y=i;
  204. stack[top++].d=2;
  205. }
  206. stack[top].x=5;stack[top].y=11;stack[top++].d=3;
  207. for(i=5;i>to.x;i--)
  208. {
  209. stack[top].x=i;
  210. stack[top].y=10;
  211. stack[top++].d=3;
  212. }
  213. return IsRouteCan();
  214. }
  215. if(to.x==6&&to.y>10&&from.x<6&&from.y==10)
  216. {
  217. top=0;
  218. for(i=from.x+1;i<6;i++)
  219. {
  220. stack[top].x=i;
  221. stack[top].y=10;
  222. stack[top++].d=1;
  223. }
  224. stack[top].x=5;stack[top].y=11;stack[top++].d=1;
  225. for(i=11;i<to.y;i++)
  226. {
  227. stack[top].x=6;
  228. stack[top].y=i;
  229. stack[top++].d=0;
  230. }
  231. return IsRouteCan();
  232. }
  233. }
  234. }
  235. if(IsCamp(to))
  236. {
  237. if((abs(from.x-to.x)==1||abs(from.y-to.y)==1)&&board[to.x][to.y]==0)
  238. return TRUE;
  239. else return FALSE;
  240. }else if(IsCamp(from))
  241. {
  242. if(abs(from.x-to.x)==1||abs(from.y-to.y)==1)
  243. return TRUE;
  244. else return FALSE;
  245. }else
  246. {
  247. if((abs(from.x-to.x)==1)&&(from.y==to.y)||(abs(from.y-to.y)==1)&&(from.x==to.x))
  248. return TRUE;
  249. if(board[from.x][from.y]==1)
  250. {
  251. //AfxMessageBox("zhou");
  252. return TakeEngineer(from,to);
  253. }
  254. }
  255. }
  256. AfxMessageBox("zhou");
  257. return FALSE;
  258. }
  259. BOOL TakeGame::IsSameSide(CPoint to)
  260. {
  261. if(board[to.x][to.y]==13&&!war_kind)
  262. return TRUE;
  263. if(board[to.x][to.y]>0&&board[to.x][to.y]<13)
  264. return TRUE;
  265. return FALSE;
  266. }
  267. BOOL TakeGame::TakeEngineer(CPoint from, CPoint to)
  268. {
  269. POS p;int x,y;engineer=TRUE;
  270. p.d=0;p.x=from.x;p.y=from.y;top=0;
  271. if(RAILWAY[p.x][p.y]==2)
  272. p.d=1;
  273. stack[top]=p;int f[17][17];
  274. while(top>=0)
  275. {
  276. p=stack[top];
  277. if(p.x==to.x&&p.y==to.y)
  278. return TRUE;
  279. if(p.d<4)
  280. {
  281. x=p.x+d[p.d][0];y=p.y+d[p.d][1];
  282. if(x==to.x&&p.y==to.y)
  283. return TRUE;
  284. if(board[x][y]==0&&RAILWAY[x][y]!=0&&f[x][y]!=1)
  285. {
  286. if(RAILWAY[p.x][p.y]==2||RAILWAY[p.x][p.y]==3)
  287. stack[top].d+=2;
  288. else
  289. stack[top].d+=1;
  290. if(RAILWAY[x][y]==2)
  291. {
  292. f[stack[top].x][stack[top].y]=1;
  293. p.x=x;p.y=y;p.d=1;
  294. stack[++top]=p;
  295. }else
  296. {
  297. f[stack[top].x][stack[top].y]=1;
  298. p.x=x;p.y=y;p.d=0;
  299. stack[++top]=p;
  300. }
  301. }
  302. else
  303. {
  304. if(RAILWAY[p.x][p.y]==2||RAILWAY[p.x][p.y]==3)
  305. stack[top].d+=2;
  306. else
  307. stack[top].d+=1;
  308. }
  309. }else
  310. top--;
  311. }
  312. return FALSE;
  313. }
  314. BOOL TakeGame::IsCamp(CPoint pos)
  315. {
  316. if(pos.x==2&&pos.y==7)
  317. return TRUE;
  318. if(pos.x==2&&pos.y==9)
  319. return TRUE;
  320. if(pos.x==3&&pos.y==8)
  321. return TRUE;
  322. if(pos.x==4&&pos.y==7)
  323. return TRUE;
  324. if(pos.x==4&&pos.y==9)
  325. return TRUE;
  326. if(pos.x==12&&pos.y==7)
  327. return TRUE;
  328. if(pos.x==12&&pos.y==9)
  329. return TRUE;
  330. if(pos.x==13&&pos.y==8)
  331. return TRUE;
  332. if(pos.x==14&&pos.y==7)
  333. return TRUE;
  334. if(pos.x==14&&pos.y==9)
  335. return TRUE;
  336. if(pos.x==7&&pos.y==2)
  337. return TRUE;
  338. if(pos.x==9&&pos.y==2)
  339. return TRUE;
  340. if(pos.x==8&&pos.y==3)
  341. return TRUE;
  342. if(pos.x==7&&pos.y==4)
  343. return TRUE;
  344. if(pos.x==9&&pos.y==4)
  345. return TRUE;
  346. if(pos.x==7&&pos.y==12)
  347. return TRUE;
  348. if(pos.x==7&&pos.y==14)
  349. return TRUE;
  350. if(pos.x==8&&pos.y==13)
  351. return TRUE;
  352. if(pos.x==9&&pos.y==12)
  353. return TRUE;
  354. if(pos.x==9&&pos.y==14)
  355. return TRUE;
  356. return FALSE;
  357. }
  358. BOOL TakeGame::IsRouteCan()
  359. {
  360. int i;CString s;
  361. for(i=0;i<top;i++)
  362. {
  363. if(board[stack[i].x][stack[i].y]>0)
  364. {
  365. //s.Format("%d %d %d",stack[i].x,stack[i].y,board[stack[i].x][stack[i].y]);
  366. //AfxMessageBox(s);
  367. return FALSE;
  368. }
  369. }
  370. return TRUE;
  371. }
  372. BOOL TakeGame::MoveLine(CPoint from, CPoint to)
  373. {
  374. int i,a;top=0;engineer=FALSE;
  375. if(board[from.x][from.y]>12&&board[from.x][from.y]<16)
  376. {
  377. if(board[from.x][from.y]==11)
  378. return FALSE;
  379. if(from.x==to.x&&from.y==to.y)
  380. return FALSE;
  381. if(IsSameSide(to))
  382. return FALSE;
  383. if(RAILWAY[from.x][from.y]==1&&RAILWAY[to.x][to.y]==1)
  384. {
  385. if(from.x==to.x)
  386. {
  387. a=(from.y<to.y)?1:-1;top=0;
  388. for(i=from.y+a;i!=to.y;i=i+a)
  389. {
  390. stack[top].x=from.x;
  391. if(a==1)
  392. stack[top].d=0;
  393. else
  394. stack[top].d=2;
  395. stack[top++].y=i;
  396. }
  397. return IsRouteCan();
  398. }else if(from.y==to.y)
  399. {
  400. a=(from.x<to.x)?1:-1;top=0;
  401. for(i=from.x+a;i!=to.x;i=i+a)
  402. {
  403. stack[top].y=from.y;
  404. if(a==1)
  405. stack[top].d=1;
  406. else
  407. stack[top].d=3;
  408. stack[top++].x=i;
  409. }
  410. return IsRouteCan();
  411. }else
  412. {
  413. if(from.x==10&&from.y<6&&to.x>10&&to.y==6)
  414. {
  415. top=0;
  416. for(i=from.y+1;i<6;i++)
  417. {
  418. stack[top].x=from.x;
  419. stack[top].d=0;
  420. stack[top++].y=i;
  421. }
  422. stack[top].x=11;stack[top].d=0;stack[top++].y=5;
  423. for(i=11;i<to.x;i++)
  424. {
  425. stack[top].x=i;
  426. stack[top].y=6;
  427. stack[top++].d=1;
  428. }
  429. return IsRouteCan();
  430. }
  431. if(to.x==10&&to.y<6&&from.x>10&&from.y==6)
  432. {
  433. top=0;
  434. for(i=from.x-1;i>10;i--)
  435. {
  436. stack[top].x=i;
  437. stack[top].d=3;
  438. stack[top++].y=6;
  439. }
  440. stack[top].x=11;stack[top].d=2;stack[top++].y=5;
  441. for(i=5;i>to.y;i--)
  442. {
  443. stack[top].x=10;
  444. stack[top].y=i;
  445. stack[top++].d=2;
  446. }
  447. return IsRouteCan();
  448. }
  449. if(to.x==10&&to.y>10&&from.x>10&&from.y==10)
  450. {
  451. top=0;
  452. for(i=from.x-1;i>10;i--)
  453. {
  454. stack[top].x=i;
  455. stack[top].y=10;
  456. stack[top++].d=3;
  457. }
  458. stack[top].x=11;stack[top].d=0;stack[top++].y=11;
  459. for(i=11;i<to.y;i++)
  460. {
  461. stack[top].x=10;
  462. stack[top].y=i;
  463. stack[top].d=0;
  464. }
  465. return IsRouteCan();
  466. }
  467. if(to.x>10&&to.y==10&&from.x==10&&from.y>10)
  468. {
  469. top=0;
  470. for(i=from.y-1;i>10;i--)
  471. {
  472. stack[top].x=10;
  473. stack[top].y=i;
  474. stack[top++].d=2;
  475. }
  476. stack[top].x=11;stack[top].d=2;stack[top++].y=11;
  477. for(i=11;i<to.x;i++)
  478. {
  479. stack[top].x=i;
  480. stack[top].y=10;
  481. stack[top++].d=1;
  482. }
  483. return IsRouteCan();
  484. }
  485. if(to.x==6&&to.y<6&&from.x<6&&from.y==6)
  486. {
  487. top=0;
  488. for(i=from.x+1;i<6;i++)
  489. {
  490. stack[top].x=i;
  491. stack[top].y=6;
  492. stack[top++].d=1;
  493. }
  494. stack[top].x=5;stack[top].y=5;stack[top++].d=1;
  495. for(i=5;i>to.y;i--)
  496. {
  497. stack[top].x=6;
  498. stack[top].d=2;
  499. stack[top].y=i;
  500. }
  501. return IsRouteCan();
  502. }
  503. if(to.x<6&&to.y==6&&from.x==6&&from.y<6)
  504. {
  505. top=0;
  506. for(i=from.y+1;i<6;i++)
  507. {
  508. stack[top].x=6;
  509. stack[top].y=i;
  510. stack[top++].d=0;
  511. }
  512. stack[top].x=5;stack[top].y=5;stack[top++].d=0;
  513. for(i=5;i>to.x;i--)
  514. {
  515. stack[top].x=i;
  516. stack[top].y=6;
  517. stack[top++].d=3;
  518. }
  519. return IsRouteCan();
  520. }
  521. if(to.x<6&&to.y==10&&from.x==6&&from.y>10)
  522. {
  523. top=0;
  524. for(i=from.y-1;i>10;i--)
  525. {
  526. stack[top].x=6;
  527. stack[top].y=i;
  528. stack[top++].d=2;
  529. }
  530. stack[top].x=5;stack[top].y=11;stack[top++].d=3;
  531. for(i=5;i>to.x;i--)
  532. {
  533. stack[top].x=i;
  534. stack[top].y=10;
  535. stack[top++].d=3;
  536. }
  537. return IsRouteCan();
  538. }
  539. if(to.x==6&&to.y>10&&from.x<6&&from.y==10)
  540. {
  541. top=0;
  542. for(i=from.x+1;i<6;i++)
  543. {
  544. stack[top].x=i;
  545. stack[top].y=10;
  546. stack[top++].d=1;
  547. }
  548. stack[top].x=5;stack[top].y=11;stack[top++].d=1;
  549. for(i=11;i<to.y;i++)
  550. {
  551. stack[top].x=6;
  552. stack[top].y=i;
  553. stack[top++].d=0;
  554. }
  555. return IsRouteCan();
  556. }
  557. }
  558. }
  559. if(IsCamp(to))
  560. {
  561. if((abs(from.x-to.x)==1||abs(from.y-to.y)==1)&&board[to.x][to.y]==0)
  562. return TRUE;
  563. else return FALSE;
  564. }else if(IsCamp(from))
  565. {
  566. if(abs(from.x-to.x)==1||abs(from.y-to.y)==1)
  567. return TRUE;
  568. else return FALSE;
  569. }else
  570. {
  571. if((abs(from.x-to.x)==1)&&(from.y==to.y)||(abs(from.y-to.y)==1)&&(from.x==to.x))
  572. return TRUE;
  573. return TakeEngineer(from,to);
  574. }
  575. }
  576. return FALSE;
  577. }