Thinker.cpp
上传用户:onward9999
上传日期:2022-06-27
资源大小:989k
文件大小:25k
源码类别:

其他游戏

开发平台:

Visual C++

  1. // Thinker.cpp: implementation of the CThinker class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "BaseDef.h"
  6. #include "Thinker.h"
  7. #include "MoveList.h"
  8. #include "ThinkDef.h"
  9. #ifdef _DEBUG
  10. #undef THIS_FILE
  11. static char THIS_FILE[]=__FILE__;
  12. #define new DEBUG_NEW
  13. #endif
  14. //////////////////////////////////////////////////////////////////////
  15. // Construction/Destruction
  16. //////////////////////////////////////////////////////////////////////
  17. CThinker::~CThinker()
  18. {
  19. if(!m_bExited)Exit();
  20. }
  21. UINT CThinker::ThinkProc() //思考线程生存期与类对象生存期相同
  22. {
  23. int i,cur,maxvalue[3],curvalue;
  24. char *bman,*btox,*btoy;
  25. int *pcount;
  26. CMove maxmove[3];
  27. const char strman[14][3]=
  28. {"帅","仕","相","马","车","炮","兵","将","士","象","马","车","炮","卒"};
  29. TRACE("进入思考线程n");
  30. while(1)
  31. {
  32. cs.Lock();
  33. if(m_bWaitForExit)
  34. {
  35. cs.Unlock();
  36. goto _EXIT;
  37. }
  38. cs.Unlock();
  39. cs.Lock();
  40. if(m_bWaitForCut)
  41. {
  42. cs.Unlock();
  43. goto _CUT;
  44. }
  45. cs.Unlock();
  46. cs.Lock();
  47. if(!m_bThinking)
  48. {
  49. cs.Unlock();
  50. continue;
  51. }
  52. cs.Unlock();
  53. curvalue=-10000;
  54. maxvalue[0]=-10000;
  55. maxvalue[1]=-10001;
  56. maxvalue[2]=-10002;
  57. cs.Lock();
  58. tlevel = m_nLevel;
  59. cs.Unlock();
  60. tdeep  =0;
  61. bman=tman[0];
  62. btox=ttox[0];
  63. btoy=ttoy[0];
  64. pcount=& tcount[0];
  65. *pcount=0;
  66. for(i=0;i<32;i++)
  67. {
  68. tmanx[i]=m_FaceToThink.man[i].x;
  69. tmany[i]=m_FaceToThink.man[i].y;
  70. }
  71. tside=m_FaceToThink.side;
  72. FixManMap(m_FaceToThink,tmap);
  73. cur=0;
  74. EnumList();
  75. i=*pcount;
  76. while(cur<i)
  77. {
  78. curvalue=SubThink(bman[cur],btox[cur],btoy[cur]);
  79. //---------------------------
  80. bman=tman[0];
  81. btox=ttox[0];
  82. btoy=ttoy[0];
  83. //----------------------------
  84. //防止兑子过快:
  85. if(tmap[btox[cur]][btoy[cur]]!=32) curvalue-=BV1[4]/18;
  86. TRACE("%2d: %s(%2d,%2d) - (%2d,%2d) =%4dn"
  87. ,cur
  88. ,strman[ManToType[bman[cur]]]
  89. ,tmanx[bman[cur]]
  90. ,tmany[bman[cur]]
  91. ,btox[cur]
  92. ,btoy[cur]
  93. ,curvalue);
  94. if(curvalue >maxvalue[0])
  95. {
  96. maxmove[2]=maxmove[1]; maxvalue[2]=maxvalue[1];
  97. maxmove[1]=maxmove[0]; maxvalue[1]=maxvalue[0];
  98. maxmove[0].man=bman[cur];
  99. maxmove[0].x=btox[cur];
  100. maxmove[0].y=btoy[cur];
  101. maxvalue[0]=curvalue;
  102. }
  103. else if(curvalue >maxvalue[1])
  104. {
  105. maxmove[2]=maxmove[1]; maxvalue[2]=maxvalue[1];
  106. maxmove[1].man=bman[cur];
  107. maxmove[1].x=btox[cur];
  108. maxmove[1].y=btoy[cur];
  109. maxvalue[1]=curvalue;
  110. }
  111. else if(curvalue >maxvalue[2])
  112. {
  113. maxmove[2].man=bman[cur];
  114. maxmove[2].x=btox[cur];
  115. maxmove[2].y=btoy[cur];
  116. maxvalue[2]=curvalue;
  117. }
  118. cur ++;
  119. cs.Lock();
  120. m_nPercent=((cur+1)*100)/i;
  121. cs.Unlock();
  122. //----------这一段要保证随时能调用
  123. cs.Lock();
  124. if(m_bWaitForExit)
  125. {
  126. cs.Unlock();
  127. goto _EXIT;
  128. }
  129. cs.Unlock();
  130. cs.Lock();
  131. if(m_bWaitForCut)
  132. {
  133. cs.Unlock();
  134. goto _CUT;
  135. }
  136. cs.Unlock();
  137. // --------------------------------
  138. }
  139. //结束一次计算:
  140. cs.Lock();
  141. float f;
  142. f=(float(maxvalue[0]-maxvalue[2])/(float(maxvalue[0]+maxvalue[1]+maxvalue[2])/3));
  143. if(f<0.1 && f>-0.1)
  144. m_moveResult=maxmove[rnd(3)];
  145. else
  146. {
  147. f=(float(maxvalue[0]-maxvalue[1])/(float(maxvalue[0]+maxvalue[1])/2));
  148. if(f<0.1 && f>-0.1) m_moveResult=maxmove[rnd(2)];
  149. else m_moveResult=maxmove[0];
  150. }
  151. TRACE("结果: %s(%2d,%2d) - (%2d,%2d)n"
  152. ,strman[ManToType[m_moveResult.man]]
  153. ,m_FaceToThink.man[m_moveResult.man].x
  154. ,m_FaceToThink.man[m_moveResult.man].y
  155. ,m_moveResult.x
  156. ,m_moveResult.y);
  157. m_bThinkOver=TRUE;
  158. //-------------------------
  159. for(i=0;i<32;i++)
  160. {
  161. m_FaceToThink.man[i].x=tmanx[i];
  162. m_FaceToThink.man[i].y=tmany[i];
  163. }
  164. m_FaceToThink.side=tside;
  165. //-------------------------------
  166. cs.Unlock();
  167. goto _DDD;
  168. _CUT: cs.Lock();
  169. m_Cut.SetEvent();
  170. if(m_bWaitForCut)m_bWaitForCut=FALSE;
  171. cs.Unlock();
  172. _DDD: cs.Lock();
  173. m_bThinking=FALSE;
  174. cs.Unlock();
  175. }
  176. _EXIT: TRACE("退出思考线程n");
  177. cs.Lock();
  178. m_Stoped.SetEvent();
  179. cs.Unlock();
  180. return 0;
  181. }
  182. UINT CThinker::_bogusthreadfunc(LPVOID lpparam)//线程函数不能是普通的类成员函数
  183. { //所以通过这个static类型的函数启动线程
  184. CThinker* This=(CThinker*)(lpparam); //lpparam为构造器中传过来的"this"指针
  185. return This->ThinkProc();
  186. }
  187. CThinker::CThinker()
  188. {
  189. ResetBV();
  190. m_nLevel = 1;
  191.   m_nPercent = 0;
  192. m_bExited = FALSE;
  193. m_bWaitForExit = FALSE;
  194. m_bWaitForCut = FALSE;
  195. m_bThinking = FALSE;
  196. m_bThinkOver = FALSE;
  197. m_pThinkThread=AfxBeginThread(_bogusthreadfunc,this,THREAD_PRIORITY_NORMAL); //构造器中启动线程
  198. }
  199. BOOL CThinker::GetMove(CMove& move,CFace facetothink)
  200. {
  201. //TRACE("Enter CThinker::GetMove()n");
  202. if(!IsThinkOver())return FALSE;
  203. cs.Lock();
  204. if(facetothink==m_FaceToThink)
  205. {
  206. move=m_moveResult;
  207. cs.Unlock();
  208. return TRUE;
  209. }
  210. cs.Unlock();
  211. TRACE("CThinker::GetMove() 发现两次的棋局不同n");
  212. return FALSE;
  213. }
  214. void CThinker::SetLevel(int level)
  215. {
  216. cs.Lock();
  217. m_nLevel=level;
  218. TRACE("设置电脑等级为 %dn",level);
  219. cs.Unlock();
  220. }
  221. void CThinker::Exit()
  222. {
  223. cs.Lock();
  224. m_bWaitForExit=TRUE;
  225. cs.Unlock();
  226. ::WaitForSingleObject(m_Stoped,INFINITE);
  227. m_bExited=TRUE;
  228. Sleep(300);
  229. }
  230. void CThinker::Think(CFace face)
  231. {
  232. //TRACE("Enter CThinker::Think()n");
  233. if(m_bThinking)Cut();
  234. cs.Lock();
  235. m_nPercent = 0;
  236. m_FaceToThink = face;
  237. m_bThinking = TRUE;
  238. m_bThinkOver = FALSE;
  239. TRACE("计算 side = %dn",face.side);
  240. cs.Unlock();
  241. //TRACE("Leave CThinker::Think()n");
  242. }
  243. BOOL CThinker::IsThinkOver()
  244. {
  245. //TRACE("Enter CThinker::IsThinkOver()n");
  246. BOOL flag;
  247. cs.Lock();
  248. flag=m_bThinkOver;
  249. cs.Unlock();
  250. //TRACE("Leave CThinker::IsThinkOver()n");
  251. return flag;
  252. }
  253. void CThinker::Cut()
  254. {
  255. cs.Lock();
  256. m_bWaitForCut=TRUE;
  257. cs.Unlock();
  258. ::WaitForSingleObject(m_Cut,INFINITE);
  259. cs.Lock();
  260. m_bThinkOver=FALSE;
  261. m_nPercent=0;
  262. cs.Unlock();
  263. TRACE("中止计算n");
  264. }
  265. UINT CThinker::GetPercent()
  266. {
  267. int val;
  268. cs.Lock();
  269. val=m_nPercent;
  270. cs.Unlock();
  271. return val;
  272. }
  273. #define ADD(man,tx,ty) {*lman=man;*ltox=tx;*ltoy=ty;lman++;ltox++;ltoy++;(*pcount)++;if(tmap[tx][ty]==FistOfSide[!tside])goto _NOKING;}
  274. BOOL CThinker::EnumList()
  275. {
  276. static int i,j,n,x,y,* pcount;
  277. static BOOL flag;
  278. lman=tman[tdeep];
  279. ltox=ttox[tdeep];
  280. ltoy=ttoy[tdeep];
  281. pcount=&tcount[tdeep];
  282. for(n=FistOfSide[tside];n<=LastOfSide[tside];n++)
  283. {
  284. x=tmanx[n];
  285. if(!x)continue;
  286. y=tmany[n];
  287. switch(n)
  288. {
  289. case 0:
  290. if(tmanx[0]==tmanx[16]) //将帅在同一列
  291. {
  292. flag=FALSE;
  293. for(j=tmany[16]+1;j<tmany[0];j++)
  294. {
  295. if(tmap[x][j]!=32)
  296. {
  297. flag=TRUE;
  298. break;
  299. }
  300. }
  301. if (!flag)
  302. {
  303. ADD(0,x,tmany[16]);
  304. }
  305. }
  306. j=y+1;if(j<=10 && NORED(x,j)) ADD(0,x,j)
  307. j=y-1;if(j>=8  && NORED(x,j)) ADD(0,x,j)
  308. i=x+1;if(i<=6  && NORED(i,y)) ADD(0,i,y)
  309. i=x-1;if(i>=4  && NORED(i,y)) ADD(0,i,y)
  310. break;
  311. case 16:
  312. if(tmanx[0]==tmanx[16]) //将帅在同一列
  313. {
  314. flag=FALSE;
  315. for(j=tmany[16]+1;j<tmany[0];j++)
  316. {
  317. if(tmap[x][j]!=32)
  318. {
  319. flag=TRUE;
  320. break;
  321. }
  322. }
  323. if (!flag)
  324. {
  325. ADD(16,x,tmany[0]);
  326. }
  327. }
  328. j=y+1;if(j<=3 && NOBLACK(x,j)) ADD(16,x,j)
  329. j=y-1;if(j>=1  && NOBLACK(x,j)) ADD(16,x,j)
  330. i=x+1;if(i<=6  && NOBLACK(i,y)) ADD(16,i,y)
  331. i=x-1;if(i>=4  && NOBLACK(i,y)) ADD(16,i,y)
  332. break;
  333. case 1:
  334. case 2:
  335. i=x+1;j=y+1;if(i<=6 && j<=10 && NORED(i,j)) ADD(n,i,j)
  336. i=x+1;j=y-1;if(i<=6 && j>=8  && NORED(i,j)) ADD(n,i,j)
  337. i=x-1;j=y+1;if(i>=4 && j<=10 && NORED(i,j)) ADD(n,i,j)
  338. i=x-1;j=y-1;if(i>=4 && j>=8  && NORED(i,j)) ADD(n,i,j)
  339. break;
  340. case 17:
  341. case 18:
  342. i=x+1;j=y+1;if(i<=6 && j<=3 && NOBLACK(i,j)) ADD(n,i,j)
  343. i=x+1;j=y-1;if(i<=6 && j>=1 && NOBLACK(i,j)) ADD(n,i,j)
  344. i=x-1;j=y+1;if(i>=4 && j<=3 && NOBLACK(i,j)) ADD(n,i,j)
  345. i=x-1;j=y-1;if(i>=4 && j>=1 && NOBLACK(i,j)) ADD(n,i,j)
  346. break;
  347. case 3:
  348. case 4:
  349. i=x+2;j=y+2;if(i<=9 && j<=10   && NORED(i,j)) if(NOMAN(x+1,y+1)) ADD(n,i,j)
  350. i=x+2;j=y-2;if(i<=9 && j>=6    && NORED(i,j)) if(NOMAN(x+1,y-1)) ADD(n,i,j)
  351. i=x-2;j=y+2;if(i>=1 && j<=10   && NORED(i,j)) if(NOMAN(x-1,y+1)) ADD(n,i,j)
  352. i=x-2;j=y-2;if(i>=1 && j>=6    && NORED(i,j)) if(NOMAN(x-1,y-1)) ADD(n,i,j)
  353. break;
  354. case 19:
  355. case 20:
  356. i=x+2;j=y+2;if(i<=9 && j<=5  && NOBLACK(i,j)) if(NOMAN(x+1,y+1)) ADD(n,i,j)
  357. i=x+2;j=y-2;if(i<=9 && j>=1  && NOBLACK(i,j)) if(NOMAN(x+1,y-1)) ADD(n,i,j)
  358. i=x-2;j=y+2;if(i>=1 && j<=5  && NOBLACK(i,j)) if(NOMAN(x-1,y+1)) ADD(n,i,j)
  359. i=x-2;j=y-2;if(i>=1 && j>=1  && NOBLACK(i,j)) if(NOMAN(x-1,y-1)) ADD(n,i,j)
  360. break;
  361. case 5:
  362. case 6:
  363. i=x+1;
  364. if(NOMAN(i,y))
  365. {
  366. i=x+2;j=y+1;if(i<=9 && j<=10 && NORED(i,j)) ADD(n,i,j)
  367. i=x+2;j=y-1;if(i<=9 && j>=1  && NORED(i,j)) ADD(n,i,j)
  368. }
  369. i=x-1;
  370. if(NOMAN(i,y))
  371. {
  372. i=x-2;j=y+1;if(i>=1 && j<=10 && NORED(i,j)) ADD(n,i,j)
  373. i=x-2;j=y-1;if(i>=1 && j>=1  && NORED(i,j)) ADD(n,i,j)
  374. }
  375. j=y+1;
  376. if(NOMAN(x,j))
  377. {
  378. i=x+1;j=y+2;if(i<=9 && j<=10 && NORED(i,j)) ADD(n,i,j)
  379. i=x-1;j=y+2;if(i>=1 && j<=10 && NORED(i,j)) ADD(n,i,j)
  380. }
  381. j=y-1;
  382. if(NOMAN(x,j))
  383. {
  384. i=x+1;j=y-2;if(i<=9 && j>=1 && NORED(i,j)) ADD(n,i,j)
  385. i=x-1;j=y-2;if(i>=1 && j>=1 && NORED(i,j)) ADD(n,i,j)
  386. }
  387. break;
  388. case 21:
  389. case 22:
  390. i=x+1;
  391. if(NOMAN(i,y))
  392. {
  393. i=x+2;j=y+1;if(i<=9 && j<=10 && NOBLACK(i,j)) ADD(n,i,j)
  394. i=x+2;j=y-1;if(i<=9 && j>=1  && NOBLACK(i,j)) ADD(n,i,j)
  395. }
  396. i=x-1;
  397. if(NOMAN(i,y))
  398. {
  399. i=x-2;j=y+1;if(i>=1 && j<=10 && NOBLACK(i,j)) ADD(n,i,j)
  400. i=x-2;j=y-1;if(i>=1 && j>=1  && NOBLACK(i,j)) ADD(n,i,j)
  401. }
  402. j=y+1;
  403. if(NOMAN(x,j))
  404. {
  405. i=x+1;j=y+2;if(i<=9 && j<=10 && NOBLACK(i,j)) ADD(n,i,j)
  406. i=x-1;j=y+2;if(i>=1 && j<=10 && NOBLACK(i,j)) ADD(n,i,j)
  407. }
  408. j=y-1;
  409. if(NOMAN(x,j))
  410. {
  411. i=x+1;j=y-2;if(i<=9 && j>=1 && NOBLACK(i,j)) ADD(n,i,j)
  412. i=x-1;j=y-2;if(i>=1 && j>=1 && NOBLACK(i,j)) ADD(n,i,j)
  413. }
  414. break;
  415. case 7:
  416. case 8:
  417. i=x+1;
  418. while(i<=9)
  419. {
  420. if (NOMAN(i,y)) ADD(n,i,y)
  421. else
  422. {
  423. if(NORED(i,y)) ADD(n,i,y)
  424. break;
  425. }
  426. i++;
  427. }
  428. i=x-1;
  429. while(i>=1)
  430. {
  431. if (NOMAN(i,y)) ADD(n,i,y)
  432. else
  433. {
  434. if(NORED(i,y)) ADD(n,i,y)
  435. break;
  436. }
  437. i--;
  438. }
  439. j=y+1;
  440. while(j<=10)
  441. {
  442. if (NOMAN(x,j)) ADD(n,x,j)
  443. else
  444. {
  445. if(NORED(x,j)) ADD(n,x,j)
  446. break;
  447. }
  448. j++;
  449. }
  450. j=y-1;
  451. while(j>=1)
  452. {
  453. if (NOMAN(x,j)) ADD(n,x,j)
  454. else
  455. {
  456. if(NORED(x,j)) ADD(n,x,j)
  457. break;
  458. }
  459. j--;
  460. }
  461. break;
  462. case 23:
  463. case 24:
  464. i=x+1;
  465. while(i<=9)
  466. {
  467. if (NOMAN(i,y)) ADD(n,i,y)
  468. else
  469. {
  470. if(NOBLACK(i,y)) ADD(n,i,y)
  471. break;
  472. }
  473. i++;
  474. }
  475. i=x-1;
  476. while(i>=1)
  477. {
  478. if (NOMAN(i,y)) ADD(n,i,y)
  479. else
  480. {
  481. if(NOBLACK(i,y)) ADD(n,i,y)
  482. break;
  483. }
  484. i--;
  485. }
  486. j=y+1;
  487. while(j<=10)
  488. {
  489. if (NOMAN(x,j)) ADD(n,x,j)
  490. else
  491. {
  492. if(NOBLACK(x,j)) ADD(n,x,j)
  493. break;
  494. }
  495. j++;
  496. }
  497. j=y-1;
  498. while(j>=1)
  499. {
  500. if (NOMAN(x,j)) ADD(n,x,j)
  501. else
  502. {
  503. if(NOBLACK(x,j)) ADD(n,x,j)
  504. break;
  505. }
  506. j--;
  507. }
  508. break;
  509. case 9:
  510. case 10:
  511. i=x+1;flag=FALSE;
  512. while(i<=9)
  513. {
  514. if(NOMAN(i,y))
  515. {
  516. if(!flag) ADD(n,i,y)
  517. }
  518. else
  519. {
  520. if(!flag)flag=TRUE;
  521. else 
  522. {
  523. if(NORED(i,y)) ADD(n,i,y)
  524. break;
  525. }
  526. }
  527. i++;
  528. }
  529. i=x-1;flag=FALSE;
  530. while(i>=1)
  531. {
  532. if(NOMAN(i,y)) 
  533. {
  534. if(!flag) ADD(n,i,y)
  535. }
  536. else
  537. {
  538. if(!flag)flag=TRUE;
  539. else 
  540. {
  541. if(NORED(i,y)) ADD(n,i,y)
  542. break;
  543. }
  544. }
  545. i--;
  546. }
  547. j=y+1;flag=FALSE;
  548. while(j<=10)
  549. {
  550. if(NOMAN(x,j)) 
  551. {
  552. if(!flag) ADD(n,x,j)
  553. }
  554. else
  555. {
  556. if(!flag)flag=TRUE;
  557. else 
  558. {
  559. if(NORED(x,j)) ADD(n,x,j)
  560. break;
  561. }
  562. }
  563. j++;
  564. }
  565. j=y-1;flag=FALSE;
  566. while(j>=1)
  567. {
  568. if(NOMAN(x,j)) 
  569. {
  570. if(!flag) ADD(n,x,j)
  571. }
  572. else
  573. {
  574. if(!flag)flag=TRUE;
  575. else 
  576. {
  577. if(NORED(x,j)) ADD(n,x,j)
  578. break;
  579. }
  580. }
  581. j--;
  582. }
  583. break;
  584. case 25:
  585. case 26:
  586. i=x+1;flag=FALSE;
  587. while(i<=9)
  588. {
  589. if(NOMAN(i,y))
  590. {
  591. if(!flag) ADD(n,i,y)
  592. }
  593. else
  594. {
  595. if(!flag)flag=TRUE;
  596. else
  597. {
  598. if(NOBLACK(i,y)) ADD(n,i,y)
  599. break;
  600. }
  601. }
  602. i++;
  603. }
  604. i=x-1;flag=FALSE;
  605. while(i>=1)
  606. {
  607. if(NOMAN(i,y)) 
  608. {
  609. if(!flag) ADD(n,i,y)
  610. }
  611. else
  612. {
  613. if(!flag)flag=TRUE;
  614. else 
  615. {
  616. if(NOBLACK(i,y)) ADD(n,i,y)
  617. break;
  618. }
  619. }
  620. i--;
  621. }
  622. j=y+1;flag=FALSE;
  623. while(j<=10)
  624. {
  625. if(NOMAN(x,j))
  626. {
  627. if(!flag) ADD(n,x,j)
  628. }
  629. else
  630. {
  631. if(!flag)flag=TRUE;
  632. else 
  633. {
  634. if(NOBLACK(x,j)) ADD(n,x,j)
  635. break;
  636. }
  637. }
  638. j++;
  639. }
  640. j=y-1;flag=FALSE;
  641. while(j>=1)
  642. {
  643. if(NOMAN(x,j))
  644. {
  645. if(!flag) ADD(n,x,j)
  646. }
  647. else
  648. {
  649. if(!flag)flag=TRUE;
  650. else 
  651. {
  652. if(NOBLACK(x,j)) ADD(n,x,j)
  653. break;
  654. }
  655. }
  656. j--;
  657. }
  658. break;
  659. case 11:
  660. case 12:
  661. case 13:
  662. case 14:
  663. case 15:
  664. j=y-1;
  665. if(j>=1 && NORED(x,j)) ADD(n,x,j)
  666. if(y<=5)
  667. {
  668. i=x+1;if(i<=9 && NORED(i,y)) ADD(n,i,y)
  669. i=x-1;if(i>=1 && NORED(i,y)) ADD(n,i,y)
  670. }
  671. break;
  672. case 27:
  673. case 28:
  674. case 29:
  675. case 30:
  676. case 31:
  677. j=y+1;
  678. if(j<=10 && NOBLACK(x,j)) ADD(n,x,j)
  679. if(y>=6)
  680. {
  681. i=x+1;if(i<=9 && NOBLACK(i,y)) ADD(n,i,y)
  682. i=x-1;if(i>=1 && NOBLACK(i,y)) ADD(n,i,y)
  683. }
  684. break;
  685. default :
  686. break;
  687. }
  688. }
  689. return TRUE;
  690. _NOKING:
  691. return FALSE;
  692. }
  693. #define CV(man,tx,ty) {k=tmap[tx][ty];v1[man]+=1;if(k!=32)v2[man][k]=1;}
  694. void CThinker::ContactV()
  695. {
  696. static int i,j,n,x,y;
  697. static BOOL flag;
  698. for(n=0;n<=31;n++)
  699. {
  700. x=tmanx[n];
  701. if(!x)continue;
  702. y=tmany[n];
  703. switch(n)
  704. {
  705. case 0:
  706. if(tmanx[0]==tmanx[16]) //将帅在同一列
  707. {
  708. flag=FALSE;
  709. for(j=tmany[16]+1;j<tmany[0];j++)
  710. {
  711. if(tmap[x][j]!=32)
  712. {
  713. flag=TRUE;
  714. break;
  715. }
  716. }
  717. if (!flag)
  718. {
  719. CV(0,x,tmany[16]);
  720. }
  721. }
  722. j=y+1;if(j<=10 ) CV(0,x,j)
  723. j=y-1;if(j>=8  ) CV(0,x,j)
  724. i=x+1;if(i<=6  ) CV(0,i,y)
  725. i=x-1;if(i>=4  ) CV(0,i,y)
  726. break;
  727. case 16:
  728. if(tmanx[0]==tmanx[16]) //将帅在同一列
  729. {
  730. flag=FALSE;
  731. for(j=tmany[16]+1;j<tmany[0];j++)
  732. {
  733. if(tmap[x][j]!=32)
  734. {
  735. flag=TRUE;
  736. break;
  737. }
  738. }
  739. if (!flag)
  740. {
  741. CV(16,x,tmany[0]);
  742. }
  743. }
  744. j=y+1;if(j<=3 ) CV(16,x,j)
  745. j=y-1;if(j>=1 ) CV(16,x,j)
  746. i=x+1;if(i<=6 ) CV(16,i,y)
  747. i=x-1;if(i>=4 ) CV(16,i,y)
  748. break;
  749. case 1:
  750. case 2:
  751. i=x+1;j=y+1;if(i<=6 && j<=10 ) CV(n,i,j)
  752. i=x+1;j=y-1;if(i<=6 && j>=8  ) CV(n,i,j)
  753. i=x-1;j=y+1;if(i>=4 && j<=10 ) CV(n,i,j)
  754. i=x-1;j=y-1;if(i>=4 && j>=8  ) CV(n,i,j)
  755. break;
  756. case 17:
  757. case 18:
  758. i=x+1;j=y+1;if(i<=6 && j<=3 ) CV(n,i,j)
  759. i=x+1;j=y-1;if(i<=6 && j>=1 ) CV(n,i,j)
  760. i=x-1;j=y+1;if(i>=4 && j<=3 ) CV(n,i,j)
  761. i=x-1;j=y-1;if(i>=4 && j>=1 ) CV(n,i,j)
  762. break;
  763. case 3:
  764. case 4:
  765. i=x+2;j=y+2;if(i<=9 && j<=10  ) if(NOMAN(x+1,y+1)) CV(n,i,j)
  766. i=x+2;j=y-2;if(i<=9 && j>=6   ) if(NOMAN(x+1,y-1)) CV(n,i,j)
  767. i=x-2;j=y+2;if(i>=1 && j<=10  ) if(NOMAN(x-1,y+1)) CV(n,i,j)
  768. i=x-2;j=y-2;if(i>=1 && j>=6   ) if(NOMAN(x-1,y-1)) CV(n,i,j)
  769. break;
  770. case 19:
  771. case 20:
  772. i=x+2;j=y+2;if(i<=9 && j<=5 ) if(NOMAN(x+1,y+1)) CV(n,i,j)
  773. i=x+2;j=y-2;if(i<=9 && j>=1 ) if(NOMAN(x+1,y-1)) CV(n,i,j)
  774. i=x-2;j=y+2;if(i>=1 && j<=5 ) if(NOMAN(x-1,y+1)) CV(n,i,j)
  775. i=x-2;j=y-2;if(i>=1 && j>=1 ) if(NOMAN(x-1,y-1)) CV(n,i,j)
  776. break;
  777. case 5:
  778. case 6:
  779. i=x+1;
  780. if(NOMAN(i,y))
  781. {
  782. i=x+2;j=y+1;if(i<=9 && j<=10 ) CV(n,i,j)
  783. i=x+2;j=y-1;if(i<=9 && j>=1  ) CV(n,i,j)
  784. }
  785. i=x-1;
  786. if(NOMAN(i,y))
  787. {
  788. i=x-2;j=y+1;if(i>=1 && j<=10 ) CV(n,i,j)
  789. i=x-2;j=y-1;if(i>=1 && j>=1  ) CV(n,i,j)
  790. }
  791. j=y+1;
  792. if(NOMAN(x,j))
  793. {
  794. i=x+1;j=y+2;if(i<=9 && j<=10 ) CV(n,i,j)
  795. i=x-1;j=y+2;if(i>=1 && j<=10 ) CV(n,i,j)
  796. }
  797. j=y-1;
  798. if(NOMAN(x,j))
  799. {
  800. i=x+1;j=y-2;if(i<=9 && j>=1 ) CV(n,i,j)
  801. i=x-1;j=y-2;if(i>=1 && j>=1 ) CV(n,i,j)
  802. }
  803. break;
  804. case 21:
  805. case 22:
  806. i=x+1;
  807. if(NOMAN(i,y))
  808. {
  809. i=x+2;j=y+1;if(i<=9 && j<=10 ) CV(n,i,j)
  810. i=x+2;j=y-1;if(i<=9 && j>=1  ) CV(n,i,j)
  811. }
  812. i=x-1;
  813. if(NOMAN(i,y))
  814. {
  815. i=x-2;j=y+1;if(i>=1 && j<=10 ) CV(n,i,j)
  816. i=x-2;j=y-1;if(i>=1 && j>=1  ) CV(n,i,j)
  817. }
  818. j=y+1;
  819. if(NOMAN(x,j))
  820. {
  821. i=x+1;j=y+2;if(i<=9 && j<=10 ) CV(n,i,j)
  822. i=x-1;j=y+2;if(i>=1 && j<=10 ) CV(n,i,j)
  823. }
  824. j=y-1;
  825. if(NOMAN(x,j))
  826. {
  827. i=x+1;j=y-2;if(i<=9 && j>=1 ) CV(n,i,j)
  828. i=x-1;j=y-2;if(i>=1 && j>=1 ) CV(n,i,j)
  829. }
  830. break;
  831. case 7:
  832. case 8:
  833. i=x+1;
  834. while(i<=9)
  835. {
  836. if (NOMAN(i,y)) CV(n,i,y)
  837. else
  838. {
  839. CV(n,i,y)
  840. break;
  841. }
  842. i++;
  843. }
  844. i=x-1;
  845. while(i>=1)
  846. {
  847. if (NOMAN(i,y)) CV(n,i,y)
  848. else
  849. {
  850. CV(n,i,y)
  851. break;
  852. }
  853. i--;
  854. }
  855. j=y+1;
  856. while(j<=10)
  857. {
  858. if (NOMAN(x,j)) CV(n,x,j)
  859. else
  860. {
  861. CV(n,x,j)
  862. break;
  863. }
  864. j++;
  865. }
  866. j=y-1;
  867. while(j>=1)
  868. {
  869. if (NOMAN(x,j)) CV(n,x,j)
  870. else
  871. {
  872. CV(n,x,j)
  873. break;
  874. }
  875. j--;
  876. }
  877. break;
  878. case 23:
  879. case 24:
  880. i=x+1;
  881. while(i<=9)
  882. {
  883. if (NOMAN(i,y)) CV(n,i,y)
  884. else
  885. {
  886. CV(n,i,y)
  887. break;
  888. }
  889. i++;
  890. }
  891. i=x-1;
  892. while(i>=1)
  893. {
  894. if (NOMAN(i,y)) CV(n,i,y)
  895. else
  896. {
  897. CV(n,i,y)
  898. break;
  899. }
  900. i--;
  901. }
  902. j=y+1;
  903. while(j<=10)
  904. {
  905. if (NOMAN(x,j)) CV(n,x,j)
  906. else
  907. {
  908. CV(n,x,j)
  909. break;
  910. }
  911. j++;
  912. }
  913. j=y-1;
  914. while(j>=1)
  915. {
  916. if (NOMAN(x,j)) CV(n,x,j)
  917. else
  918. {
  919. CV(n,x,j)
  920. break;
  921. }
  922. j--;
  923. }
  924. break;
  925. case 9:
  926. case 10:
  927. i=x+1;flag=FALSE;
  928. while(i<=9)
  929. {
  930. if(NOMAN(i,y))
  931. {
  932. if(!flag) CV(n,i,y)
  933. }
  934. else
  935. {
  936. if(!flag)flag=TRUE;
  937. else 
  938. {
  939. CV(n,i,y)
  940. break;
  941. }
  942. }
  943. i++;
  944. }
  945. i=x-1;flag=FALSE;
  946. while(i>=1)
  947. {
  948. if(NOMAN(i,y)) 
  949. {
  950. if(!flag) CV(n,i,y)
  951. }
  952. else
  953. {
  954. if(!flag)flag=TRUE;
  955. else 
  956. {
  957. CV(n,i,y)
  958. break;
  959. }
  960. }
  961. i--;
  962. }
  963. j=y+1;flag=FALSE;
  964. while(j<=10)
  965. {
  966. if(NOMAN(x,j)) 
  967. {
  968. if(!flag) CV(n,x,j)
  969. }
  970. else
  971. {
  972. if(!flag)flag=TRUE;
  973. else 
  974. {
  975. CV(n,x,j)
  976. break;
  977. }
  978. }
  979. j++;
  980. }
  981. j=y-1;flag=FALSE;
  982. while(j>=1)
  983. {
  984. if(NOMAN(x,j)) 
  985. {
  986. if(!flag) CV(n,x,j)
  987. }
  988. else
  989. {
  990. if(!flag)flag=TRUE;
  991. else 
  992. {
  993. CV(n,x,j)
  994. break;
  995. }
  996. }
  997. j--;
  998. }
  999. break;
  1000. case 25:
  1001. case 26:
  1002. i=x+1;flag=FALSE;
  1003. while(i<=9)
  1004. {
  1005. if(NOMAN(i,y))
  1006. {
  1007. if(!flag) CV(n,i,y)
  1008. }
  1009. else
  1010. {
  1011. if(!flag)flag=TRUE;
  1012. else
  1013. {
  1014. CV(n,i,y)
  1015. break;
  1016. }
  1017. }
  1018. i++;
  1019. }
  1020. i=x-1;flag=FALSE;
  1021. while(i>=1)
  1022. {
  1023. if(NOMAN(i,y)) 
  1024. {
  1025. if(!flag) CV(n,i,y)
  1026. }
  1027. else
  1028. {
  1029. if(!flag)flag=TRUE;
  1030. else 
  1031. {
  1032. CV(n,i,y)
  1033. break;
  1034. }
  1035. }
  1036. i--;
  1037. }
  1038. j=y+1;flag=FALSE;
  1039. while(j<=10)
  1040. {
  1041. if(NOMAN(x,j))
  1042. {
  1043. if(!flag) CV(n,x,j)
  1044. }
  1045. else
  1046. {
  1047. if(!flag)flag=TRUE;
  1048. else 
  1049. {
  1050. CV(n,x,j)
  1051. break;
  1052. }
  1053. }
  1054. j++;
  1055. }
  1056. j=y-1;flag=FALSE;
  1057. while(j>=1)
  1058. {
  1059. if(NOMAN(x,j))
  1060. {
  1061. if(!flag) CV(n,x,j)
  1062. }
  1063. else
  1064. {
  1065. if(!flag)flag=TRUE;
  1066. else 
  1067. {
  1068. CV(n,x,j)
  1069. break;
  1070. }
  1071. }
  1072. j--;
  1073. }
  1074. break;
  1075. case 11:
  1076. case 12:
  1077. case 13:
  1078. case 14:
  1079. case 15:
  1080. j=y-1;
  1081. if(j>=1 ) CV(n,x,j)
  1082. if(y<=5)
  1083. {
  1084. i=x+1;if(i<=9 ) CV(n,i,y)
  1085. i=x-1;if(i>=1 ) CV(n,i,y)
  1086. }
  1087. break;
  1088. case 27:
  1089. case 28:
  1090. case 29:
  1091. case 30:
  1092. case 31:
  1093. j=y+1;
  1094. if(j<=10 ) CV(n,x,j)
  1095. if(y>=6)
  1096. {
  1097. i=x+1;if(i<=9 ) CV(n,i,y)
  1098. i=x-1;if(i>=1 ) CV(n,i,y)
  1099. }
  1100. break;
  1101. default :
  1102. break;
  1103. }
  1104. }
  1105. }
  1106. int CThinker::SubThink(int man, int tx, int ty)
  1107. {
  1108. int ate,i,j,cur,maxvalue,curvalue,xs,ys;
  1109. char *bman,*btox,*btoy;
  1110. int *pcount;
  1111. ate=32;
  1112. tdeep++;
  1113. //
  1114. //移动棋子:
  1115. xs=tmanx[man];ys=tmany[man]; //原坐标
  1116. if (SideOfMan[tmap[tx][ty]]==!tside) //目标点有对方的棋子
  1117. {
  1118. ate=tmap[tx][ty]; //记录下被吃掉的棋子
  1119. if(ate==0 || ate==16)
  1120. {
  1121. tdeep--;
  1122. return 9999;
  1123. }
  1124. tmanx[ate]=0; //目标点的棋子被吃掉
  1125. }
  1126. tmap[tx][ty]=man; //这两行是:
  1127. tmap[xs][ys]=32; //在map上的移动
  1128. tmanx[man]=tx; //这两行是:
  1129. tmany[man]=ty; //在face上的移动
  1130. tside=!tside;
  1131. if(tdeep != tlevel)
  1132. {
  1133. //初始化:
  1134. bman=tman[tdeep];
  1135. btox=ttox[tdeep];
  1136. btoy=ttoy[tdeep];
  1137. pcount=& tcount[tdeep];
  1138. *pcount=0;
  1139. cur=0;
  1140. if(EnumList())
  1141. {
  1142. maxvalue=-10000;
  1143. i=*pcount;
  1144. while(cur< i)
  1145. {
  1146. curvalue=SubThink(bman[cur],btox[cur],btoy[cur]);
  1147. if(curvalue>maxvalue)maxvalue=curvalue;
  1148. cur ++;
  1149. }
  1150. }
  1151. else maxvalue=9800;
  1152. }
  1153. else
  1154. {
  1155. memset(v2,0,sizeof(int)<<10);
  1156. memset(v1,0,sizeof(int)<<5);
  1157. memset(v3,0,sizeof(int)<<5);
  1158. memset(v4,0,sizeof(int)<<5);
  1159. maxvalue=0;
  1160. ContactV();
  1161. //己方将军
  1162. for(i=FistOfSide[tside];i<=LastOfSide[tside];i++)
  1163. {
  1164. if(v2[i][FistOfSide[!tside]])
  1165. {
  1166. maxvalue=9700;
  1167. goto _ENDSUB;
  1168. }
  1169. }
  1170. for(i=0;i<32;i++)
  1171. {
  1172. k=ManToType7[i];
  1173. v1[i]=BV1[k]+v1[i]*BV2[k];
  1174. if(k==6) v1[i]+=BV3[ BA[SideOfMan[i]][tmany[i]][tmanx[i]] ];
  1175. }
  1176. for(i=0;i<32;i++)
  1177. {
  1178. for(j=0;j<32;j++)
  1179. {
  1180. if(v2[i][j])
  1181. {
  1182. if(SideOfMan[i]==SideOfMan[j])
  1183. {
  1184. v3[i]+=v1[j]>>5;//己方
  1185. v4[j]++;
  1186. }
  1187. else
  1188. {
  1189. v3[i]+=v1[j]>>3;//对方
  1190. v4[j]--;
  1191. }
  1192. }
  1193. }
  1194. }
  1195. for(i=FistOfSide[tside];i<=LastOfSide[tside];i++)
  1196. {
  1197. if(tmanx[i])maxvalue+=v1[i]+v3[i];
  1198. }
  1199. static BOOL flag;
  1200. flag=FALSE;k=32;
  1201. for(i=FistOfSide[!tside];i<=LastOfSide[!tside];i++)
  1202. {
  1203. if(tmanx[i])maxvalue-=v1[i]+v3[i];
  1204. //对方将军
  1205. if(v2[i][FistOfSide[tside]])
  1206. {
  1207. flag=TRUE;
  1208. k=i;
  1209. break;
  1210. }
  1211. }
  1212. if(flag)//被将
  1213. {
  1214. if(v4[k]>=0)//所将军的棋子不能被吃掉
  1215. {
  1216. j=0;
  1217. for(i=FistOfSide[tside];i<=LastOfSide[tside];i++)
  1218. {
  1219. if(v4[i]<0 && v1[i]>j) j=v1[i];
  1220. }
  1221. maxvalue -=j;
  1222. }
  1223. }
  1224. else
  1225. {
  1226. j=0;
  1227. for(i=FistOfSide[!tside];i<=LastOfSide[!tside];i++)
  1228. {
  1229. if(v4[i]<0 && v1[i]>j)
  1230. j=v1[i];
  1231. }
  1232. maxvalue +=j;
  1233. }
  1234. }
  1235. _ENDSUB: tmanx[man]=xs; //这两行是:
  1236. tmany[man]=ys; //在face上的恢复
  1237. tmap[xs][ys]=man; //在map上的恢复
  1238. if(ate!=32)
  1239. {
  1240. tmanx[ate]=tx;
  1241. tmany[ate]=ty;
  1242. tmap[tx][ty]=ate;
  1243. }
  1244. else tmap[tx][ty]=32;
  1245. tside=!tside;
  1246. tdeep--;
  1247. return -maxvalue;
  1248. }
  1249. BOOL CThinker::LoadThinkSetting()
  1250. {
  1251. CFile file;
  1252. if(file.Open( "Thinker.set",CFile::modeRead))
  1253. {
  1254. file.SeekToBegin();
  1255. file.Read(BV1,7*sizeof(int));
  1256. file.Read(BV2,7*sizeof(int));
  1257. file.Read(BV3,5*sizeof(int));
  1258. file.Close();
  1259. if(BVIsNormal())return TRUE;
  1260. else
  1261. {
  1262. ResetBV();
  1263. SaveThinkSetting();
  1264. return FALSE;
  1265. }
  1266. }
  1267. MessageBox(NULL, "没找到 Thinker.set 文件nn这个文件并不是必需的,但它记录了你的设置内容,nn请不要删掉nn你现在可以通过菜单 "文件" -> "参数" 重新设定.","提醒",MB_OK|MB_ICONINFORMATION);
  1268. ResetBV();
  1269. SaveThinkSetting();
  1270. return FALSE;
  1271. }
  1272. void CThinker::ResetBV()
  1273. {
  1274. BV1[0]=0; BV2[0]=0;
  1275. BV1[1]=250; BV2[1]=1;
  1276. BV1[2]=250; BV2[2]=1;
  1277. BV1[3]=300; BV2[3]=12;
  1278. BV1[4]=400; BV2[4]=6;
  1279. BV1[5]=300; BV2[5]=6;
  1280. BV1[6]=100; BV2[6]=15;
  1281. BV3[0]=0;
  1282. BV3[1]=70;
  1283. BV3[2]=90;
  1284. BV3[3]=110;
  1285. BV3[4]=120;
  1286. }
  1287. BOOL CThinker::BVIsNormal()
  1288. {
  1289. int i;
  1290. for(i=0;i<=6;i++)
  1291. {
  1292. if(BV1[i]<0||BV1[i]>1000||BV2[i]<0||BV2[i]>1000)return FALSE;
  1293. }
  1294. for(i=0;i<=4;i++)
  1295. {
  1296. if(BV3[i]<0||BV3[i]>1000)return FALSE;
  1297. }
  1298. return TRUE;
  1299. }
  1300. BOOL CThinker::SaveThinkSetting()
  1301. {
  1302. CFile file;
  1303. if(file.Open("Thinker.set",CFile::modeWrite|CFile::modeCreate))
  1304. {
  1305. file.SeekToBegin();
  1306. file.Write(BV1,7*sizeof(int));
  1307. file.Write(BV2,7*sizeof(int));
  1308. file.Write(BV3,5*sizeof(int));
  1309. file.Close();
  1310. return TRUE;
  1311. }
  1312. else return FALSE;
  1313. }