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

其他游戏

开发平台:

Visual C++

  1. // BaiDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Chess.h"
  5. #include "BaseDef.h"
  6. #include "CoolButton.h"
  7. #include "Thinker.h"
  8. #include "ChessDlg.h"
  9. #include "BaiDlg.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CBaiDlg dialog
  17. CBaiDlg::CBaiDlg(CWnd* pParent /*=NULL*/)
  18. : CDialog(CBaiDlg::IDD, pParent)
  19. {
  20. //{{AFX_DATA_INIT(CBaiDlg)
  21. m_nGoSide = -1;
  22. //}}AFX_DATA_INIT
  23. }
  24. void CBaiDlg::DoDataExchange(CDataExchange* pDX)
  25. {
  26. CDialog::DoDataExchange(pDX);
  27. //{{AFX_DATA_MAP(CBaiDlg)
  28. DDX_Control(pDX, IDC_BT_SAVE, m_btSave);
  29. DDX_Control(pDX, IDC_BT_OPEN, m_btOpen);
  30. DDX_Control(pDX, IDC_BT_NORMAL, m_btNormal);
  31. DDX_Control(pDX, IDC_BT_CLEAR, m_btClear);
  32. DDX_Control(pDX, IDCANCEL, m_btCancel);
  33. DDX_Control(pDX, IDC_BAIOK, m_btOK);
  34. DDX_Radio(pDX, IDC_RADIO_GOSIDE_RED, m_nGoSide);
  35. //}}AFX_DATA_MAP
  36. }
  37. BEGIN_MESSAGE_MAP(CBaiDlg, CDialog)
  38. //{{AFX_MSG_MAP(CBaiDlg)
  39. ON_BN_CLICKED(IDC_BAIOK, OnBaiok)
  40. ON_WM_PAINT()
  41. ON_WM_RBUTTONDOWN()
  42. ON_WM_MOUSEMOVE()
  43. ON_BN_CLICKED(IDC_BT_CLEAR, OnBtClear)
  44. ON_BN_CLICKED(IDC_BT_NORMAL, OnBtNormal)
  45. ON_COMMAND(ID_BLACK_B, OnBlackB)
  46. ON_COMMAND(ID_BLACK_J, OnBlackJ)
  47. ON_COMMAND(ID_BLACK_K, OnBlackK)
  48. ON_COMMAND(ID_BLACK_M, OnBlackM)
  49. ON_COMMAND(ID_BLACK_P, OnBlackP)
  50. ON_COMMAND(ID_BLACK_S, OnBlackS)
  51. ON_COMMAND(ID_BLACK_X, OnBlackX)
  52. ON_COMMAND(ID_RED_B, OnRedB)
  53. ON_COMMAND(ID_RED_J, OnRedJ)
  54. ON_COMMAND(ID_RED_K, OnRedK)
  55. ON_COMMAND(ID_RED_M, OnRedM)
  56. ON_COMMAND(ID_RED_P, OnRedP)
  57. ON_COMMAND(ID_RED_S, OnRedS)
  58. ON_COMMAND(ID_RED_X, OnRedX)
  59. ON_COMMAND(ID_BAI_DELETE, OnBaiDelete)
  60. ON_WM_LBUTTONDOWN()
  61. ON_BN_CLICKED(IDC_BT_OPEN, OnBtOpen)
  62. ON_BN_CLICKED(IDC_BT_SAVE, OnBtSave)
  63. //}}AFX_MSG_MAP
  64. END_MESSAGE_MAP()
  65. /////////////////////////////////////////////////////////////////////////////
  66. // CBaiDlg message handlers
  67. BOOL CBaiDlg::OnInitDialog() 
  68. {
  69. CDialog::OnInitDialog();
  70. m_pParent=(CChessDlg*)GetParent();
  71. m_pdcBack=m_pParent->m_pdcBack;
  72. m_pdcBoard=m_pParent->m_pdcBoard;
  73. New(m_pParent->m_Face);
  74. UpdateData(FALSE);
  75. return TRUE;  // return TRUE unless you set the focus to a control
  76.               // EXCEPTION: OCX Property Pages should return FALSE
  77. }
  78. void CBaiDlg::OnBaiok() 
  79. {
  80. // TODO: Add your control notification handler code here
  81. UpdateData(TRUE); 
  82. CFace face;
  83. if(GetFace(face))
  84. {
  85. face.side=m_nGoSide;
  86. m_pParent->New(face);
  87. OnOK();
  88. }
  89. }
  90. void CBaiDlg::UpdateFace()
  91. {
  92. CRect rc(0,0,BWA*9,BWA*10);
  93. m_pdcBack->BitBlt(rc.left,rc.top,rc.Width(),rc.Height(),m_pdcBoard,rc.left,rc.top,SRCCOPY);
  94. for(int i=0;i<=8;i++)
  95. for(int j=0;j<=9;j++)
  96. if(m_IconMap[i+1][j+1]!=32)
  97. m_pdcBack->DrawIcon(i*BWA+SW,j*BWA+SW,m_pParent->m_hIconMan[m_IconMap[i+1][j+1]]);
  98. CClientDC dc(this);
  99. dc.BitBlt(rc.left,rc.top,rc.Width(),rc.Height(),m_pdcBack,rc.left,rc.top,SRCCOPY);
  100. }
  101. void CBaiDlg::OnPaint() 
  102. {
  103. CPaintDC dc(this);
  104. UpdateFace();
  105. }
  106. void CBaiDlg::OnRButtonDown(UINT nFlags, CPoint point) 
  107. {
  108. CPoint p=point;
  109. if(FaceToPoint(p))
  110. {
  111. m_Point=p;
  112. CMenu menu;
  113. menu.LoadMenu(IDR_MENUBAI);
  114. if(m_IconMap[p.x][p.y]==32) menu.EnableMenuItem(ID_BAI_DELETE,1);
  115. else  menu.EnableMenuItem(ID_BAI_DELETE,0);
  116. ClientToScreen(&point);
  117. menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
  118. point.x, point.y, this);
  119. }
  120. CDialog::OnRButtonDown(nFlags, point);
  121. }
  122. void CBaiDlg::OnMouseMove(UINT nFlags, CPoint point) 
  123. {
  124. // TODO: Add your message handler code here and/or call default
  125. CDialog::OnMouseMove(nFlags, point);
  126. }
  127. BOOL CBaiDlg::FaceToPoint(CPoint &point)
  128. {
  129. if((point.x)%BWA<SW||(point.x)%BWA>BWA-SW)return FALSE;
  130. if((point.y)%BWA<SW||(point.y)%BWA>BWA-SW)return FALSE;
  131. CPoint p;
  132. p.x=(point.x)/BWA+1;
  133. p.y=(point.y)/BWA+1;
  134. if(p.x<1||p.x>9||p.y<1||p.y>10)return FALSE;
  135. point=p;
  136. return TRUE;
  137. }
  138. void CBaiDlg::OnBtClear() 
  139. {
  140. // TODO: Add your control notification handler code here
  141. for(int i=0;i<10;i++)
  142. for(int j=0;j<11;j++)m_IconMap[i][j]=32;
  143. m_IconMap[5][1]=7;
  144. m_IconMap[5][10]=0;
  145. UpdateFace();
  146. }
  147. void CBaiDlg::OnBtNormal() 
  148. {
  149. Reset();
  150. UpdateFace();
  151. }
  152. void CBaiDlg::OnBlackB() 
  153. {
  154. if(::IsNormal(BLACK_B,m_Point.x,m_Point.y))
  155. {
  156. m_IconMap[m_Point.x][m_Point.y]=BLACK_B;
  157. UpdateFace();
  158. }
  159. }
  160. void CBaiDlg::OnBlackJ() 
  161. {
  162. m_IconMap[m_Point.x][m_Point.y]=BLACK_J;
  163. UpdateFace();
  164. }
  165. void CBaiDlg::OnBlackK() 
  166. {
  167. if(::IsNormal(BLACK_K,m_Point.x,m_Point.y))
  168. {
  169. m_IconMap[m_Point.x][m_Point.y]=BLACK_K;
  170. UpdateFace();
  171. }
  172. }
  173. void CBaiDlg::OnBlackM() 
  174. {
  175. m_IconMap[m_Point.x][m_Point.y]=BLACK_M;
  176. UpdateFace();
  177. }
  178. void CBaiDlg::OnBlackP() 
  179. {
  180. m_IconMap[m_Point.x][m_Point.y]=BLACK_P;
  181. UpdateFace();
  182. }
  183. void CBaiDlg::OnBlackS() 
  184. {
  185. if(::IsNormal(BLACK_S,m_Point.x,m_Point.y))
  186. {
  187. m_IconMap[m_Point.x][m_Point.y]=BLACK_S;
  188. UpdateFace();
  189. }
  190. }
  191. void CBaiDlg::OnBlackX() 
  192. {
  193. if(::IsNormal(BLACK_X,m_Point.x,m_Point.y))
  194. {
  195. m_IconMap[m_Point.x][m_Point.y]=BLACK_X;
  196. UpdateFace();
  197. }
  198. }
  199. void CBaiDlg::OnRedB() 
  200. {
  201. if(::IsNormal(RED_B,m_Point.x,m_Point.y))
  202. {
  203. m_IconMap[m_Point.x][m_Point.y]=RED_B;
  204. UpdateFace();
  205. }
  206. }
  207. void CBaiDlg::OnRedJ() 
  208. {
  209. m_IconMap[m_Point.x][m_Point.y]=RED_J;
  210. UpdateFace();
  211. }
  212. void CBaiDlg::OnRedK() 
  213. {
  214. if(::IsNormal(RED_K,m_Point.x,m_Point.y))
  215. {
  216. m_IconMap[m_Point.x][m_Point.y]=RED_K;
  217. UpdateFace();
  218. }
  219. }
  220. void CBaiDlg::OnRedM() 
  221. {
  222. m_IconMap[m_Point.x][m_Point.y]=RED_M;
  223. UpdateFace();
  224. }
  225. void CBaiDlg::OnRedP() 
  226. {
  227. m_IconMap[m_Point.x][m_Point.y]=RED_P;
  228. UpdateFace();
  229. }
  230. void CBaiDlg::OnRedS() 
  231. {
  232. if(::IsNormal(RED_S,m_Point.x,m_Point.y))
  233. {
  234. m_IconMap[m_Point.x][m_Point.y]=RED_S;
  235. UpdateFace();
  236. }
  237. }
  238. void CBaiDlg::OnRedX() 
  239. {
  240. if(::IsNormal(RED_X,m_Point.x,m_Point.y))
  241. {
  242. m_IconMap[m_Point.x][m_Point.y]=RED_X;
  243. UpdateFace();
  244. }
  245. }
  246. void CBaiDlg::OnBaiDelete() 
  247. {
  248. m_IconMap[m_Point.x][m_Point.y]=32;
  249. UpdateFace();
  250. }
  251. BOOL CBaiDlg::GetFace(CFace& face)
  252. {
  253. int i,j,count[14];
  254. for(i=0;i<14;i++)count[i]=0;
  255. for(i=1;i<=9;i++)
  256. for(j=1;j<=10;j++)
  257. if(m_IconMap[i][j]!=32)count[m_IconMap[i][j]]++;
  258. const static char caption[15]="错误";
  259. if(count[0]==0)
  260. {
  261. MessageBox("没有"帅"?",caption,MB_OK|MB_ICONINFORMATION);
  262. return FALSE;
  263. }
  264. if(count[7]==0)
  265. {
  266. MessageBox("没有"将"?",caption,MB_OK|MB_ICONINFORMATION);
  267. return FALSE;
  268. }
  269. if(count[0]>1)
  270. {
  271. MessageBox(""帅"太多.",caption,MB_OK|MB_ICONINFORMATION);
  272. return FALSE;
  273. }
  274. if(count[1]>2)
  275. {
  276. MessageBox(""仕"太多.",caption,MB_OK|MB_ICONINFORMATION);
  277. return FALSE;
  278. }
  279. if(count[2]>2)
  280. {
  281. MessageBox(""相"太多.",caption,MB_OK|MB_ICONINFORMATION);
  282. return FALSE;
  283. }
  284. if(count[3]>2)
  285. {
  286. MessageBox("红"马"太多.",caption,MB_OK|MB_ICONINFORMATION);
  287. return FALSE;
  288. }
  289. if(count[4]>2)
  290. {
  291. MessageBox("红"车"太多.",caption,MB_OK|MB_ICONINFORMATION);
  292. return FALSE;
  293. }
  294. if(count[5]>2)
  295. {
  296. MessageBox("红"炮"太多.",caption,MB_OK|MB_ICONINFORMATION);
  297. return FALSE;
  298. }
  299. if(count[6]>5)
  300. {
  301. MessageBox(""兵"太多.",caption,MB_OK|MB_ICONINFORMATION);
  302. return FALSE;
  303. }
  304. if(count[7]>1)
  305. {
  306. MessageBox(""将"太多.",caption,MB_OK|MB_ICONINFORMATION);
  307. return FALSE;
  308. }
  309. if(count[8]>2)
  310. {
  311. MessageBox(""士"太多.",caption,MB_OK|MB_ICONINFORMATION);
  312. return FALSE;
  313. }
  314. if(count[9]>2)
  315. {
  316. MessageBox(""象"太多.",caption,MB_OK|MB_ICONINFORMATION);
  317. return FALSE;
  318. }
  319. if(count[10]>2)
  320. {
  321. MessageBox("黑"马"太多.",caption,MB_OK|MB_ICONINFORMATION);
  322. return FALSE;
  323. }
  324. if(count[11]>2)
  325. {
  326. MessageBox("黑"车"太多.",caption,MB_OK|MB_ICONINFORMATION);
  327. return FALSE;
  328. }
  329. if(count[12]>2)
  330. {
  331. MessageBox("黑"炮"太多.",caption,MB_OK|MB_ICONINFORMATION);
  332. return FALSE;
  333. }
  334. if(count[13]>5)
  335. {
  336. MessageBox(""卒"太多.",caption,MB_OK|MB_ICONINFORMATION);
  337. return FALSE;
  338. }
  339. const static int manoff[14]={0,1,3,5,7,9,11,16,17,19,21,23,25,27};
  340. for(i=0;i<14;i++)count[i]=0;
  341. for(i=0;i<32;i++)face.man[i].x=0;
  342. for(i=1;i<=9;i++)
  343. for(j=1;j<=10;j++)
  344. if(m_IconMap[i][j]!=32)
  345. {
  346. face.man[manoff[m_IconMap[i][j]]+count[m_IconMap[i][j]]].x=i;
  347. face.man[manoff[m_IconMap[i][j]]+count[m_IconMap[i][j]]].y=j;
  348. count[m_IconMap[i][j]]++;
  349. }
  350. return TRUE;
  351. }
  352. void CBaiDlg::Reset()
  353. {
  354. for(int i=0;i<10;i++)
  355. for(int j=0;j<11;j++)m_IconMap[i][j]=32;
  356. m_IconMap[1][10]=4;m_IconMap[1][1]=11;
  357. m_IconMap[2][10]=3;m_IconMap[2][1]=10;
  358. m_IconMap[3][10]=2;m_IconMap[3][1]=9;
  359. m_IconMap[4][10]=1;m_IconMap[4][1]=8;
  360. m_IconMap[5][10]=0;m_IconMap[5][1]=7;
  361. m_IconMap[6][10]=1;m_IconMap[6][1]=8;
  362. m_IconMap[7][10]=2;m_IconMap[7][1]=9;
  363. m_IconMap[8][10]=3;m_IconMap[8][1]=10;
  364. m_IconMap[9][10]=4;m_IconMap[9][1]=11;
  365. m_IconMap[2][8]=5;m_IconMap[2][3]=12;
  366. m_IconMap[8][8]=5;m_IconMap[8][3]=12;
  367. m_IconMap[1][7]=6;m_IconMap[1][4]=13;
  368. m_IconMap[3][7]=6;m_IconMap[3][4]=13;
  369. m_IconMap[5][7]=6;m_IconMap[5][4]=13;
  370. m_IconMap[7][7]=6;m_IconMap[7][4]=13;
  371. m_IconMap[9][7]=6;m_IconMap[9][4]=13;
  372. }
  373. void CBaiDlg::OnLButtonDown(UINT nFlags, CPoint point) 
  374. {
  375. OnRButtonDown(nFlags,point);
  376. CDialog::OnLButtonDown(nFlags, point);
  377. }
  378. void CBaiDlg::OnBtOpen() 
  379. {
  380. CFileDialog filedlg(TRUE,"ccr","",NULL,"棋谱|*.ccr||",this);
  381. int respond=filedlg.DoModal();
  382. if(respond==IDOK)
  383. {
  384. CFace face;
  385. if(face.Open(filedlg.GetFileName()))
  386. {
  387. if(face.IsNormal())New(face);
  388. else 
  389. {
  390. CString str;
  391. str.Format(""%s"n不是正确的棋谱",filedlg.GetFileName());
  392. MessageBox(str,"错误",MB_OK|MB_ICONERROR);
  393. }
  394. }
  395. else 
  396. {
  397. CString str;
  398. str.Format("不能打开"%s"",filedlg.GetFileName());
  399. MessageBox(str,"错误",MB_OK|MB_ICONERROR);
  400. }
  401. }
  402. }
  403. void CBaiDlg::OnBtSave() 
  404. {
  405. UpdateData(TRUE); 
  406. CFace face;
  407. if(GetFace(face))
  408. {
  409. face.side=m_nGoSide;
  410. CFileDialog filedlg(FALSE,"ccr","未命名",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"棋谱|*.ccr||",this);
  411. int respond=filedlg.DoModal();
  412. if(respond==IDOK)face.Save(filedlg.GetFileName());
  413. }
  414. }
  415. void CBaiDlg::New(const CFace &face)
  416. {
  417. for(int i=0;i<10;i++)
  418. for(int j=0;j<11;j++)m_IconMap[i][j]=32;
  419. for(i=0;i<32;i++)
  420. if(face.man[i].x!=32)
  421. {
  422. m_IconMap[face.man[i].x][face.man[i].y]
  423. =ManToIcon[i];
  424. }
  425. m_nGoSide=m_pParent->m_Face.side;
  426. UpdateData(FALSE);
  427. UpdateFace();
  428. }