Game.cpp
上传用户:kkzhu_0
上传日期:2007-01-05
资源大小:214k
文件大小:28k
源码类别:

棋牌游戏

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////////////
  2. // 五子棋分析程序:
  3. //   1996.4-1997.11  刘国辉
  4. /////////////////////////////////////////////////////////////////////////////////////
  5. //  说明:
  6. // ~~~~~~~
  7. //  约定:
  8. // ~~~~~~~
  9. //  ‘W' 代表白棋
  10. //   'B' 代表黑棋
  11. //   'N' 代表空地
  12. //(1)平分函数:
  13. // ~~~~~~~~~~~~~~
  14. //  int Dump( int x,int Wf )
  15. //  X   在一条线上的子数
  16. //  WF    = 1 两边都没有被堵住  例如   NNWWWNB..
  17. //   = 0 一边被堵住               BWWWNNW..
  18. //   = 2 跨越式的                 WWWNW..
  19. // 返回一个分数
  20. //(2)线扫描函数:
  21. // ~~~~~~~~~~~~~~~~
  22. //  int SreachLine( char *FLine,int M,int MF )
  23. //  FLine 线指针,指向一个字符串    NNNWWWBWWWN...
  24. //  M     字符个数
  25. //  WF ='W'或'B'表示对黑或白进行平分
  26. // 返回一个分数
  27. // (3)面扫描函数:
  28. // ~~~~~~~~~~~~~~~
  29. // long SreachArea( char *Area[15],int M,char WF )
  30. //  ....
  31. /////////////////////////////////////////////////////////////////////////////////////
  32. #include "game.h"
  33. #include <stdlib.h>  // For rand()
  34. /////////////////////////////////////////////////////////////////////////////////////
  35. // 静态成员初始化
  36. // ~~~~~~~~~~~~~~~
  37. int CFive::WF1_1;
  38. int CFive::WF1_2;
  39. int CFive::WF1_3;
  40. int CFive::WF1_4;
  41. int CFive::WF0_1;
  42. int CFive::WF0_2;
  43. int CFive::WF0_3;
  44. int CFive::WF0_4;
  45. int CFive::WF2_3;
  46. int CFive::WF2_4;
  47. int CFive::WF5;
  48. int CFive::DeepMax;
  49. int CFive::BreadthMax;
  50. int CFive::Delta;
  51. int CFive::ThreadDeepMax;
  52. char CFive::Side;
  53. BOOL CFive::PlayStateFlags;
  54. int  CFive::PlayIndex;
  55. char CFive::FiveArea[FIVE_MAX_LINE][FIVE_MAX_LINE];
  56. CList<Step,Step>   CFive::StepList;
  57. CList<Count,Count> CFive::OneCountList;
  58. CArray<int,int>    CFive::ImpList;
  59. CEvent             CFive::KillWzqRun(FALSE,TRUE);
  60. CStatusBar*        CFive::pInfo;
  61. long        CFive::MemoryCount;
  62. int         CFive::ThreadCount;
  63. long        CFive::JingDuCount;
  64. Count       CFive::PiShen;
  65. /////////////////////////////////////////////////////////////////////////////////////
  66. // 顺序化
  67. // ~~~~~~
  68. IMPLEMENT_SERIAL( CFive, CWinThread, 1 )
  69. /////////////////////////////////////////////////////////////////////////////////////
  70. // 构造与析构
  71. // ~~~~~~~~~~~
  72. CFive::CFive():EndEvent( FALSE,TRUE )
  73. {
  74. m_bAutoDelete = FALSE; // 不自动删除CWinThread对象
  75. CurDeep       = DeepMax;
  76. CurBreadth    = BreadthMax;
  77. CurThreadDeep = ThreadDeepMax;
  78. CurSide       = Side;
  79. CurCount      = 0;
  80. PlayStateFlags= FALSE;
  81. }
  82. CFive::CFive( char side,int deep,int breadth,int threaddeep ):EndEvent( FALSE,TRUE )
  83. {
  84.     m_bAutoDelete = FALSE; // 不自动删除CWinThread对象
  85. CurSide = (side == 'B'?'W':'B');
  86. CurDeep       = deep - 1;
  87. if( CurDeep < 0 )
  88. CurDeep = -1;
  89. CurThreadDeep = threaddeep - 1;
  90. if( CurThreadDeep < 0 )
  91. CurThreadDeep = -1;
  92. if( CurSide == Side )
  93. CurBreadth    = BreadthMax - (DeepMax-CurDeep)*Delta;
  94. else
  95. CurBreadth = 1;
  96. if( CurBreadth < 0 )
  97. CurBreadth = -1;
  98. if( CurThreadDeep < 0 )
  99. CurThreadDeep = -1;
  100. CurCount = 0;
  101. }
  102. CFive::~CFive()
  103. {
  104. }
  105. ////////////////////////////////////////////////////////////////////////////////////
  106. // 初始化
  107. // ~~~~~~
  108. void CFive::WzqInit( char side,BOOL flags )
  109. {
  110. int i,j;
  111.     
  112. Side          = side;
  113. CurSide       = side;
  114. CurDeep       = DeepMax;
  115. CurBreadth    = BreadthMax;
  116. CurThreadDeep = ThreadDeepMax;
  117. PlayStateFlags= FALSE;
  118.     PiShen.count  = WZQ_YOU;
  119. StepList.RemoveAll();
  120. for( i = 0;i < FIVE_MAX_LINE;i++ )
  121. for( j = 0;j < FIVE_MAX_LINE;j++ )
  122.      FiveArea[i][j] = 'N';
  123. if( flags == FALSE )
  124. {
  125. Step temp;
  126. int mx,my;
  127. mx = FIVE_MAX_LINE/2 -2;
  128. my = mx;
  129. mx += rand()%4;
  130. my += rand()%4;
  131. FiveArea[mx][my] = Side;
  132. temp.side = Side;
  133. temp.m    = mx;
  134. temp.n    = my;
  135. StepList.AddTail(temp);
  136. }
  137. }
  138. void CFive::SetInfo( CStatusBar*p)
  139. {
  140. pInfo = p;
  141. }
  142. void CFive::SetParam( int breadth,int deep,int thread,int delta )
  143. {
  144. BreadthMax    = breadth;
  145. DeepMax       = deep;
  146. ThreadDeepMax = thread;
  147. Delta         = delta;
  148. }
  149. void CFive::GetParam( int& breadth,int& deep,int& thread,int& delta )
  150. {
  151. breadth = BreadthMax;
  152. deep    = DeepMax;
  153. thread  = ThreadDeepMax;
  154. delta   = Delta;
  155. }
  156. char CFive::GetSide()
  157. {
  158. return Side;
  159. }
  160. char CFive::GetSubPosition( int m,int n )
  161. {
  162. if( m >=0&&n>=0&&m<FIVE_MAX_LINE&&n<FIVE_MAX_LINE )
  163. return FiveArea[m][n];
  164. else
  165. return 'E';
  166. }
  167. int CFive::Dump( int x ,int Wf )
  168. if( Wf == 1 )
  169. {
  170. switch(x)
  171. {
  172. case 1:return WF0_1;
  173. case 2:return WF0_2;
  174. case 3:return WF0_3;
  175. case 4:return WF0_4;
  176. }
  177. }
  178. else if( Wf == 0 )
  179. {
  180. switch(x)
  181. {
  182. case 1:return WF1_1;
  183. case 2:return WF1_2;
  184. case 3:return WF1_3;
  185. case 4:return WF1_4;
  186. }
  187. }
  188. else if( Wf == 2 )
  189. if( x == 4 )
  190. return WF2_4;
  191. if( x == 3 )
  192. return WF2_3;
  193. }
  194.   if( x == 5 )
  195. {
  196. return WF5;
  197. }
  198.   return -1;
  199. }
  200. int CFive::GetDump( int x,int Wf )
  201. {
  202. return Dump( x,Wf );
  203. }
  204. void CFive::SetDump( int x ,int Wf,int c )
  205. if( Wf == 0 )
  206. {
  207. switch(x)
  208. {
  209. case 1:
  210. WF1_1 = c;
  211. return;
  212. case 2:
  213. WF1_2 = c;
  214. return;
  215. case 3:
  216. WF1_3 = c;
  217. return;
  218. case 4:
  219. WF1_4 = c;
  220. return;
  221. }
  222. }
  223. else if( Wf == 1 )
  224. {
  225. switch(x)
  226. {
  227. case 1:
  228. WF0_1 = c;
  229. return;
  230. case 2:
  231. WF0_2 = c;
  232. return;
  233. case 3:
  234. WF0_3 = c;
  235. return;
  236. case 4:
  237. WF0_4 = c;
  238. return;
  239. }
  240. }
  241. else if( Wf == 2 )
  242. if( x == 4 )
  243. {WF2_4 = c;
  244. return;
  245. }
  246. if( x == 3 )
  247. {
  248. WF2_3 = c;
  249. return;
  250. }
  251. }
  252. if( x == 5 )
  253. {
  254. WF5 = c;
  255. return;
  256. }
  257. }
  258. void CFive::KillWzqThread()
  259. {
  260. Step step;
  261. KillWzqRun.SetEvent();
  262. EndEvent.Lock();
  263. WaitForSingleObject( m_hThread,INFINITE );
  264. KillWzqRun.ResetEvent();
  265. step = StepList.GetTail();
  266. StepList.RemoveTail();
  267. FiveArea[step.m][step.n] = 'N';
  268. }
  269. void CFive::NoKillThread()
  270. {
  271. KillWzqRun.ResetEvent();
  272. }
  273. BOOL CFive::HuiOneStep()
  274. {
  275. Step step0,step1;
  276. if( StepList.IsEmpty() )
  277. return FALSE;
  278. step0 = StepList.RemoveTail();
  279. if( StepList.IsEmpty() )
  280. {
  281. StepList.AddTail( step0 );
  282. return FALSE;
  283. }
  284. step1 = StepList.RemoveTail();
  285. FiveArea[step0.m][step0.n] = 'N';
  286. FiveArea[step1.m][step1.n] = 'N';
  287. return TRUE;
  288. }
  289. BOOL CFive::BackEndStep()
  290. {
  291. PlayStateFlags = TRUE;
  292. if( PlayIndex == 0 )
  293. return FALSE;
  294. PlayIndex      = 0;
  295. UpdatePlay();
  296. return TRUE;
  297. }
  298. BOOL CFive::OneStep()
  299. {
  300. PlayStateFlags = TRUE;
  301. if( PlayIndex >= StepList.GetCount() )
  302. return FALSE;
  303. PlayIndex      = StepList.GetCount();
  304. UpdatePlay();
  305. return TRUE;
  306. }
  307. BOOL CFive::BackOneStep()
  308. {
  309. PlayStateFlags = TRUE;
  310. if( PlayIndex > 0 )
  311. {
  312. PlayIndex--;
  313. UpdatePlay();
  314. return TRUE;
  315. }
  316. return FALSE;
  317. }
  318. BOOL CFive::FowardOneStep()
  319. {
  320. PlayStateFlags = TRUE;
  321. if( PlayIndex < StepList.GetCount() )
  322. {
  323. PlayIndex++;
  324. UpdatePlay();
  325. return TRUE;
  326. }
  327. return FALSE;
  328. }
  329. void CFive::UpdatePlay()
  330. {
  331. int i,j;
  332. POSITION pos;
  333. Step step;
  334. for( i = 0;i<FIVE_MAX_LINE;i++ )
  335. for( j = 0;j<FIVE_MAX_LINE;j++ )
  336. FiveArea[i][j] = 'N';
  337. pos = StepList.GetHeadPosition();
  338. i = 0;
  339. while( pos )
  340. {
  341. if( PlayIndex == i )
  342. break;
  343. step = StepList.GetNext(pos);
  344. FiveArea[step.m][step.n] = step.side;
  345. i++;
  346. }
  347. }
  348. void CFive::InListBox( CComboBox& box )
  349. {
  350. POSITION pos;
  351. Step     step;
  352. int      i;
  353. TCHAR    Info[50];
  354. TCHAR    *format = _TEXT("%d.%s  (%d,%d)");
  355. TCHAR    *b = _TEXT("黑");
  356. TCHAR    *w = _TEXT("白");
  357. pos = StepList.GetHeadPosition();
  358. box.ResetContent();
  359. i = 0;
  360. while( pos )
  361. {
  362. step = StepList.GetNext(pos);
  363. i++;
  364. if( step.side == 'W' )
  365. wsprintf(Info,format,i,w,step.m,step.n );
  366. else
  367. wsprintf(Info,format,i,b,step.m,step.n );
  368. box.AddString( Info );
  369. }
  370. }
  371. ///////////////////////////////////////////////////////////////////////////////////////////
  372. // 平分机制
  373. // ~~~~~~~~~
  374. long CFive::SreachLine( char *Fline,int M,char Nf )
  375.  { 
  376. char Wf;
  377. int  i = 0;
  378. int  j = 0;
  379. int  n = 0;
  380. int  k = 0;
  381. long count = 0;
  382. if( Nf == 'B' )
  383. Wf = 'W';
  384. else 
  385. Wf = 'B';
  386. while( M - j >= 5 )
  387. while( Fline[ i+j ] != Wf && i+j < M )
  388. i++;
  389. if( i > 4 )
  390. for( k = 0; k < i; k++ )
  391. {
  392. n = 0;
  393. while( Fline[ j+k ] == Nf && k < i )
  394. n++;
  395. k++; 
  396. }
  397. if( n )
  398. if( n > 4 )
  399. return -1;              //发现5子
  400. if( n == k || k == i )
  401. Wf = 0;
  402. else
  403. Wf = 1;
  404. if( n == 2 && Wf == 1 )
  405. if((k+1<i&&Fline[ j+k+1 ] == Nf)||( k>3&&Fline[ j+k-4 ]==Nf))
  406.        { 
  407.      n++;
  408.          Wf = 2;
  409.        }
  410. if( n == 3 && Wf == 0 )
  411. if((k+1<i&&Fline[ j+k+1 ] == Nf)||( k>4&&Fline[ j+k-5 ]==Nf))
  412.        { 
  413.      n++;
  414.  Wf = 2; 
  415.        }
  416. count = count + Dump( n , Wf );
  417. }
  418. }
  419. }
  420. j = j + i + 1;
  421. i = 0;
  422. }
  423. return count;
  424.  }
  425. long CFive::SreachArea( char Area[][FIVE_MAX_LINE],char Nf )
  426.  { 
  427. int i,j,cbak;
  428. long count = 0;
  429. char Fline[FIVE_MAX_LINE];
  430. for( i = 0; i < FIVE_MAX_LINE; i++ )
  431. for( j = 0; j < FIVE_MAX_LINE; j++ )
  432. Fline[j] = Area[i][j];
  433. cbak = SreachLine( Fline,FIVE_MAX_LINE,Nf );
  434. if( cbak == -1 )
  435. return -1;
  436. else 
  437. count = count + (long)cbak;
  438. }
  439.  for( i = 0; i < FIVE_MAX_LINE; i++ )
  440.  { 
  441.  for( j = 0; j < FIVE_MAX_LINE; j++ )
  442.  Fline[j] = Area[j][i];
  443.  cbak = SreachLine( Fline,FIVE_MAX_LINE,Nf );
  444.  if( cbak == -1 )
  445.  return -1;
  446.  else 
  447.  count = count + (long)cbak;
  448.  }
  449.  for( i = 0; i < FIVE_MAX_LINE - 4; i++ )
  450.   { 
  451.  for( j = 0; j < FIVE_MAX_LINE - i; j++ )
  452.  Fline[j] = Area[i+j][j];
  453.  cbak = SreachLine( Fline, FIVE_MAX_LINE-i, Nf );
  454.  if( cbak == -1 )
  455.  return -1;
  456.  else count = count + (long)cbak;
  457.  }
  458.  for( i = FIVE_MAX_LINE-1; i > 3; i-- )
  459.  { 
  460.  for( j = 0; j < i+1; j++ )
  461.  Fline[j] = Area[i-j][j];
  462.  cbak = SreachLine( Fline, i+1, Nf );
  463.  if( cbak == -1 )
  464.  return -1;
  465.  else 
  466.  count = count + (long)cbak;
  467.  }
  468.  for( i = 0; i < FIVE_MAX_LINE - 5; i++ )
  469.   { 
  470.  for( j = 0; j < FIVE_MAX_LINE - i; j++ )
  471.  Fline[j] = Area[i+j][FIVE_MAX_LINE-j];
  472.  cbak = SreachLine( Fline, FIVE_MAX_LINE-i, Nf );
  473.  if( cbak == -1 )
  474.  return -1;
  475.  else 
  476.  count = count + (long)cbak;
  477.   }
  478.  for( i = FIVE_MAX_LINE-1; i > 4; i-- )
  479.   { 
  480.  for( j = 0; j < i+1; j++ )
  481.  Fline[j] = Area[i-j][FIVE_MAX_LINE-j];
  482.  cbak = SreachLine( Fline, i+1, Nf );
  483.  if( cbak == -1 )
  484.  return -1;
  485.  else 
  486.  count = count + (long)cbak;
  487.   }
  488.  return count;
  489.  }
  490. ////////////////////////////////////////////////////////////////////////////////////////////
  491. // 在Call WzqRun前Call WzqTest以测试当前情况
  492. int CFive::WzqTest( int m,int n )
  493. {
  494. char Nf,Mf;
  495. int  i,j;
  496. Step step_temp;
  497. Nf = Side;
  498. MemoryCount = 0;
  499. ThreadCount = 0;
  500. JingDuCount = 0;
  501. if( PlayStateFlags == TRUE )
  502. {
  503. PlayStateFlags= FALSE;
  504. ResumePlayState();
  505. return WZQ_HAVE;
  506. }
  507. if( Nf == 'B' )
  508. Mf = 'W';
  509. else if( Nf == 'W' )
  510. Mf = 'B';
  511. else
  512. return WZQ_ERROR;
  513. for( i = 0;i<FIVE_MAX_LINE;i++ )
  514. for( j = 0;j<FIVE_MAX_LINE;j++ )
  515.         if( FiveArea[i][j] == 'N' )
  516.     goto NO_PING;
  517. return WZQ_PING;
  518. NO_PING:
  519. if( m < 0||m >= FIVE_MAX_LINE||n < 0||n >= FIVE_MAX_LINE )
  520. return WZQ_HAVE;
  521. if( FiveArea[m][n] != 'N' )
  522. return WZQ_HAVE;
  523. if( SreachArea( FiveArea,Nf ) == -1 )
  524. return WZQ_I;
  525. if( SreachArea( FiveArea,Mf ) == -1 )
  526. return WZQ_YOU;
  527. FiveArea[m][n] = (Side == 'W'?'B':'W');
  528. step_temp.side = (Side == 'W'?'B':'W');
  529. step_temp.m = m;
  530. step_temp.n = n;
  531. StepList.AddTail( step_temp );
  532. PlayIndex = StepList.GetCount();
  533. if( SreachArea( FiveArea,Nf ) == -1 )
  534. return WZQ_I;
  535. if( SreachArea( FiveArea,Mf ) == -1 )
  536. return WZQ_YOU;
  537. return WZQ_RUN;
  538. }
  539. int CFive::WzqEndTest()
  540. {
  541. char Nf,Mf;
  542. int i,j;
  543. Nf = Side;
  544. MemoryCount = 0;
  545. ThreadCount = 0;
  546. JingDuCount = 0;
  547. if( Nf == 'B' )
  548. Mf = 'W';
  549. else if( Nf == 'W' )
  550. Mf = 'B';
  551. else
  552. return WZQ_ERROR;
  553. if( SreachArea( FiveArea,Nf ) == -1 )
  554. return WZQ_I;
  555. if( SreachArea( FiveArea,Mf ) == -1 )
  556. return WZQ_YOU;
  557. for( i = 0;i<FIVE_MAX_LINE;i++ )
  558. for( j = 0;j<FIVE_MAX_LINE;j++ )
  559.         if( FiveArea[i][j] == 'N' )
  560.     goto NO_PING;
  561. return WZQ_PING;
  562. NO_PING:
  563. return WZQ_RUN;
  564. }
  565. BOOL CFive::BiTest( int& mm,int& nn )
  566. {
  567. int i,j;
  568. char Mf;
  569. Mf = (Side =='B'?'W':'B');
  570. for( i=0;i<FIVE_MAX_LINE;i++ )
  571. for( j=0;j<FIVE_MAX_LINE;j++ )
  572. {
  573. if( FiveArea[i][j] == 'N' )
  574. {
  575. FiveArea[i][j] = Side;
  576. if( SreachArea( FiveArea,Side ) == -1 )
  577. {
  578. Step step;
  579. mm = i;
  580. nn = j;
  581. step.m = mm;
  582. step.n = nn;
  583. step.side = Side;
  584. StepList.AddTail( step ); 
  585. return TRUE;
  586. }
  587. FiveArea[i][j] = 'N';
  588. }
  589. }
  590. for( i=0;i<FIVE_MAX_LINE;i++ )
  591. for( j=0;j<FIVE_MAX_LINE;j++ )
  592. {
  593. if( FiveArea[i][j] == 'N' )
  594. {
  595. FiveArea[i][j] = Mf;
  596. if( SreachArea( FiveArea,Mf ) == -1 )
  597. {
  598. Step step;
  599. FiveArea[i][j] = Side;
  600. mm = i;
  601. nn = j;
  602. step.m = mm;
  603. step.n = nn;
  604. step.side = Side;
  605. StepList.AddTail( step );
  606. return TRUE;
  607. }
  608. FiveArea[i][j] = 'N';
  609. }
  610. }
  611. return FALSE;
  612. }
  613. void CFive::ResumePlayState()
  614. {
  615. int i,j;
  616. POSITION pos;
  617. Step step_temp;
  618. for( i=0;i<FIVE_MAX_LINE;i++ )
  619. for( j=0;j<FIVE_MAX_LINE;j++ )
  620. FiveArea[i][j] = 'N';
  621. pos = StepList.GetHeadPosition();
  622. while(pos)
  623. {
  624. step_temp = StepList.GetNext(pos);
  625. FiveArea[step_temp.m][step_temp.n] = step_temp.side;
  626. }
  627. }
  628. int CFive::WzqRun( int &mm, int &nn )
  629. {
  630. int m,n;
  631. double max_count;
  632. Count  temp;
  633. Step   step_temp;
  634. POSITION pos;
  635. m = mm;
  636. n = nn;
  637.     PiShen.count = WZQ_YOU;
  638. if( m < 0||m >= FIVE_MAX_LINE||n < 0||n >= FIVE_MAX_LINE )
  639. return WZQ_HAVE;
  640. // if( FiveArea[m][n] != 'N' )
  641. // return WZQ_HAVE;
  642. if( BiTest( mm,nn ) == FALSE )
  643. {
  644. OneCountList.RemoveAll();
  645. CreateThread();
  646. //------------------------------------------------
  647. // EndEvent.Lock();
  648. // WaitForSingleObject( m_hThread,INFINITE );
  649. // if( OneCountList.IsEmpty() )
  650. // return WZQ_ERROR;
  651. //
  652. // temp = OneCountList.GetHead();
  653. // max_count = temp.count;
  654. // mm = temp.step.m;
  655. // nn = temp.step.n;
  656. //
  657. // pos = OneCountList.GetHeadPosition();
  658. // while( pos != NULL )
  659. // {
  660. // temp = OneCountList.GetNext( pos );
  661. // if( temp.count > max_count )
  662. // {
  663. // max_count = temp.count;
  664. // mm = temp.step.m;
  665. // nn = temp.step.n;
  666. // }
  667. // }
  668. //----------------------------------------------------
  669. }
  670. else
  671. return WZQ_NOTHREAD;
  672. //----------------------------------------------------
  673. // if( mm == m&&nn == n )
  674. // return WZQ_ERROR;
  675. // FiveArea[mm][nn] = Side;
  676. // step_temp.side = Side;
  677. // step_temp.m    = mm;
  678. // step_temp.n    = nn;
  679. // StepList.AddTail( step_temp );
  680. // PlayIndex = StepList.GetCount();
  681. //-----------------------------------------------------
  682. return WZQ_RUN;
  683. }
  684. int CFive::GetCurStep(int &mm,int &nn)
  685. {
  686. int m,n;
  687. POSITION pos;
  688. double   max_count;
  689. Count  temp;
  690. Step   step_temp;
  691.     if( PiShen.count == WZQ_I )
  692. {
  693. step_temp = PiShen.step;
  694. mm = PiShen.step.m;
  695. nn = PiShen.step.n;
  696. step_temp.side = Side;
  697. FiveArea[mm][nn] = Side;
  698. StepList.AddTail( step_temp );
  699. PlayIndex = StepList.GetCount();
  700. return WZQ_RUN;
  701. }
  702. ////////////////////////////////////////////////////////////////////////////////
  703. // if( OneCountList.IsEmpty() )
  704. // return WZQ_ERROR;
  705. ////////////////////////////////////////////////////////////////////////////////
  706. if( CountList.IsEmpty() )
  707. return WZQ_ERROR;
  708. // temp = OneCountList.GetHead();
  709. temp = CountList.GetHead();
  710. max_count = temp.count;
  711. mm = temp.step.m;
  712. nn = temp.step.n;
  713. ///////////////////////////////////////////////////////////////////////////////
  714. // pos = OneCountList.GetHeadPosition();
  715. // while( pos != NULL )
  716. // {
  717. // temp = OneCountList.GetNext( pos );
  718. // if( temp.count > max_count )
  719. // {
  720. // max_count = temp.count;
  721. // mm = temp.step.m;
  722. // nn = temp.step.n;
  723. // }
  724. // }
  725. //////////////////////////////////////////////////////////////////////////////
  726. pos = CountList.GetHeadPosition();
  727. while( pos != NULL )
  728. {
  729. temp = CountList.GetNext( pos );
  730. if( temp.count > max_count )
  731. {
  732. max_count = temp.count;
  733. mm = temp.step.m;
  734. nn = temp.step.n;
  735. }
  736. }
  737. if( mm == m&&nn == n )
  738. return WZQ_ERROR;
  739. FiveArea[mm][nn] = Side;
  740. step_temp.side = Side;
  741. step_temp.m    = mm;
  742. step_temp.n    = nn;
  743. StepList.AddTail( step_temp );
  744. PlayIndex = StepList.GetCount();
  745. return WZQ_RUN;
  746. }
  747. void CFive::Serialize( CArchive& ar )
  748. {
  749. int i,j;
  750. BYTE flags0,flags1;
  751. if (ar.IsStoring())
  752. {
  753. // TODO: add storing code here
  754. ar<<(BYTE)0xfa;
  755. ar<<(BYTE)0x5e;
  756. ar<<WF0_1;
  757. ar<<WF0_2;
  758. ar<<WF0_3;
  759. ar<<WF0_4;
  760. ar<<WF1_1;
  761. ar<<WF1_2;
  762. ar<<WF1_3;
  763. ar<<WF1_4;
  764. ar<<WF2_3;
  765. ar<<WF2_4;
  766. ar<<WF5;
  767. ar<<BreadthMax;
  768. ar<<DeepMax;
  769. ar<<ThreadDeepMax;
  770. ar<<Delta;
  771. ar<<Side;
  772. for( i = 0;i<FIVE_MAX_LINE;i++ )
  773. for( j = 0;j<FIVE_MAX_LINE;j++ )
  774.    ar<<FiveArea[i][j];
  775.         StepList.Serialize( ar );
  776. ImpList.Serialize( ar );
  777. ar<<PlayStateFlags;
  778. ar<<PlayIndex;
  779. }
  780. else
  781. {
  782. // TODO: add loading code here
  783. ar>>flags0;
  784. ar>>flags1;
  785. if( flags0!=0xfa||flags1!=0x5e)
  786.      AfxThrowFileException(CFileException::accessDenied);
  787. StepList.RemoveAll();
  788. ar>>WF0_1;
  789. ar>>WF0_2;
  790. ar>>WF0_3;
  791. ar>>WF0_4;
  792. ar>>WF1_1;
  793. ar>>WF1_2;
  794. ar>>WF1_3;
  795. ar>>WF1_4;
  796. ar>>WF2_3;
  797. ar>>WF2_4;
  798. ar>>WF5;
  799. ar>>BreadthMax;
  800. ar>>DeepMax;
  801. ar>>ThreadDeepMax;
  802. ar>>Delta;
  803. ar>>Side;
  804. for( i = 0;i<FIVE_MAX_LINE;i++ )
  805. for( j = 0;j<FIVE_MAX_LINE;j++ )
  806.    ar>>FiveArea[i][j];
  807.         StepList.Serialize( ar );
  808. ImpList.Serialize( ar );
  809. ar>>PlayStateFlags;
  810. ar>>PlayIndex;
  811. if( PlayStateFlags == TRUE )
  812. UpdatePlay();
  813. }
  814. }
  815. ////////////////////////////////////////////////////////////////////////////////////////////
  816. // 抽象平分函数
  817. // ~~~~~~~~~~~~~
  818. // Nf ----------对那一方平分'B'或'W'
  819. // level--------方法COUNT_INC,COUNT_SUB,COUNT_MID
  820. ///////////////////////////////////////////////////////////////////////////////////////////
  821. void CFive::CalRun( char Nf,LEVE leve )
  822. {
  823. if( CurBreadth <= 0 )
  824. return;
  825. MemoryCount++;
  826. JingDuCount++;
  827. char     Mf;
  828. int      i,j,num;
  829. double   Ncount,Mcount,TempCount,TempCount1,wf5temp;
  830. Count    *pCount,temp;
  831. char     Area[FIVE_MAX_LINE][FIVE_MAX_LINE];
  832. POSITION pos;
  833. Step     steptemp;
  834. Mf = ( Nf == 'B'?'W':'B');
  835. pCount = new Count[CurBreadth];
  836. for( i = 0;i < CurBreadth;i++ )
  837. {
  838. pCount[i].count = -9999999;
  839. pCount[i].step.side = 'E';
  840. }
  841. for( i = 0;i < FIVE_MAX_LINE;i++ )
  842. for( j = 0;j < FIVE_MAX_LINE;j++ )
  843.     Area[i][j] = FiveArea[i][j];        //复制FiveArea数组
  844.     pos = DeepList.GetHeadPosition( );
  845. while(pos != NULL)
  846. {
  847. steptemp = DeepList.GetNext(pos);
  848. Area[steptemp.m][steptemp.n] = steptemp.side;
  849. }
  850. switch( leve )
  851. {
  852. case COUNT_INC:
  853. Ncount = SreachArea( Area,Nf );
  854. for( i = 0;i < FIVE_MAX_LINE;i++ )
  855. {
  856. for( j = 0;j < FIVE_MAX_LINE;j++ )
  857. {
  858.     if( Area[i][j] == 'N' )
  859. {
  860. Area[i][j] = Nf;
  861. wf5temp = SreachArea( Area,Nf );
  862. if( wf5temp == -1 )
  863. wf5temp = 2*Dump( 5,10 ) + Ncount;
  864. TempCount = wf5temp - Ncount;
  865. if( TempCount > pCount[0].count )
  866. {
  867. pCount[0].count     = TempCount;
  868. pCount[0].step.side = Nf;
  869. pCount[0].step.m    = i;
  870. pCount[0].step.n    = j;
  871. for( num = 1;num < CurBreadth;num++ )
  872. if( pCount[0].count > pCount[num].count )
  873.       {
  874.      temp = pCount[num];
  875.  pCount[num] = pCount[0];
  876.  pCount[0] = temp;
  877.       }
  878. }
  879. Area[i][j] = 'N';
  880. }
  881. }
  882. }
  883. break;
  884. case COUNT_SUB:
  885. Mcount = SreachArea( Area,Mf );
  886. for( i = 0;i < FIVE_MAX_LINE;i++ )
  887. {
  888. for( j = 0;j < FIVE_MAX_LINE;j++ )
  889. {
  890.     if( Area[i][j] == 'N' )
  891. {
  892. Area[i][j] = Nf;
  893. TempCount = Mcount - SreachArea( Area,Mf );
  894. if( TempCount > pCount[0].count )
  895. {
  896. pCount[0].count     = TempCount;
  897. pCount[0].step.side = Nf;
  898. pCount[0].step.m    = i;
  899. pCount[0].step.n    = j;
  900. for( num = 1;num < CurBreadth;num++ )
  901. if( pCount[0].count > pCount[num].count )
  902.       {
  903.      temp = pCount[num];
  904.  pCount[num] = pCount[0];
  905.  pCount[0] = temp;
  906.       }
  907. }
  908. Area[i][j] = 'N';
  909. }
  910. }
  911. }
  912. break;
  913. case COUNT_MID:
  914. Mcount = SreachArea( Area,Mf );
  915. Ncount = SreachArea( Area,Nf );
  916. for( i = 0;i < FIVE_MAX_LINE;i++ )
  917. {
  918. for( j = 0;j < FIVE_MAX_LINE;j++ )
  919. {
  920.     if( Area[i][j] == 'N' )
  921. {
  922. Area[i][j] = Nf;
  923. wf5temp = SreachArea( Area,Nf );
  924. if( wf5temp == -1 )
  925. wf5temp = Ncount + 2*Dump( 5,10 );
  926. TempCount1 = wf5temp - Ncount;
  927. TempCount = Mcount - SreachArea( Area,Mf );
  928. TempCount = TempCount + TempCount1;
  929. if( TempCount > pCount[0].count )
  930. {
  931. pCount[0].count     = TempCount;
  932. pCount[0].step.side = Nf;
  933. pCount[0].step.m    = i;
  934. pCount[0].step.n    = j;
  935. for( num = 1;num < CurBreadth;num++ )
  936. if( pCount[0].count > pCount[num].count )
  937.       {
  938.      temp = pCount[num];
  939.  pCount[num] = pCount[0];
  940.  pCount[0] = temp;
  941.       }
  942. }
  943. Area[i][j] = 'N';
  944. }
  945. }
  946. }
  947. break;
  948. case COUNT_ALPHA:
  949. Mcount = SreachArea( Area,Mf );
  950. Ncount = SreachArea( Area,Nf );
  951. for( i = 0;i<FIVE_MAX_LINE;i++ )
  952. for( j = 0;j<FIVE_MAX_LINE;j++ )
  953. {
  954. if( Area[i][j] == 'N' )
  955. {
  956. Area[i][j] = Mf;
  957. wf5temp = SreachArea( Area,Mf );
  958. if( wf5temp == -1 )
  959. {
  960. wf5temp = Mcount + 2*Dump( 5,10 );
  961. if( Mf == Side )
  962. {
  963. Step le;
  964. if( !DeepList.IsEmpty() )
  965. {
  966. le = DeepList.GetHead();
  967.     PiShen.step = le;
  968.     PiShen.count = WZQ_I;
  969. }
  970. }
  971. }
  972.                 TempCount = wf5temp - Mcount;
  973. Area[i][j] = Nf;
  974. wf5temp = SreachArea( Area,Nf );
  975. if( wf5temp == -1 )
  976. {
  977. wf5temp = Ncount + 2*Dump( 5,10 );
  978. if( Nf == Side )
  979. {
  980. Step le;
  981. if( !DeepList.IsEmpty() )
  982. {
  983. le = DeepList.GetHead();
  984.     PiShen.step = le;
  985.     PiShen.count = WZQ_I;
  986. }
  987. }
  988. }
  989. TempCount += wf5temp - Ncount;
  990. if( TempCount > pCount[0].count )
  991. {
  992. pCount[0].count     = TempCount;
  993. pCount[0].step.side = Nf;
  994. pCount[0].step.m    = i;
  995. pCount[0].step.n    = j;
  996. for( num = 1;num < CurBreadth;num++ )
  997. if( pCount[0].count > pCount[num].count )
  998. {
  999. temp = pCount[num];
  1000. pCount[num] = pCount[0];
  1001. pCount[0] = temp;
  1002. }
  1003. }
  1004. Area[i][j] = 'N';
  1005. }
  1006. }
  1007. break;
  1008. case COUNT_DELTA:
  1009. Mcount = SreachArea( Area,Mf );
  1010. Ncount = SreachArea( Area,Nf );
  1011. for( i = 0;i<FIVE_MAX_LINE;i++ )
  1012. for( j = 0;j<FIVE_MAX_LINE;j++ )
  1013. {
  1014. if( Area[i][j] == 'N' )
  1015. {
  1016. Area[i][j] = Mf;
  1017. wf5temp = SreachArea( Area,Mf );
  1018. if( wf5temp == -1 )
  1019. wf5temp = Mcount + 2*Dump( 5,10 );
  1020.                 TempCount = wf5temp - Mcount;
  1021. Area[i][j] = Nf;
  1022. wf5temp = SreachArea( Area,Nf );
  1023. if( wf5temp == -1 )
  1024. wf5temp = Ncount + 2*Dump( 5,10 );
  1025. TempCount1 = wf5temp - Ncount;
  1026. if( TempCount1 > TempCount )
  1027. TempCount = TempCount1;
  1028. if( TempCount > pCount[0].count )
  1029. {
  1030. pCount[0].count     = TempCount;
  1031. pCount[0].step.side = Nf;
  1032. pCount[0].step.m    = i;
  1033. pCount[0].step.n    = j;
  1034. for( num = 1;num < CurBreadth;num++ )
  1035. if( pCount[0].count > pCount[num].count )
  1036. {
  1037. temp = pCount[num];
  1038. pCount[num] = pCount[0];
  1039. pCount[0] = temp;
  1040. }
  1041. }
  1042. Area[i][j] = 'N';
  1043. }
  1044. }
  1045. break;
  1046. }
  1047. for( num = 0;num < CurBreadth;num++ )
  1048. if( pCount[num].step.side != 'E' )
  1049.     CountList.AddTail( pCount[num] );
  1050. delete pCount;
  1051. MemoryCount--;
  1052. }
  1053. /////////////////////////////////////////////////////////////////////////////////////////////
  1054. // 给下一层次加入深度列表
  1055. // ~~~~~~~~~~~~~~~~~~~~~~~
  1056. void CFive::AddDeepList( Step step )  
  1057. {
  1058. DeepList.AddTail( step );
  1059. }
  1060. Step CFive::GetLastDeepList()
  1061. {
  1062. return DeepList.GetTail();
  1063. }
  1064. double CFive::GetStepCount()
  1065. {
  1066. POSITION pos;
  1067. double   temp;
  1068. Count    steptemp;
  1069. temp = 0;
  1070. pos = CountList.GetHeadPosition();
  1071. while(pos != NULL)
  1072. {
  1073. steptemp = CountList.GetNext(pos);
  1074.         temp = steptemp.count + temp;
  1075. }
  1076. if( CurCount == Side )
  1077. return (temp+CurCount);
  1078. else
  1079. return (-temp+CurCount);
  1080. }
  1081. /////////////////////////////////////////////////////////////////////////////////////////////
  1082. // 搜索安排函数
  1083. // ~~~~~~~~~~~~~
  1084. void CFive::ThreadRun()
  1085. {
  1086. if( WaitForSingleObject( KillWzqRun,0 ) == WAIT_OBJECT_0 )
  1087. return;
  1088. if( CurDeep <= 0 || CurBreadth <= 0 )
  1089. {
  1090. return;
  1091. }
  1092. /////////////////////////////////////////////////////////////////////////////////
  1093. // 显示信息
  1094. // ~~~~~~~~~
  1095. // {
  1096. // TCHAR Buf[50];
  1097. // wsprintf( Buf,"%d",ThreadCount );
  1098. // pInfo->SetPaneText(2,Buf );
  1099. // wsprintf( Buf,"%2fMb",MemoryCount*600/1024/1024 );
  1100. // pInfo->SetPaneText(3,Buf );
  1101. // }
  1102. /////////////////////////////////////////////////////////////////////////////////
  1103. if( CurThreadDeep > 0 )
  1104. {
  1105. POSITION pos,postemp;
  1106. CFive **pFive;
  1107. int i,num;
  1108. i = 0;
  1109. //...........................................................................................
  1110. CalRun( CurSide, COUNT_ALPHA );
  1111. num   = CountList.GetCount();
  1112. pFive = (CFive**)new BYTE[sizeof(CFive*)*num];
  1113. pos = CountList.GetHeadPosition();
  1114. while(pos)
  1115. {
  1116. pFive[i] = new CFive( CurSide,CurDeep,CurBreadth,CurThreadDeep );
  1117. postemp = DeepList.GetHeadPosition();
  1118. while( postemp )
  1119. {
  1120. pFive[i] -> AddDeepList( DeepList.GetNext( postemp ));
  1121. }
  1122. pFive[i] -> AddDeepList( CountList.GetNext( pos ).step );
  1123. pFive[i] -> CreateThread();  //Create thread
  1124. i++;
  1125. }
  1126. for( i=0;i < num;i++ )
  1127. {
  1128. pFive[i]->EndEvent.Lock();
  1129. WaitForSingleObject( pFive[i] -> m_hThread,INFINITE ); 
  1130. CurCount += pFive[i] -> GetStepCount();
  1131. if( CurDeep == DeepMax )
  1132. {
  1133. Count count_temp;
  1134.     count_temp.step  = pFive[i] -> GetLastDeepList();
  1135. count_temp.count = pFive[i] -> GetStepCount();
  1136. OneCountList.AddTail( count_temp );
  1137. }
  1138. delete pFive[i];
  1139. }
  1140. delete pFive;
  1141. }
  1142. else
  1143. {
  1144. int i,num;
  1145. POSITION pos,postemp;
  1146. //...........................................................................................
  1147. CalRun( CurSide,COUNT_ALPHA );
  1148. num = CountList.GetCount();
  1149. pos = CountList.GetHeadPosition();
  1150. while( pos )
  1151. {
  1152. if( WaitForSingleObject( KillWzqRun,0 ) == WAIT_OBJECT_0 )
  1153. return;
  1154. {
  1155. postemp = DeepList.GetHeadPosition();
  1156.         if( CurSide == Side )
  1157. {
  1158. CFive five( CurSide,CurDeep,CurBreadth,CurThreadDeep );
  1159. while( postemp )
  1160. {
  1161. five.AddDeepList( DeepList.GetNext( postemp ));
  1162. }
  1163. five.AddDeepList( CountList.GetNext( pos ).step );
  1164.     i++;
  1165.     five.ThreadRun();
  1166.     CurCount += five.GetStepCount();
  1167.     if( CurDeep == DeepMax )
  1168.     {
  1169. Count count_temp;
  1170.         count_temp.step = five.GetLastDeepList();
  1171.       count_temp.count = five.GetStepCount();
  1172.     OneCountList.AddTail( count_temp );
  1173.     }
  1174. }else
  1175. {
  1176. CFive five( CurSide,CurDeep,CurBreadth,CurThreadDeep );
  1177. while( postemp )
  1178. {
  1179. five.AddDeepList( DeepList.GetNext( postemp ));
  1180. }
  1181. five.AddDeepList( CountList.GetNext( pos ).step );
  1182.     i++;
  1183.     five.ThreadRun();
  1184.     CurCount += five.GetStepCount();
  1185.     if( CurDeep == DeepMax )
  1186.     {
  1187. Count count_temp;
  1188.         count_temp.step = five.GetLastDeepList();
  1189.       count_temp.count = five.GetStepCount();
  1190.     OneCountList.AddTail( count_temp );
  1191.     }
  1192. }
  1193. }
  1194. }
  1195. }
  1196. }
  1197. BOOL CFive::InitInstance()
  1198. {
  1199. ThreadCount++;
  1200. ThreadRun();
  1201. return FALSE;
  1202. }
  1203. int CFive::ExitInstance()
  1204. {
  1205. ThreadCount--;
  1206. EndEvent.SetEvent();
  1207. return CWinThread::ExitInstance();
  1208. }