FIVECHESSDLG.CPP
上传用户:gt3658
上传日期:2022-07-09
资源大小:97k
文件大小:31k
源码类别:

棋牌游戏

开发平台:

Visual C++

  1. // FiveChessDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "FiveChess.h"
  5. #include "FiveChessDlg.h"
  6. #include "WinXPButtonST.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CAboutDlg dialog used for App About
  14. class CAboutDlg : public CDialog
  15. {
  16. public:
  17. CAboutDlg();
  18. // Dialog Data
  19. //{{AFX_DATA(CAboutDlg)
  20. enum { IDD = IDD_ABOUTBOX };
  21. CWinXPButtonST m_Ok;
  22. //}}AFX_DATA
  23. // ClassWizard generated virtual function overrides
  24. //{{AFX_VIRTUAL(CAboutDlg)
  25. protected:
  26. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  27. //}}AFX_VIRTUAL
  28. // Implementation
  29. protected:
  30. //{{AFX_MSG(CAboutDlg)
  31. virtual BOOL OnInitDialog();
  32. afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
  33. //}}AFX_MSG
  34. DECLARE_MESSAGE_MAP()
  35. };
  36. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  37. {
  38. //{{AFX_DATA_INIT(CAboutDlg)
  39. //}}AFX_DATA_INIT
  40. }
  41. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  42. {
  43. CDialog::DoDataExchange(pDX);
  44. //{{AFX_DATA_MAP(CAboutDlg)
  45. DDX_Control(pDX, IDOK, m_Ok);
  46. //}}AFX_DATA_MAP
  47. }
  48. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  49. //{{AFX_MSG_MAP(CAboutDlg)
  50. ON_WM_CTLCOLOR()
  51. //}}AFX_MSG_MAP
  52. END_MESSAGE_MAP()
  53. /////////////////////////////////////////////////////////////////////////////
  54. // CFiveChessDlg dialog
  55. CFiveChessDlg::CFiveChessDlg(CWnd* pParent /*=NULL*/)
  56. : CDialog(CFiveChessDlg::IDD, pParent)
  57. {
  58. //{{AFX_DATA_INIT(CFiveChessDlg)
  59. // NOTE: the ClassWizard will add member initialization here
  60. //}}AFX_DATA_INIT
  61. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  62. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  63. closeflag = false;
  64. }
  65. void CFiveChessDlg::DoDataExchange(CDataExchange* pDX)
  66. {
  67. CDialog::DoDataExchange(pDX);
  68. //{{AFX_DATA_MAP(CFiveChessDlg)
  69. DDX_Control(pDX, IDC_BUTTON5, m_bt_newbegin);
  70. DDX_Control(pDX, IDC_BUTTON3, m_bt_regrete);
  71. DDX_Control(pDX, IDC_BUTTON2, m_bt_begin);
  72. DDX_Control(pDX, IDC_COMBO1, m_combox);
  73. DDX_Control(pDX, IDC_STATIC1, m_mainboard);
  74. //}}AFX_DATA_MAP
  75. }
  76. BEGIN_MESSAGE_MAP(CFiveChessDlg, CDialog)
  77. //{{AFX_MSG_MAP(CFiveChessDlg)
  78. ON_WM_SYSCOMMAND()
  79. ON_WM_PAINT()
  80. ON_WM_QUERYDRAGICON()
  81. ON_WM_CTLCOLOR()
  82. ON_WM_LBUTTONDOWN()
  83. ON_BN_CLICKED(IDC_BUTTON2, OnBegin)
  84. ON_BN_CLICKED(IDC_BUTTON3, OnRegret)
  85. ON_BN_CLICKED(IDC_BUTTON5, OnNewBegin)
  86. ON_WM_TIMER()
  87. ON_WM_CREATE()
  88. ON_WM_DESTROY()
  89. ON_MESSAGE(WM_LIBEN,OnLiben)
  90. ON_WM_CLOSE()
  91. ON_COMMAND(ID_MENUCANCEL, OnMenucancel)
  92. ON_COMMAND(ID_MENUITEM32774, OnMenuOPen)
  93. //}}AFX_MSG_MAP
  94. END_MESSAGE_MAP()
  95. /////////////////////////////////////////////////////////////////////////////
  96. // CFiveChessDlg message handlers
  97. BOOL CFiveChessDlg::OnInitDialog()
  98. {
  99. CDialog::OnInitDialog();
  100. // Add "About..." menu item to system menu.
  101. // IDM_ABOUTBOX must be in the system command range.
  102. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  103. ASSERT(IDM_ABOUTBOX < 0xF000);
  104. CMenu* pSysMenu = GetSystemMenu(FALSE);
  105. if (pSysMenu != NULL)
  106. {
  107. CString strAboutMenu;
  108. strAboutMenu.LoadString(IDS_ABOUTBOX);
  109. if (!strAboutMenu.IsEmpty())
  110. {
  111. pSysMenu->AppendMenu(MF_SEPARATOR);
  112. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  113. }
  114. }
  115. // Set the icon for this dialog.  The framework does this automatically
  116. //  when the application's main window is not a dialog
  117. SetIcon(m_hIcon, TRUE); // Set big icon
  118. SetIcon(m_hIcon, FALSE); // Set small icon
  119. // TODO: Add extra initialization here
  120. is_myturn = false;
  121. SetWindowText("五子棋");
  122. SetTimer(1,500,0);
  123. CRect rc ;
  124. m_mainboard.GetClientRect(&rc);
  125. m_combox.AddString("初级");
  126. m_combox.AddString("高级");
  127. m_combox.SetCurSel(0);
  128. ((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(1);
  129. int x = rc.right  ;
  130. int y = rc.bottom  ;
  131. step_x = (x)/20 ;
  132. step_y = (y)/20;
  133. for(int i = 0 ;i < 20 ; i++)
  134. for (int j=0;j < 20; j++ )
  135. Fivearray[i][j] = 0 ;
  136. return TRUE;  // return TRUE  unless you set the focus to a control
  137. }
  138. void CFiveChessDlg::OnSysCommand(UINT nID, LPARAM lParam)
  139. {
  140. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  141. {
  142. CAboutDlg dlgAbout;
  143. dlgAbout.DoModal();
  144. }
  145. else
  146. {
  147. CDialog::OnSysCommand(nID, lParam);
  148. }
  149. }
  150. // If you add a minimize button to your dialog, you will need the code below
  151. //  to draw the icon.  For MFC applications using the document/view model,
  152. //  this is automatically done for you by the framework.
  153. void CFiveChessDlg::OnPaint() 
  154. {
  155. if (IsIconic())
  156. {
  157. CPaintDC dc(this); // device context for painting
  158. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  159. // Center icon in client rectangle
  160. int cxIcon = GetSystemMetrics(SM_CXICON);
  161. int cyIcon = GetSystemMetrics(SM_CYICON);
  162. CRect rect;
  163. GetClientRect(&rect);
  164. int x = (rect.Width() - cxIcon + 1) / 2;
  165. int y = (rect.Height() - cyIcon + 1) / 2;
  166. // Draw the icon
  167. dc.DrawIcon(x, y, m_hIcon);
  168. }
  169. else
  170. {
  171. CDialog::OnPaint();
  172. }
  173. DrawGrid();
  174. DrawAllChess();
  175. }
  176. // The system calls this to obtain the cursor to display while the user drags
  177. //  the minimized window.
  178. HCURSOR CFiveChessDlg::OnQueryDragIcon()
  179. {
  180. return (HCURSOR) m_hIcon;
  181. }
  182. void CFiveChessDlg::DrawGrid()
  183. {
  184. CDC *pdc = m_mainboard.GetDC();
  185. CRect rc ;
  186. m_mainboard.GetClientRect(&rc);
  187. int x = rc.right  ;
  188.   int y = rc.bottom  ;
  189. int xx = rc.left ;
  190. int yy = rc.top+6 ;
  191. //画竖线
  192. for (int i = 0 ; i < 21; i++ )
  193. {
  194. pdc->MoveTo(xx,yy);
  195. pdc->LineTo(xx,y);
  196. xx += step_x ;
  197. }
  198. xx = rc.left ;
  199.     yy = rc.top +6;
  200. //画横线
  201. for (  i = 0 ; i < 20 ; i++ )
  202. {
  203. pdc->MoveTo(xx,yy);
  204. pdc->LineTo(x,yy);
  205. yy += step_y ;
  206. }
  207. }
  208. void CFiveChessDlg::DrawChess(CPoint point)
  209. {
  210. int x = point.x -27;
  211. int y = point.y-19 ;
  212. int linex  = y / step_y;
  213. int liney = x / step_x ;
  214. if (  (y - linex * step_y) >  (step_y/2) )
  215. {
  216. linex++;
  217. }
  218. if (  (x - liney * step_x) >  (step_x/2) )
  219. {
  220. liney++;
  221. }
  222. CDC * pdc = m_mainboard.GetDC();
  223. if ( linex <= 0 || linex >= 20 || liney <= 0 || liney >= 20||Fivearray[linex][liney] != 0 )
  224. {
  225. is_myturn = true;
  226. return ;
  227. }
  228. is_myturn = false;
  229. Fivearray[linex][liney] = 1;
  230. Step tstep;
  231. tstep.side = 1;
  232. tstep.x = linex;
  233. tstep.y = liney;
  234. StepList.AddTail(tstep);
  235. pdc->SelectStockObject(BLACK_BRUSH);
  236. pdc->Ellipse(liney*step_x-10,linex*step_y-10+6,liney * step_x +10,linex * step_y +10+6);
  237. }
  238. void CFiveChessDlg::DrawChess(int x,int y,bool is_current)
  239. {
  240. CDC * pdc = m_mainboard.GetDC();
  241. if (Fivearray[x][y] == 0)
  242. return;
  243. if ( Fivearray[x][y] == 1 )
  244. {
  245. pdc->SelectStockObject(BLACK_BRUSH);
  246. }
  247. else 
  248. {
  249. pdc->SelectStockObject(WHITE_BRUSH);
  250. }
  251. if ( is_current == true)
  252. {
  253. CBrush br(RGB(211,198,244));
  254. pdc->SelectObject(br);
  255. pdc->Ellipse(y*step_x-10,x*step_y-10+6,y * step_x +10,x * step_y +10+6);
  256. }
  257. else
  258. pdc->Ellipse(y*step_x-10,x*step_y-10+6,y * step_x +10,x * step_y +10+6);
  259. }
  260. HBRUSH CFiveChessDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
  261. {
  262. HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  263. pDC->SetBkMode(TRANSPARENT);
  264. if (nCtlColor !=  CTLCOLOR_EDIT &&  nCtlColor !=  CTLCOLOR_LISTBOX) 
  265. hbr = ::CreateSolidBrush(RGB(80,152,152));
  266. return hbr;
  267. }
  268. void CFiveChessDlg::DrawAllChess()
  269. {
  270. for (int i = 0 ; i <20 ; i++ )
  271. for (int j= 0; j<20 ; j++ )
  272. {
  273. if (Fivearray[i][j] != 0)
  274. {
  275. DrawChess(i,j,false);
  276. }
  277. }
  278. }
  279. void CFiveChessDlg::OnLButtonDown(UINT nFlags, CPoint point) 
  280. {
  281. // TODO: Add your message handler code here and/or call default
  282. if ( is_myturn == false)
  283. {
  284. //MessageBox("请点开始按钮","提示",MB_OK);
  285. return;
  286. }
  287. DrawChess(point);
  288. if ( IsSuccess()|| is_myturn == true)
  289. return ;
  290. //初级
  291. if ( m_combox.GetCurSel() == 0  )
  292. {
  293. Step st;
  294. if (SearchValue(Fivearray,st,true) != 100000)
  295. SearchMaxValue(st,Fivearray);
  296. st.side = 3;
  297. Fivearray[st.x][st.y] = 3;
  298. StepList.AddTail(st);
  299. DrawChess(st.x,st.y,false);
  300. m_currentstep.x = st.x;
  301. m_currentstep.y = st.y;
  302. }
  303. //高级
  304. else
  305. {
  306. Step st;
  307. int score = SearchMaxValue(st,Fivearray);
  308. if ( score >=  1000 || score <= 20 )
  309. {
  310. st.side = 3;
  311. Fivearray[st.x][st.y] = 3;
  312. StepList.AddTail(st);
  313. DrawChess(st.x,st.y,false);
  314. m_currentstep.x = st.x;
  315. m_currentstep.y = st.y;
  316. }
  317. else
  318. {
  319. GameStatus temp;
  320. for (int i = 0 ; i < 20 ; i++)
  321. for (int jj = 0 ; jj< 20 ;jj++)
  322. temp.fivearray[i][jj] = Fivearray[i][jj];
  323. temp.deep = 0;
  324. temp.is_machine = true ;
  325. temp.score = 0;
  326. Step st1;
  327. Step st2;
  328. //机器方下得分
  329. int score1 = DeepSearch(temp,st1,true,0);
  330. //换人方下得分
  331. int score2 = DeepSearch(temp,st2,false,0);
  332. if ( score1 > score2 )
  333. {
  334. st1.side = 3;
  335. Fivearray[st1.x][st1.y] = 3;
  336. StepList.AddTail(st1);
  337. DrawChess(st1.x,st1.y ,false);
  338. m_currentstep.x = st1.x;
  339. m_currentstep.y = st1.y;
  340. }
  341. if ( score1 < score2 )
  342. {
  343. st2.side = 3;
  344. Fivearray[st2.x][st2.y] = 3;
  345. StepList.AddTail(st2);
  346. DrawChess(st2.x,st2.y,false );
  347. m_currentstep.x = st2.x;
  348. m_currentstep.y = st2.y;
  349. }
  350. if ( score1 == score2 )
  351. {
  352. if ( st1.deep <= st2.deep )
  353. {
  354. st1.side = 3;
  355. Fivearray[st1.x][st1.y] = 3;
  356. StepList.AddTail(st1);
  357. DrawChess(st1.x,st1.y,false);
  358. m_currentstep.x = st1.x;
  359. m_currentstep.y = st1.y;
  360. }
  361. else
  362. {
  363. st2.side = 3;
  364. Fivearray[st2.x][st2.y] = 3;
  365. StepList.AddTail(st2);
  366. DrawChess(st2.x,st2.y,false );
  367. m_currentstep.x = st2.x;
  368. m_currentstep.y = st2.y;
  369. }
  370. }//if
  371. }
  372. }
  373. if (! IsSuccess())
  374. {
  375. is_myturn = true;
  376. }
  377. CDialog::OnLButtonDown(nFlags, point);
  378. }
  379. bool CFiveChessDlg::IsSuccess()
  380. {
  381. if ( StepList.GetCount() == 0 )
  382. return false;
  383. Step temp = StepList.GetTail();
  384. int i = temp.x ;
  385. int j = temp.y ;
  386. int side = temp.side ;
  387. if ( LeftRight(i,j,side) >= 5 || UpDown(i,j,side) >= 5 
  388.  ||LupToRdown(i,j,side) >= 5 || RuptoLdown(i,j,side)>=5)
  389. {
  390. if ( side == 3 )
  391. {
  392. MessageBox("电脑胜利,结束战斗!","提示",MB_OK);
  393. }
  394. else
  395. {
  396. MessageBox("你胜利了,结束战斗!","提示",MB_OK);
  397. }
  398. is_myturn = false;
  399. Invalidate();
  400. return true;
  401. }
  402. return false ;
  403. }
  404. //从左到右相同棋子数
  405. int CFiveChessDlg::LeftRight(int i, int j,int side)
  406. {
  407. int tempi,count;
  408. tempi = i;
  409. count = 1;
  410. //toleft
  411. while ( --tempi > 0 && Fivearray[tempi][j] == side)
  412. {
  413. count ++;
  414. }
  415. tempi = i;
  416. while ( ++ tempi <20 && Fivearray[tempi][j] == side )
  417. {
  418. count ++;
  419. }
  420. return count;
  421. }
  422. //从上到下相同棋子数
  423. int CFiveChessDlg::UpDown(int i, int j,int side)
  424. {
  425. int tempj,count;
  426. tempj = j;
  427. count = 1;
  428. while ( --tempj > 0 && Fivearray[i][tempj] == side)
  429. {
  430. count ++;
  431. }
  432. tempj = j;
  433. while ( ++ tempj <20 &&Fivearray[i][tempj] == side )
  434. {
  435. count ++;
  436. }
  437. return count;
  438. }
  439. //从左上到右下相同的棋子数
  440. int CFiveChessDlg::LupToRdown(int i, int j,int side)
  441. {
  442. int tempi,tempj,count;
  443. tempi = i,tempj = j;
  444. count = 1;
  445. while ( --tempi > 0 && -- tempj >0 && Fivearray[tempi][tempj] == side)
  446. {
  447. count ++;
  448. }
  449. tempi = i,tempj = j;
  450. while ( ++ tempi<20 && ++ tempj < 20 &&Fivearray[tempi][tempj] == side )
  451. {
  452. count ++;
  453. }
  454. return count;
  455. }
  456. //从右上到左下的相同棋子数
  457. int CFiveChessDlg::RuptoLdown(int i, int j,int side)
  458. {
  459. int tempi,tempj,count;
  460. tempi = i,tempj = j;
  461. count = 1;
  462. while ( --tempi > 0 && ++tempj <20 && Fivearray[tempi][tempj] == side)
  463. {
  464. count ++;
  465. }
  466. tempi = i,tempj = j;
  467. while ( ++ tempi<20 && -- tempj > 0 && Fivearray[tempi][tempj] == side )
  468. {
  469. count ++;
  470. }
  471. return count;
  472. }
  473. int CFiveChessDlg::LeftToRight_Status(int i, int j ,int array[][20])
  474. {
  475. int tempj,count;
  476. tempj = j;
  477. count = 1;
  478. bool aliveone  = false;
  479. bool alivetwo = false;
  480. bool beyond = false;
  481. int side = array[i][j];
  482. //toleft
  483. while ( --tempj > 0 && array[i][tempj] == side)
  484. {
  485. count ++;
  486. }
  487.  if ( tempj > 0 && array[i][tempj] == 0)
  488.  {
  489.  aliveone = true;
  490.  }
  491.  else if ( tempj > 0 && array[i][tempj] == 1 )
  492.  {
  493. beyond = true;
  494.  }
  495. tempj = j;
  496. while ( ++ tempj <20 && array[i][tempj] == side )
  497. {
  498. count ++;
  499. }
  500.  if ( tempj < 20  && array[i][tempj] == 0)
  501.  {
  502.  alivetwo = true;
  503.  }
  504.  else if ( tempj > 0 && array[i][tempj] == 1 )
  505.  {
  506. beyond = true;
  507.  }
  508. if ( count >= 5)
  509. {
  510. return 8 ;
  511. }
  512.  if (count == 1 && aliveone == true && alivetwo == true )
  513. {
  514. return 0;
  515. }
  516. if ( count == 1 && beyond == true )
  517. {
  518. return 1 ;
  519. }
  520.  if ( count > 1 && aliveone == true && alivetwo == true )
  521.  {
  522.  return count + 3;
  523.  }
  524.  if ( count > 1 && (aliveone == true || alivetwo == true ))
  525.  {
  526.  return count ;
  527.  }
  528.  return 0;
  529. }
  530. int CFiveChessDlg::UpToDown_Status(int i, int j ,int array[][20])
  531. {
  532. int tempi,count;
  533. tempi = i;
  534. count = 1;
  535. bool aliveone  = false;
  536. bool alivetwo = false;
  537. bool beyond = false;
  538. int side = array[i][j];
  539. while ( --tempi > 0 && array[tempi][j] == side)
  540. {
  541. count ++;
  542. }
  543. if ( tempi > 0 && array[tempi][j] == 0  )
  544. {
  545.  aliveone = true;
  546. }
  547. else if (tempi > 0 && array[tempi][j] == 1 )
  548. {
  549. beyond = true;
  550. }
  551. tempi = i;
  552. while ( ++ tempi < 20 && array[tempi][j] == side )
  553. {
  554. count ++;
  555. }
  556. if ( tempi <  20 && array[tempi][j] == 0 )
  557. {
  558.  alivetwo = true;
  559. }
  560. else if ( tempi < 20 && array[tempi][j] == 1)
  561. {
  562. beyond = true ;
  563. }
  564. if ( count >= 5)
  565. {
  566. return 8 ;
  567. }
  568. if (count == 1 && aliveone == true && alivetwo == true )
  569. {
  570. return 0;
  571. }
  572. if ( count == 1 && beyond == true )
  573. {
  574. return 1 ;
  575. }
  576.  if ( count > 1 && aliveone == true && alivetwo == true )
  577.  {
  578.  return count + 3;
  579.  }
  580.  if ( count > 1 && (aliveone == true || alivetwo == true ))
  581.  {
  582.  return count ;
  583.  }
  584. return 0;
  585. }
  586. int CFiveChessDlg::LeftUpToRightDown_Status(int i, int j ,int array[][20])
  587. {
  588. int tempi,tempj,count;
  589. tempi = i,tempj = j;
  590. count = 1;
  591. bool aliveone  = false;
  592. bool alivetwo = false;
  593. bool beyond = false;
  594. int side = array[i][j];
  595. while ( --tempi > 0 && -- tempj >0 && array[tempi][tempj] == side)
  596. {
  597. count ++;
  598. }
  599. if ( tempi > 0 && tempj >0 && array[tempi][tempj] == 0 )
  600. {
  601. aliveone = true;
  602. }
  603. else if ( tempi > 0 && tempj > 0 && array[tempi][tempj] == 1)
  604. {
  605. beyond = true;
  606. }
  607. tempi = i,tempj = j;
  608. while ( ++ tempi<20 && ++ tempj < 20 && array[tempi][tempj] == side )
  609. {
  610. count ++;
  611. }
  612. if ( tempi < 20 && tempj <20 && array[tempi][tempj] == 0)
  613. {
  614. alivetwo = true;
  615. }
  616. else if ( tempi < 20 && tempj < 20 && array[tempi][tempj] == 1 )
  617. {
  618. beyond = true;
  619. }
  620. if ( count >= 5)
  621. {
  622. return 8 ;
  623. }
  624. if (count == 1 && aliveone == true && alivetwo == true )
  625. {
  626. return 0;
  627. }
  628. if ( count == 1 && beyond == true )
  629. {
  630. return 1 ;
  631. }
  632.  if ( count > 1 && aliveone == true && alivetwo == true )
  633.  {
  634.  return count + 3;
  635.  }
  636.  if ( count > 1 && (aliveone == true || alivetwo == true ))
  637.  {
  638.  return count ;
  639.  }
  640. return 0;
  641. }
  642. int CFiveChessDlg::LeftDownToRightUp_Status(int i, int j ,int array[][20])
  643. {
  644. int tempi,tempj,count;
  645. tempi = i,tempj = j;
  646. count = 1;
  647. bool aliveone  = false;
  648. bool alivetwo = false;
  649. bool beyond = false;
  650. int side = array[i][j];
  651. while ( ++tempi < 20 && --tempj > 0 && array[tempi][tempj] == side)
  652. {
  653. count ++;
  654. }
  655. if ( tempi < 20 && tempj > 0 && array[tempi][tempj] == 0)
  656. {
  657. aliveone = true;
  658. }
  659. else if ( tempi < 20 && tempj > 0 && array[tempi][tempj] == 1)
  660. {
  661. beyond = true ;
  662. }
  663. tempi = i,tempj = j;
  664. while ( -- tempi > 0 && ++ tempj < 20 && array[tempi][tempj] == side )
  665. {
  666. count ++;
  667. }
  668. if ( tempi > 0 && tempj < 20 && array[tempi][tempj] == 0 )
  669. {
  670. alivetwo = true;
  671. }
  672. else if ( tempi > 0 && tempj < 20 && array[tempi][tempj] == 1)
  673. {
  674. beyond = true;
  675. }
  676. if ( count >= 5)
  677. {
  678. return 8 ;
  679. }
  680. if (count == 1 && aliveone == true && alivetwo == true )
  681. {
  682. return 0;
  683. }
  684. if ( count == 1 && beyond == true )
  685. {
  686. return 1 ;
  687. }
  688.  if ( count > 1 && aliveone == true && alivetwo == true )
  689.  {
  690.  return count + 3;
  691.  }
  692.  if ( count > 1 && (aliveone == true || alivetwo == true ))
  693.  {
  694.  return count ;
  695.  }
  696. return 0;
  697. }
  698. int CFiveChessDlg::SearchValue(int array[][20],Step & st,bool machine)
  699. {
  700. int max_score = 0;
  701. int score = 0;
  702. GameStatus temp;
  703. temp.is_machine = machine;
  704. temp.deep = 0;
  705. for (int i = 0 ; i < 20 ; i++)
  706. for (int jj = 0 ; jj< 20 ;jj++)
  707. temp.fivearray[i][jj] = array[i][jj];
  708. for ( i = 1 ; i < 20 ; i++)
  709. for(int j =1; j < 20 ; j++)
  710. {
  711. if ( array[i][j] == 0)
  712. {
  713. temp.st.x = i ;
  714. temp.st.y = j;
  715. score = 0;
  716. if ( machine)
  717. {
  718. temp.fivearray[i][j] = 3;
  719. temp.st.side = 3;
  720. temp.is_machine = true; 
  721. temp.score = 0;
  722. GetCurrentScore(temp);
  723. score  = temp.score ;
  724. }
  725. else
  726. {
  727. temp.fivearray[i][j] = 1;
  728. temp.st.side = 1 ;
  729. temp.is_machine = false ;
  730. temp.score = 0;
  731. GetCurrentScore(temp);
  732. score = score - temp.score ;
  733. }
  734. if ( score == 100000 )
  735. {
  736. st.x = i;
  737. st.y = j;
  738. return  score;
  739. }
  740.  if  ( score > max_score )
  741.  {
  742.  max_score = score ;
  743.  st.x = i;
  744.  st.y = j;
  745.  }
  746. temp.fivearray[i][j] = 0;
  747. }
  748. }
  749. return max_score ;
  750. }
  751. void  CFiveChessDlg::GetCurrentScore( GameStatus &board_situation)
  752. {
  753. int i = board_situation.st.x ;
  754. int j = board_situation.st.y;
  755. board_situation.score = 0;
  756. //状态
  757. //返回8 成5:five
  758. //返回7 活4:alivefour
  759. //返回6 活3:alivethree
  760. //返回5 活2:alivetwo
  761. //返回4 死4:deadfour
  762. //返回3 死3:deadthree
  763. //返回2 死2:deadtwo
  764. //返回0,
  765. //搜索出左到右的状态
  766. int lr =LeftToRight_Status(i , j ,board_situation.fivearray);
  767. if  ( lr == 8 ) 
  768. {
  769. if ( board_situation.is_machine )
  770. board_situation.score = 100000;
  771. else
  772. board_situation.score = -100000;
  773. return ;
  774. }
  775. //从上到下
  776. int ud = UpToDown_Status(i,j ,board_situation.fivearray );
  777. if  ( ud == 8 ) 
  778. {
  779. if ( board_situation.is_machine )
  780. board_situation.score = 100000;
  781. else
  782. board_situation.score = -100000;
  783. return ;
  784. }
  785. //从左上到右下
  786. int lutrd = LeftUpToRightDown_Status(i,j ,board_situation.fivearray );
  787. if  ( lutrd == 8 ) 
  788. {
  789. if ( board_situation.is_machine )
  790. board_situation.score = 100000;
  791. else
  792. board_situation.score = -100000;
  793. return ;
  794. }
  795. //从左下到右上
  796. int ldtru =LeftDownToRightUp_Status(i,j ,board_situation.fivearray );
  797. if  ( ldtru == 8 ) 
  798. {
  799. if ( board_situation.is_machine )
  800. board_situation.score = 100000;
  801. else
  802. board_situation.score = -100000;
  803. return ;
  804. }
  805. //是否活4
  806. if ( lr == 7 || ud == 7 || lutrd == 7 || ldtru == 7 )
  807. {
  808. if ( board_situation.is_machine )
  809. board_situation.score = 10000;
  810. else
  811. board_situation.score = -10000;
  812. return ;
  813. }
  814. //双死4
  815. if ( 
  816.  ( lr == 4 && (ud == 4 || lutrd == 4 || ldtru == 4))
  817.  || (ud == 4 && (lutrd == 4|| ldtru == 4))
  818.  || (lutrd == 4 && ldtru == 4)
  819. )
  820. {
  821. if ( board_situation.is_machine )
  822. board_situation.score = 10000;
  823. else
  824. board_situation.score = -10000;
  825. return ;
  826. }
  827. //死4活3
  828. if ( 
  829.   ( lr == 4 && (ud == 6 || lutrd == 6 || ldtru == 6))
  830.   || ( ud == 4 && (lr == 6 || lutrd == 6 || ldtru == 6))
  831.   || ( lutrd == 4 && (lr == 6 ||  ud== 6 || ldtru == 6))
  832.   ||  ( ldtru== 4 && (lr == 6 ||  ud== 6 || lutrd == 6))
  833.   )
  834. {
  835. if ( board_situation.is_machine )
  836. board_situation.score = 10000;
  837. else
  838. board_situation.score = -10000;
  839. return ;
  840. }
  841. //双活3
  842. if ( 
  843.  ( lr == 6 && (ud == 6 || lutrd == 6 || ldtru == 6))
  844.  || (ud == 6 && (lutrd == 6|| ldtru == 6))
  845.  || (lutrd == 6 && ldtru == 6)
  846. )
  847. {
  848. if ( board_situation.is_machine )
  849. board_situation.score = 5000;
  850. else
  851. board_situation.score = -5000;
  852. return ;
  853. }
  854. //活3双活2
  855. if ( ( lr == 6 || ud == 6 || lutrd == 6 || ldtru == 6 ) &&
  856. ( ( lr == 5 && (ud == 5 || lutrd == 5 || ldtru == 5))
  857.  || (ud == 5 && (lutrd == 5|| ldtru == 5))
  858.  || (lutrd == 5 && ldtru == 5) )
  859.  )
  860. {
  861. if ( board_situation.is_machine )
  862. board_situation.score = 5000;
  863. else
  864. board_situation.score = -5000;
  865. return ;
  866. }
  867. //活3死3
  868. if ( 
  869.   ( lr == 3 && (ud == 6 || lutrd == 6 || ldtru == 6))
  870.   || ( ud == 3 && (lr == 6 || lutrd == 6 || ldtru == 6))
  871.   || ( lutrd == 3 && (lr == 6 ||  ud== 6 || ldtru == 6))
  872.   ||  ( ldtru== 3 && (lr == 6 ||  ud== 6 || lutrd == 6))
  873.   )
  874. {
  875. if ( board_situation.is_machine )
  876. board_situation.score = 1000;
  877. else
  878. board_situation.score = -1000;
  879. return ;
  880. }
  881. //死4
  882. if ( lr == 4 || ud == 4 || lutrd == 4 || ldtru == 4 )
  883. {
  884. if ( board_situation.is_machine )
  885. board_situation.score = 500;
  886. else
  887. board_situation.score = -500;
  888. return ;
  889. }
  890. //单活3
  891. if ( lr == 6 || ud == 6 || lutrd == 6 || ldtru == 6 )
  892. {
  893. if ( board_situation.is_machine )
  894. board_situation.score = 200;
  895. else
  896. board_situation.score = -200;
  897. return ;
  898. }
  899. //双活2
  900. if ( 
  901.  ( lr == 5 && (ud == 5 || lutrd == 5 || ldtru == 5))
  902.  || (ud == 5 && (lutrd == 5|| ldtru == 5))
  903.  || (lutrd == 5 && ldtru == 5)
  904. )
  905. {
  906. if ( board_situation.is_machine )
  907. board_situation.score = 100;
  908. else
  909. board_situation.score = -100;
  910. return ;
  911. }
  912. //双死3
  913. if ( 
  914.  ( lr == 3 && (ud == 3 || lutrd == 3 || ldtru == 3))
  915.  || (ud == 3 && (lutrd == 3|| ldtru == 3))
  916.  || (lutrd == 3 && ldtru == 3)
  917. )
  918. {
  919. if ( board_situation.is_machine )
  920. board_situation.score = 50;
  921. else
  922. board_situation.score = -50;
  923. return ;
  924. }
  925. //单活2
  926. if ( lr == 5 || ud == 5 || lutrd == 5 || ldtru == 5 )
  927. {
  928. if ( board_situation.is_machine )
  929. board_situation.score = 10;
  930. else
  931. board_situation.score = -10;
  932. return ;
  933. }
  934. //单死3
  935. if ( lr == 3 || ud == 3 || lutrd == 3 || ldtru == 3 )
  936. {
  937. if ( board_situation.is_machine )
  938. board_situation.score = 5;
  939. else
  940. board_situation.score = -5;
  941. return ;
  942. }
  943. //单死2
  944. if ( lr == 2 || ud == 2 || lutrd == 2 || ldtru == 2 )
  945. {
  946. if ( board_situation.is_machine )
  947. board_situation.score = 2;
  948. else
  949. board_situation.score = -2;
  950. return ;
  951. }
  952. //死1
  953. if ( lr == 1 || ud == 1 || lutrd == 1 || ldtru == 1 )
  954. {
  955. if ( board_situation.is_machine )
  956. board_situation.score = 1;
  957. else
  958. board_situation.score = -1;
  959. return ;
  960. }
  961. return  ;
  962. }
  963. int  CFiveChessDlg::SearchMaxValue(Step &st ,int array[][20])
  964. {
  965. int max_score = 0;
  966. int score = 0;
  967. GameStatus temp;
  968. temp.is_machine = true;
  969. temp.deep = 0;
  970. for (int i = 0 ; i < 20 ; i++)
  971. for (int jj = 0 ; jj< 20 ;jj++)
  972. temp.fivearray[i][jj] = array[i][jj];
  973. for ( i = 1 ; i < 20 ; i++)
  974. for(int j =1; j < 20 ; j++)
  975. {
  976. if ( array[i][j] == 0)
  977. {
  978. temp.st.x = i ;
  979. temp.st.y = j;
  980. score = 0;
  981. int score1 = 0,score2 = 0;
  982. temp.fivearray[i][j] = 3;
  983. temp.st.side = 3;
  984. temp.is_machine = true; 
  985. temp.score = 0;
  986. GetCurrentScore(temp);
  987. score1  = temp.score ;
  988. temp.fivearray[i][j] = 1;
  989. temp.st.side = 1 ;
  990. temp.is_machine = false ;
  991. temp.score = 0;
  992.  GetCurrentScore(temp);
  993. score2 = -temp.score ;
  994. //机器
  995. if ( score1 >= 10000 )
  996. {
  997.  
  998. temp.fivearray[i][j] = 3;
  999. temp.st.side = 3;
  1000. temp.is_machine = true; 
  1001. temp.score = 0;
  1002. Step tempst1; 
  1003. int tempscore = SearchValue(temp.fivearray,tempst1,false);
  1004. if ( score1 < tempscore)//如果当前盘面还有比现在分数大的,则防守
  1005. {
  1006. st.x = tempst1.x;
  1007. st.y = tempst1.y ;
  1008. return tempscore;
  1009. }
  1010. else
  1011. {
  1012. st.x = i;
  1013. st.y = j;
  1014. return score1;
  1015. }
  1016. }
  1017. if ( score2 >= 100000 )
  1018. {
  1019. temp.fivearray[i][j] = 1;
  1020. temp.st.side = 1 ;
  1021. temp.is_machine = false ;
  1022. temp.score = 0;
  1023. Step tempst1; 
  1024. int tempscore = SearchValue(temp.fivearray,tempst1,true);
  1025. if ( score2 <= tempscore)//
  1026. {
  1027. st.x = tempst1.x;
  1028. st.y = tempst1.y ;
  1029. return tempscore;
  1030. }
  1031. else
  1032. {
  1033. st.x = i;
  1034. st.y = j;
  1035. return score1;
  1036. }
  1037. }
  1038. score = score1 + score2 ;
  1039.  if  ( score > max_score )
  1040.  {
  1041.  max_score = score ;
  1042.  st.x = i;
  1043.  st.y = j;
  1044.  }
  1045. temp.fivearray[i][j] = 0;
  1046. }
  1047. }
  1048. return max_score ;
  1049. }
  1050. void CFiveChessDlg::OnBegin() 
  1051. {
  1052. // TODO: Add your control notification handler code here
  1053. for(int i = 0 ;i < 20 ; i++)
  1054. for (int j=0;j < 20; j++ )
  1055. Fivearray[i][j] = 0 ;
  1056. StepList.RemoveAll();
  1057. if ( ((CButton *)GetDlgItem(IDC_RADIO2))->GetCheck() == 1 )
  1058. is_myturn = true;
  1059. else
  1060. {
  1061. is_myturn = false;
  1062. Fivearray[10][10] = 3;
  1063. Step st;
  1064. st.side = 3;
  1065. st.x = 10;
  1066. st.y = 10;
  1067. st.deep = 0;
  1068. StepList.AddTail(st);
  1069. DrawChess(st.x,st.y,false);
  1070. m_currentstep.x = st.x;
  1071. m_currentstep.y = st.y;
  1072. is_myturn = true;
  1073. }
  1074. Invalidate();
  1075. }
  1076. void CFiveChessDlg::OnRegret() 
  1077. {
  1078. if (StepList.GetCount() == 0 )
  1079. {
  1080. MessageBox("你一个子都没下,悔什么悔啊,别乱搞","提示",MB_OK);
  1081. return;
  1082. }
  1083. if ( StepList.GetCount() > 0)
  1084. {
  1085. Step tem = StepList.GetTail();
  1086. StepList.RemoveTail();
  1087. Fivearray[tem.x][tem.y] = 0 ;
  1088. if ( StepList.GetCount() > 0)
  1089. {
  1090. tem = StepList.GetTail();
  1091. if ( tem.side == 1 )
  1092. {
  1093. StepList.RemoveTail();
  1094. Fivearray[tem.x][tem.y] = 0;
  1095. }
  1096. }
  1097. }
  1098. Invalidate();
  1099. if (  StepList.GetCount() > 0 )
  1100. {
  1101. Step tem = StepList.GetTail();
  1102. m_currentstep = tem;
  1103. }
  1104. is_myturn = true ;
  1105. return ;
  1106. }
  1107. //返回分数
  1108. int CFiveChessDlg::DeepSearch(GameStatus  ts,Step &st,bool machine,int value)
  1109. {
  1110. ts.deep++;
  1111. st.deep ++ ;
  1112. int score =0 ;
  1113. if  ( ts.deep  == 3 )
  1114. {
  1115. score = SearchValue ( ts.fivearray,st,machine);
  1116. return score;
  1117. }
  1118. int min_score = 0;
  1119.  score = 0;
  1120. //选出几局分较高的
  1121. CList<GameStatus,GameStatus&>GameStatusList;
  1122. for ( int i = 1 ; i < 20 ; i++)
  1123. for(int j =1; j < 20 ; j++)
  1124. {
  1125. if ( ts.fivearray[i][j] == 0)
  1126. {
  1127. ts.st.x = i ;
  1128. ts.st.y = j;
  1129. score = 0;
  1130. if ( machine )
  1131. {
  1132. ts.fivearray[i][j] = 3;
  1133. ts.st.side = 3;
  1134. ts.is_machine = true ;
  1135. ts.score = 0;
  1136. GetCurrentScore( ts );
  1137. if ( score == 100000)
  1138. {
  1139. st.x = i;
  1140. st.y = j;
  1141. return score;
  1142. }
  1143. score = ts.score ;
  1144. }
  1145. else
  1146. {
  1147. ts.fivearray[i][j] = 1;
  1148. ts.st.side = 1 ;
  1149. ts.is_machine = false ;
  1150. ts.score = 0;
  1151. GetCurrentScore(ts);
  1152. score =  - ts.score ;
  1153. ts.score = score;
  1154. if ( score == 100000)
  1155. {
  1156. st.x = i;
  1157. st.y = j;
  1158. return score;
  1159. }
  1160. }
  1161. ts.score = score ;
  1162. if ( score == 0)
  1163. {
  1164. ts.fivearray[i][j] = 0;
  1165. continue;
  1166. }
  1167. if ( GameStatusList.GetCount() == 0)
  1168. {
  1169. min_score = ts.score ;
  1170. GameStatusList.AddTail(ts);
  1171. }
  1172. else
  1173. {
  1174. if  ( score <= min_score )
  1175. {
  1176.  min_score = score ;
  1177. GameStatusList.AddTail(ts);
  1178. }
  1179. else
  1180. {
  1181. POSITION ps = GameStatusList.GetTailPosition();
  1182. while ( ps != NULL )
  1183. {
  1184. GameStatus temp = GameStatusList.GetPrev(ps);
  1185. if  ( temp.score >= score )
  1186. {
  1187. GameStatusList.InsertAfter(ps,ts);
  1188. break;
  1189. }
  1190. }
  1191. if ( ps == NULL )
  1192. {
  1193. GameStatusList.AddHead( ts );
  1194. }
  1195. }
  1196. }
  1197. ts.fivearray[i][j] = 0;
  1198. }
  1199. }//for
  1200. POSITION ps = GameStatusList.GetHeadPosition();
  1201. Step tempstep = st;
  1202. int  tempscore = 0 ;
  1203. int max = 0;
  1204. for ( i = 0 ;i < 3; i ++ )
  1205. {
  1206. GameStatus temp =  GameStatusList.GetNext(ps);
  1207. value = temp.score  ;
  1208. tempscore = DeepSearch(temp,tempstep,! machine,temp.score );
  1209. if ( tempscore > max )
  1210. {
  1211. max = tempscore;
  1212. st = temp.st;
  1213. st.deep = tempstep.deep ;
  1214. }
  1215. if ( ps == NULL )
  1216. break;
  1217. }
  1218. return max ;
  1219. }
  1220. //重新开始
  1221. void CFiveChessDlg::OnNewBegin() 
  1222. {
  1223. for(int i = 0 ;i < 20 ; i++)
  1224. for (int j=0;j < 20; j++ )
  1225. Fivearray[i][j] = 0 ;
  1226. StepList.RemoveAll();
  1227. if ( ((CButton *)GetDlgItem(IDC_RADIO2))->GetCheck() == 1 )
  1228. is_myturn = true;
  1229. else
  1230. {
  1231. is_myturn = false;
  1232. Fivearray[10][10] = 3;
  1233. Step st;
  1234. st.side = 3;
  1235. st.x = 10;
  1236. st.y = 10;
  1237. st.deep = 0;
  1238. StepList.AddTail(st);
  1239. DrawChess(st.x,st.y,false);
  1240. m_currentstep.x = st.x;
  1241. m_currentstep.y = st.y;
  1242. is_myturn = true;
  1243. }
  1244. Invalidate();
  1245. }
  1246. void CFiveChessDlg::OnTimer(UINT nIDEvent) 
  1247. {
  1248. DrawChess(oldstep.x,oldstep.y,false);
  1249. oldstep = m_currentstep;
  1250. flag = !flag;
  1251. DrawChess(m_currentstep.x,m_currentstep.y,flag);
  1252. CDialog::OnTimer(nIDEvent);
  1253. }
  1254. BOOL CAboutDlg::OnInitDialog() 
  1255. {
  1256. CDialog::OnInitDialog();
  1257. // TODO: Add extra initialization here
  1258. SetWindowText("五子棋");
  1259. return TRUE;  // return TRUE unless you set the focus to a control
  1260.               // EXCEPTION: OCX Property Pages should return FALSE
  1261. }
  1262. BOOL CFiveChessDlg::PreCreateWindow(CREATESTRUCT& cs) 
  1263. {
  1264. // TODO: Add your specialized code here and/or call the base class
  1265. cs.style = WS_POPUP;
  1266. cs.dwExStyle =WS_EX_TOOLWINDOW;
  1267. return CDialog::PreCreateWindow(cs);
  1268. }
  1269. BOOL CFiveChessDlg::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
  1270. {
  1271. // TODO: Add your specialized code here and/or call the base class
  1272. return CDialog::Create(IDD, pParentWnd);
  1273. }
  1274. int CFiveChessDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  1275. {
  1276. if (CDialog::OnCreate(lpCreateStruct) == -1)
  1277. return -1;
  1278. tnd.cbSize = sizeof(NOTIFYICONDATA);
  1279. tnd.uFlags =NIF_ICON|NIF_MESSAGE|NIF_TIP;
  1280. tnd.hWnd = this->m_hWnd;
  1281. tnd.uID = 0;
  1282. tnd.uCallbackMessage = WM_LIBEN;
  1283. //tnd.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
  1284. tnd.hIcon = (HICON)LoadImage(AfxGetInstanceHandle(),
  1285.   MAKEINTRESOURCE(IDI_ICON1),
  1286.   IMAGE_ICON,
  1287.   16,
  1288.   16,
  1289.   NULL);
  1290. strcpy(tnd.szTip,"黑白五子棋");
  1291. Shell_NotifyIcon(NIM_ADD,&tnd);
  1292. // TODO: Add your specialized creation code here
  1293. return 0;
  1294. }
  1295. LRESULT CFiveChessDlg::OnLiben(WPARAM wParam,LPARAM lParam)
  1296. {
  1297. UINT uID;
  1298. UINT uMouseMsg;
  1299. // POINT pt;
  1300. uID = (UINT) wParam;
  1301. uMouseMsg = (UINT) lParam;
  1302. if ( uMouseMsg == WM_RBUTTONDOWN )
  1303. {
  1304. CMenu menu;
  1305. VERIFY(menu.LoadMenu(IDR_MENU1));
  1306. CPoint point;
  1307. CMenu* pPopup = menu.GetSubMenu(0);
  1308. ASSERT(pPopup != NULL);
  1309. CWnd* pWndPopupOwner = this;
  1310. while (pWndPopupOwner->GetStyle() & WS_CHILD)
  1311. pWndPopupOwner = pWndPopupOwner->GetParent();
  1312. ::GetCursorPos(&point);
  1313. pPopup->TrackPopupMenu( TPM_RIGHTALIGN  , point.x, point.y,
  1314. pWndPopupOwner);
  1315. }
  1316. if ( uMouseMsg == WM_LBUTTONDOWN )
  1317. {
  1318. ShowWindow(SW_SHOWNORMAL);
  1319. ::SetForegroundWindow(this->m_hWnd);
  1320. }
  1321. return 0;
  1322. }
  1323. void CFiveChessDlg::OnDestroy() 
  1324. {
  1325. CDialog::OnDestroy();
  1326. StepList.RemoveAll();
  1327. // TODO: Add your message handler code here
  1328. }
  1329. HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
  1330. {
  1331. HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  1332. pDC->SetBkMode(TRANSPARENT);
  1333. if (nCtlColor !=  CTLCOLOR_EDIT &&  nCtlColor !=  CTLCOLOR_LISTBOX) 
  1334. hbr = ::CreateSolidBrush(RGB(128,128,200));
  1335. return hbr;
  1336. }
  1337. BOOL CFiveChessDlg::OnCommand(WPARAM wParam, LPARAM lParam) 
  1338. {
  1339. return CDialog::OnCommand(wParam, lParam);
  1340. }
  1341. void CFiveChessDlg::OnClose() 
  1342. {
  1343. // TODO: Add your message handler code here and/or call default
  1344. if (closeflag )
  1345. {
  1346. tnd.uFlags = NULL;
  1347. Shell_NotifyIcon(NIM_DELETE,&tnd);
  1348. CDialog::OnClose();
  1349. KillTimer(1);
  1350. }
  1351. else
  1352. {
  1353. ShowWindow(SW_HIDE);
  1354. }
  1355. }
  1356. void CFiveChessDlg::OnMenucancel() 
  1357. {
  1358. // TODO: Add your command handler code here
  1359. closeflag  = TRUE; // really exit
  1360. SendMessage(WM_CLOSE);
  1361. }
  1362. void CFiveChessDlg::OnMenuOPen() 
  1363. {
  1364. ShowWindow(SW_SHOW);
  1365. }