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

棋牌游戏

开发平台:

Visual C++

  1. // GameDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "CGameHallFrame.h"
  5. #include "GameDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CGameDlg dialog
  13. CGameDlg::CGameDlg(CWnd* pParent /*=NULL*/)
  14. : CDialog(CGameDlg::IDD, pParent)
  15. {
  16. EnableAutomation();
  17. //{{AFX_DATA_INIT(CGameDlg)
  18. m_message = _T("");
  19. m_strText = _T("");
  20. //}}AFX_DATA_INIT
  21. }
  22. void CGameDlg::OnFinalRelease()
  23. {
  24. // When the last reference for an automation object is released
  25. // OnFinalRelease is called.  The base class will automatically
  26. // deletes the object.  Add additional cleanup required for your
  27. // object before calling the base class.
  28. CDialog::OnFinalRelease();
  29. }
  30. void CGameDlg::DoDataExchange(CDataExchange* pDX)
  31. {
  32. CDialog::DoDataExchange(pDX);
  33. //{{AFX_DATA_MAP(CGameDlg)
  34. DDX_Control(pDX, IDC_GAMERLIST, m_GamerList);
  35. DDX_Text(pDX, IDC_MESSAGE, m_message);
  36. DDV_MaxChars(pDX, m_message, 100);
  37. DDX_Text(pDX, IDC_SHOWTEXT, m_strText);
  38. //}}AFX_DATA_MAP
  39. }
  40. BEGIN_MESSAGE_MAP(CGameDlg, CDialog)
  41. //{{AFX_MSG_MAP(CGameDlg)
  42. ON_WM_PAINT()
  43. ON_WM_ERASEBKGND()
  44. ON_WM_LBUTTONDOWN()
  45. ON_WM_CTLCOLOR()
  46. ON_EN_UPDATE(IDC_MESSAGE, OnUpdateMessage)
  47. ON_WM_TIMER()
  48. //}}AFX_MSG_MAP
  49. END_MESSAGE_MAP()
  50. BEGIN_DISPATCH_MAP(CGameDlg, CDialog)
  51. //{{AFX_DISPATCH_MAP(CGameDlg)
  52. // NOTE - the ClassWizard will add and remove mapping macros here.
  53. //}}AFX_DISPATCH_MAP
  54. END_DISPATCH_MAP()
  55. // Note: we add support for IID_IGameDlg to support typesafe binding
  56. //  from VBA.  This IID must match the GUID that is attached to the 
  57. //  dispinterface in the .ODL file.
  58. // {386ED393-6E46-49C7-987B-20C4BF3F7027}
  59. static const IID IID_IGameDlg =
  60. { 0x386ed393, 0x6e46, 0x49c7, { 0x98, 0x7b, 0x20, 0xc4, 0xbf, 0x3f, 0x70, 0x27 } };
  61. BEGIN_INTERFACE_MAP(CGameDlg, CDialog)
  62. INTERFACE_PART(CGameDlg, IID_IGameDlg, Dispatch)
  63. END_INTERFACE_MAP()
  64. /////////////////////////////////////////////////////////////////////////////
  65. // CGameDlg message handlers
  66. void CGameDlg::OnPaint() 
  67. {
  68. CPaintDC dc(this); // device context for painting
  69. // TODO: Add your message handler code here
  70. Draw();
  71. // Do not call CDialog::OnPaint() for painting messages
  72. }
  73. void CGameDlg::Draw()
  74. {
  75. CDC *pDC=GetDC();
  76. CDC MemDC;
  77. MemDC.CreateCompatibleDC(pDC);
  78. CRect rect; 
  79. this->GetClientRect(rect); 
  80. CBitmap bmpFace; 
  81. bmpFace.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
  82. CBitmap* pOldBmp = NULL; 
  83. pOldBmp = MemDC.SelectObject(&bmpFace);
  84. CBitmap bitmap,face;int x,y;
  85. BITMAP BMap;
  86.     bitmap.LoadBitmap(IDB_BOARD);
  87. face.LoadBitmap(IDB_FACE);
  88. bitmap.GetBitmap(&BMap);
  89. x=BMap.bmWidth;
  90. y=BMap.bmHeight;
  91. CDC dcMem;
  92. dcMem.CreateCompatibleDC(&MemDC);        //创建与pDC兼容的设备上下文
  93. dcMem.SelectObject(&bitmap);          //将位图对象选入设备上下文
  94. CBrush brush(RGB(10,255,205)); 
  95. ///
  96. CRect rectClient;CRgn rgn1,rgn2;//rgn3,rgn4;
  97. GetClientRect(rectClient); 
  98. rgn1.CreateRectRgnIndirect(rectClient);
  99. rgn2.CreateRectRgn(730,0,962,670);
  100. /*rgn3.CreateRectRgn(732,399,952,577);
  101. rgn4.CreateRectRgn(732,628,952,657);*/
  102. if(rgn1.CombineRgn(&rgn1,&rgn2,RGN_XOR) == ERROR)
  103. {
  104. return;
  105.     MemDC.FillRgn(&rgn1,&brush);
  106. ///
  107. //从源设备上下文复制位图到目标设备上下文
  108. MemDC.SetStretchBltMode(HALFTONE);  //设置图缩放模式
  109. MemDC.BitBlt(0,0,x,y,&dcMem,0,0,SRCCOPY);
  110. dcMem.SelectObject(&bitmap_wcdd);
  111. MemDC.BitBlt(480,480,BMap_wcdd.bmWidth/3,BMap_wcdd.bmHeight,&dcMem,BMap_wcdd.bmWidth/3*m_bwcdd,0,SRCCOPY);
  112. dcMem.SelectObject(&bitmap_qh);
  113. MemDC.BitBlt(480,510,BMap_qh.bmWidth/3,BMap_qh.bmHeight,&dcMem,BMap_qh.bmWidth/3*m_bqh,0,SRCCOPY);
  114. dcMem.SelectObject(&bitmap_tx);
  115. MemDC.BitBlt(480,540,BMap_tx.bmWidth/3,BMap_tx.bmHeight,&dcMem,BMap_tx.bmWidth/3*m_btx,0,SRCCOPY);
  116. //draw chess
  117. DrawChess(&MemDC);
  118. if(lsLine==TRUE)
  119. {
  120. //music.PlayMusic(6);
  121. DrawLine(&MemDC);
  122. //lsLine=FALSE;
  123. }
  124. if(pos_forward.x>-1)
  125. {
  126. if(pos_forward.y>5&&pos_forward.y<11)
  127. DrawArrow(pos_forward.x,pos_forward.y,8,&MemDC);
  128. else
  129. DrawArrow(pos_forward.x,pos_forward.y,9,&MemDC);
  130. }
  131. if(m_time>=0)
  132. {
  133. DrawTime(&MemDC,m_time);
  134. }
  135. /*if(pos_after.x>-1)
  136. {
  137. if(pos_after.y>5&&pos_after.y<11)
  138. DrawArrow(pos_after.x,pos_after.y,8,&MemDC);
  139. else
  140. DrawArrow(pos_after.x,pos_after.y,9,&MemDC);
  141. }*/
  142. //
  143. pDC->BitBlt(rect.left,rect.top,x,y,&MemDC,rect.left,rect.top,SRCCOPY);
  144. MemDC.SelectObject(pOldBmp); 
  145. bmpFace.DeleteObject();
  146. bitmap.DeleteObject();
  147. brush.DeleteObject();
  148. MemDC.DeleteDC();
  149. pDC->DeleteDC();
  150. pOldBmp->DeleteObject();
  151. //m_edit.FlashWindow(TRUE);
  152. }
  153. BOOL CGameDlg::OnEraseBkgnd(CDC* pDC) 
  154. {
  155. // TODO: Add your message handler code here and/or call default
  156. return TRUE;
  157. }
  158. void CGameDlg::OnLButtonDown(UINT nFlags, CPoint point) 
  159. {
  160. // TODO: Add your message handler code here and/or call default
  161. if(pos_forward.x<0)
  162. pos_forward=FindPos(point.x,point.y);
  163. else
  164. {
  165. pos_after=FindPos(point.x,point.y);
  166. if(pos_after.x<0)
  167. {
  168. pos_forward.x=-1;
  169. Draw();
  170. }
  171. }
  172. if(pos_forward.x>-1)
  173. {
  174. music.PlayMusic(7);
  175. Draw();
  176. }
  177. if(pos_after.x>-1)
  178. {
  179. music.PlayMusic(7);
  180. if(m_bwcdd==0)
  181. {
  182. change(pos_forward,pos_after);
  183. }else if(right==direct)
  184. {
  185. if(game.CanMove(pos_forward,pos_after))
  186. {
  187. play(pos_forward,pos_after);
  188. }
  189. }
  190. pos_forward.x=-1;pos_after.x=-1;
  191. Draw();
  192. }
  193. if(point.x>480&&point.x<480+BMap_wcdd.bmWidth/3&&point.y>480&&point.y<480+BMap_wcdd.bmHeight&&
  194. m_bwcdd==0)
  195. {
  196. music.PlayMusic(2);
  197. m_bwcdd=1;
  198. Draw();
  199. MessageWcdd();
  200. }
  201. if(point.x>480&&point.x<480+BMap_qh.bmWidth/3&&point.y>510&&point.y<510+BMap_qh.bmHeight&&
  202. m_bqh==0)
  203. {
  204. m_bqh=1;
  205. Draw();
  206. }
  207. if(point.x>480&&point.x<480+BMap_tx.bmWidth/3&&point.y>540&&point.y<540+BMap_tx.bmHeight&&
  208. m_btx==0)
  209. {
  210. m_btx=1;
  211. CString s,t;
  212. s=char(20);s+='E';
  213. if(board[16][7]==12)
  214. t.Format("%d %d 0 0 16 7",desk,direct);
  215. else
  216. t.Format("%d %d 0 0 16 9",desk,direct);
  217. s+=t;s+=char(20);
  218. pClient->SendString(s);
  219. Draw();
  220. }
  221. CDialog::OnLButtonDown(nFlags, point);
  222. }
  223. /*int BOARD[17][17]={
  224. {-1,-1,-1,-1,-1,-1,13,13,13,13,13,-1,-1,-1,-1,-1,-1},
  225. {-1,-1,-1,-1,-1,-1,13,13,13,13,13,-1,-1,-1,-1,-1,-1},
  226. {-1,-1,-1,-1,-1,-1,13,0,13,0,13,-1,-1,-1,-1,-1,-1},
  227. {-1,-1,-1,-1,-1,-1,13,13,0,13,13,-1,-1,-1,-1,-1,-1},
  228. {-1,-1,-1,-1,-1,-1,13,0,13,0,13,-1,-1,-1,-1,-1,-1},
  229. {-1,-1,-1,-1,-1,-2,13,13,13,13,13,-2,-1,-1,-1,-1,-1},
  230. {14,14,14,14,14,14,0,-2,0,-2,0,15,15,15,15,15,15},
  231. {14,14,0,14,0,14,-2,-1,-2,-1,-2,15,0,15,0,15,15},
  232. {14,14,14,0,14,14,0,-2,0,-2,0,15,15,0,15,15,15},
  233. {14,14,0,14,0,14,-2,-1,-2,-1,-2,15,0,15,0,15,15},
  234. {14,14,14,14,14,14,0,-2,0,-2,0,15,15,15,15,15,15},
  235. {-1,-1,-1,-1,-1,-2,7,3,4,5,3,-2,-1,-1,-1,-1,-1},
  236. {-1,-1,-1,-1,-1,-1,10,0,1,0,9,-1,-1,-1,-1,-1,-1},
  237. {-1,-1,-1,-1,-1,-1,8,10,0,1,5,-1,-1,-1,-1,-1,-1},
  238. {-1,-1,-1,-1,-1,-1,6,0,4,0,3,-1,-1,-1,-1,-1,-1},
  239. {-1,-1,-1,-1,-1,-1,2,7,6,1,11,-1,-1,-1,-1,-1,-1},
  240. {-1,-1,-1,-1,-1,-1,11,12,11,2,2,-1,-1,-1,-1,-1,-1},
  241. };*/
  242. int BOARD[17][17]={
  243. {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1},
  244. {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1},
  245. {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1},
  246. {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1},
  247. {-1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1},
  248. {-1,-1,-1,-1,-1, 0,0,0,0,0,0, 0,-1,-1,-1,-1,-1},
  249. {0,0,0,0,0,0, 0, 0, 0, 0,0, 0,0,0,0,0,0},
  250. {0,0,0,0,0,0, 0,-1, 0,-1,0, 0,0,0,0,0,0},
  251. {0,0,0,0,0,0, 0, 0, 0, 0,0, 0,0,0,0,0,0},
  252. {0,0,0,0,0,0, 0,-1, 0,-1,0, 0,0,0,0,0,0},
  253. {0,0,0,0,0,0, 0, 0, 0, 0,0, 0,0,0,0,0,0},
  254. {-1,-1,-1,-1,-1, 0, 7, 3, 4,5, 3, 0,-1,-1,-1,-1,-1},
  255. {-1,-1,-1,-1,-1,-1,10, 0, 1,0, 9,-1,-1,-1,-1,-1,-1},
  256. {-1,-1,-1,-1,-1,-1, 8,10, 0,1, 5,-1,-1,-1,-1,-1,-1},
  257. {-1,-1,-1,-1,-1,-1, 6, 0, 4,0, 3,-1,-1,-1,-1,-1,-1},
  258. {-1,-1,-1,-1,-1,-1, 2, 7, 6,1,11,-1,-1,-1,-1,-1,-1},
  259. {-1,-1,-1,-1,-1,-1,11,12,11,2, 2,-1,-1,-1,-1,-1,-1},
  260. };
  261. BOOL CGameDlg::OnInitDialog() 
  262. {
  263. CDialog::OnInitDialog();
  264. // TODO: Add extra initialization here
  265. m_brush.CreateSolidBrush(RGB(207, 207, 207));
  266. for(int i=0;i<17;i++)
  267. for(int j=0;j<17;j++)
  268. {
  269. board[i][j]=BOARD[i][j];
  270. game.board[i][j]=BOARD[i][j];
  271. }
  272. bitmap_down[0].LoadBitmap(IDB_SOUTHCHESS);
  273. bitmap_down[0].GetBitmap(&BMap_down[0]);
  274. bitmap_down[1].LoadBitmap(IDB_LEFTCHESS);
  275. bitmap_down[1].GetBitmap(&BMap_down[1]);
  276. bitmap_down[2].LoadBitmap(IDB_RIGHTCHESS);
  277. bitmap_down[2].GetBitmap(&BMap_down[2]);
  278. bitmap_up[0].LoadBitmap(IDB_UP1);
  279. bitmap_up[0].GetBitmap(&BMap_up[0]);
  280. bitmap_up[1].LoadBitmap(IDB_UP3);
  281. bitmap_up[1].GetBitmap(&BMap_up[1]);
  282. bitmap_up[2].LoadBitmap(IDB_UP2);
  283. bitmap_up[2].GetBitmap(&BMap_up[2]);
  284. bitmap_left[0].LoadBitmap(IDB_LEFT1);
  285. bitmap_left[0].GetBitmap(&BMap_left[0]);
  286. bitmap_left[1].LoadBitmap(IDB_LEFT2);
  287. bitmap_left[1].GetBitmap(&BMap_left[1]);
  288. bitmap_left[2].LoadBitmap(IDB_LEFT3);
  289. bitmap_left[2].GetBitmap(&BMap_left[2]);
  290. bitmap_right[0].LoadBitmap(IDB_RIGHT1);
  291. bitmap_right[0].GetBitmap(&BMap_right[0]);
  292. bitmap_right[1].LoadBitmap(IDB_RIGHT2);
  293. bitmap_right[1].GetBitmap(&BMap_right[1]);
  294. bitmap_right[2].LoadBitmap(IDB_RIGHT3);
  295. bitmap_right[2].GetBitmap(&BMap_right[2]);
  296. bitmap_arrow.LoadBitmap(IDB_ARROW);
  297. bitmap_arrow.GetBitmap(&BMap_arrow);
  298. bitmap_k1.LoadBitmap(IDB_K1);
  299. bitmap_k1.GetBitmap(&BMap_k1);
  300. bitmap_k2.LoadBitmap(IDB_K2);
  301. bitmap_k2.GetBitmap(&BMap_k2);
  302. bitmap_wcdd.LoadBitmap(IDB_WCDD);
  303. bitmap_wcdd.GetBitmap(&BMap_wcdd);
  304. bitmap_qh.LoadBitmap(IDB_QH);
  305. bitmap_qh.GetBitmap(&BMap_qh);
  306. bitmap_tx.LoadBitmap(IDB_TX);
  307. bitmap_tx.GetBitmap(&BMap_tx);
  308. bitmap_time.LoadBitmap(IDB_NUM);
  309. bitmap_time.GetBitmap(&BMap_time);
  310. pos_forward.x=-1;pos_forward.y=-1;
  311. pos_after.x=-1;pos_after.y=-1;
  312. DWORD dwExStyle = LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP | LVS_EX_TRACKSELECT;
  313. m_GamerList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
  314. LV_COLUMN lvColumn;
  315. lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
  316. lvColumn.fmt = LVCFMT_LEFT;
  317. lvColumn.cx = 67;
  318. lvColumn.pszText = "用户名";
  319. m_GamerList.InsertColumn(0,&lvColumn);
  320. lvColumn.pszText = "姓别";
  321. m_GamerList.InsertColumn(1,&lvColumn);
  322. lvColumn.pszText = "积分";
  323. m_GamerList.InsertColumn(2,&lvColumn);
  324. m_bqh=0;m_btx=0;m_bwcdd=0;right=-1;lsLine=FALSE;m_time=-1;
  325. CString s,s1;
  326. s=char(20);s+='Q';s1.Format("%d %d",desk,direct);
  327. s+=s1;s+=char(20);
  328. Sleep(100);
  329. pClient->SendString(s);
  330. return TRUE;  // return TRUE unless you set the focus to a control
  331.               // EXCEPTION: OCX Property Pages should return FALSE
  332. }
  333. HBRUSH CGameDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
  334. {
  335. HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  336. // TODO: Change any attributes of the DC here
  337. // TODO: Return  a different brush if the default is not desired
  338. return m_brush;
  339. }
  340. void CGameDlg::DrawChess(CDC *dc)
  341. {
  342. /*CBitmap bitmap,right,left;int x,y,xr,xl,yr,yl;
  343. BITMAP BMap,br,bl;
  344.     bitmap.LoadBitmap(IDB_SOUTHCHESS);
  345. right.LoadBitmap(IDB_RIGHTCHESS);
  346. left.LoadBitmap(IDB_LEFTCHESS);
  347. bitmap.GetBitmap(&BMap);
  348. left.GetBitmap(&bl);
  349. right.GetBitmap(&br);
  350. x=BMap.bmWidth;
  351. y=BMap.bmHeight;
  352. xr=br.bmWidth;
  353. yr=br.bmHeight;
  354. xl=bl.bmWidth;
  355. yl=bl.bmHeight;*/
  356. CDC dcMem;int dir,x,y,pos;
  357. dcMem.CreateCompatibleDC(dc);        //创建与pDC兼容的设备上下文
  358. //dcMem.SelectObject(&left);          //将位图对象选入设备上下文
  359. //dc->SetStretchBltMode(HALFTONE);  //设置图缩放模式
  360. for(int i=0;i<17;i++)
  361. for(int j=0;j<17;j++)
  362. {
  363. if(board[i][j]>0&&board[i][j]<=18)
  364. {
  365. dir=1;
  366. if(i>=0&&i<6&&j>=6&&j<11)
  367. dir=3;
  368. if(i>=6&&i<11&&j>=0&&j<6)
  369. dir=2;
  370. if(i>=11&&i<17&&j>=6&&j<11)
  371. dir=1;
  372. if(i>=6&&i<11&&j>=11&&j<17)
  373. dir=0;
  374. if(board[i][j]<13)
  375. {
  376. switch(dir)
  377. {
  378. case 0:dcMem.SelectObject(&bitmap_down[2]);
  379. x=BMap_down[2].bmWidth;
  380. y=BMap_down[2].bmHeight;
  381. break;
  382. case 1:
  383. case 3:dcMem.SelectObject(&bitmap_down[0]);
  384. x=BMap_down[0].bmWidth;
  385. y=BMap_down[0].bmHeight;
  386. break;
  387. case 2:dcMem.SelectObject(&bitmap_down[1]);
  388. x=BMap_down[1].bmWidth;
  389. y=BMap_down[1].bmHeight;
  390. break;
  391. }
  392. }
  393. else if(board[i][j]==13||board[i][j]==16)
  394. {
  395. switch(dir)
  396. {
  397. case 0:dcMem.SelectObject(&bitmap_up[2]);
  398. x=BMap_up[2].bmWidth;
  399. y=BMap_up[2].bmHeight;
  400. break;
  401. case 1:
  402. case 3:dcMem.SelectObject(&bitmap_up[0]);
  403. x=BMap_up[0].bmWidth;
  404. y=BMap_up[0].bmHeight;
  405. break;
  406. case 2:dcMem.SelectObject(&bitmap_up[1]);
  407. x=BMap_up[1].bmWidth;
  408. y=BMap_up[1].bmHeight;
  409. break;
  410. }
  411. }
  412. else if(board[i][j]==14||board[i][j]==17)
  413. {
  414. switch(dir)
  415. {
  416. case 0:dcMem.SelectObject(&bitmap_left[2]);
  417. x=BMap_left[2].bmWidth;
  418. y=BMap_left[2].bmHeight;
  419. break;
  420. case 1:
  421. case 3:dcMem.SelectObject(&bitmap_left[0]);
  422. x=BMap_left[0].bmWidth;
  423. y=BMap_left[0].bmHeight;
  424. break;
  425. case 2:dcMem.SelectObject(&bitmap_left[1]);
  426. x=BMap_left[1].bmWidth;
  427. y=BMap_left[1].bmHeight;
  428. break;
  429. }
  430. }
  431. else if(board[i][j]==15||board[i][j]==18)
  432. {
  433. switch(dir)
  434. {
  435. case 0:dcMem.SelectObject(&bitmap_right[2]);
  436. x=BMap_right[2].bmWidth;
  437. y=BMap_right[2].bmHeight;
  438. break;
  439. case 1:
  440. case 3:dcMem.SelectObject(&bitmap_right[0]);
  441. x=BMap_right[0].bmWidth;
  442. y=BMap_right[0].bmHeight;
  443. break;
  444. case 2:dcMem.SelectObject(&bitmap_right[1]);
  445. x=BMap_right[1].bmWidth;
  446. y=BMap_right[1].bmHeight;
  447. break;
  448. }
  449. }
  450. pos=FindImage(board[i][j],dir);
  451. //dc->BitBlt(265+i*40,13+j*39,x/13,y,&dcMem,x/13*i,0,SRCCOPY);
  452. //dc->BitBlt(38+i*39,242+j*39,xl/13,yl,&dcMem,xl/13,0,SRCCOPY);
  453. switch(dir)
  454. {
  455. case 0:
  456. dc->BitBlt(38+j*39,242+(i-6)*39,x/13,y,&dcMem,x/13*pos,0,SRCCOPY);
  457. break;
  458. case 1:
  459. dc->BitBlt(265+(j-6)*40,13+i*39,x/13,y,&dcMem,x/13*pos,0,SRCCOPY);
  460. break;
  461. case 2:
  462. dc->BitBlt(38+j*39,242+(i-6)*39,x/13,y,&dcMem,x/13*pos,0,SRCCOPY);
  463. break;
  464. case 3:
  465. dc->BitBlt(265+(j-6)*40,13+i*39,x/13,y,&dcMem,x/13*pos,0,SRCCOPY);
  466. break;
  467. default:break;
  468. }
  469. }
  470. }
  471. dcMem.DeleteDC();
  472. }
  473. int CGameDlg::FindImage(int k, int dir)
  474. {
  475. int pos;
  476. switch(k)
  477. {
  478. case 1:
  479. pos=8;
  480. break;
  481. case 2:
  482. pos=7;
  483. break;
  484. case 3:
  485. pos=6;
  486. break;
  487. case 4:
  488. pos=5;
  489. break;
  490. case 5:
  491. pos=4;
  492. break;
  493. case 6:
  494. pos=3;
  495. break;
  496. case 7:
  497. pos=2;
  498. break;
  499. case 8:
  500. pos=1;
  501. break;
  502. case 9:
  503. pos=10;
  504. break;
  505. case 10:
  506. pos=12;
  507. break;
  508. case 11:
  509. pos=11;
  510. break;
  511. case 12:
  512. case 16:
  513. case 17:
  514. case 18:
  515. pos=9;
  516. break;
  517. case 13:
  518. case 14:
  519. case 15:
  520. pos=0;
  521. break;
  522. default:break;
  523. }
  524. return pos;
  525. }
  526. CPoint CGameDlg::FindPos(int x, int y)
  527. {
  528. CPoint pos;
  529. pos.x=-1;pos.y=-1;
  530. int i,j;
  531. j=(x-38)/39;
  532. i=(y-13)/39;
  533. if(((i>5&&i<11)||(j>5&&j<11))&&board[i][j]>=0)
  534. {
  535. pos.x=i;pos.y=j;
  536. }
  537. return pos;
  538. }
  539. void CGameDlg::DrawArrow(int i, int j,int k,CDC *dc)
  540. {
  541. int x,y;
  542. x=j*39+30;y=i*39+10;
  543. CDC dcMem;
  544. dcMem.CreateCompatibleDC(dc);        //创建与pDC兼容的设备上下文
  545. if(k<8)
  546. {
  547. dcMem.SelectObject(&bitmap_arrow);
  548. dc->BitBlt(x,y,BMap_arrow.bmWidth/9,BMap_arrow.bmHeight,&dcMem,BMap_arrow.bmWidth/9*k,0,MERGEPAINT);
  549. }
  550. else if(k==8)
  551. {
  552. dcMem.SelectObject(&bitmap_k1);
  553. dc->BitBlt(x,y,BMap_k1.bmWidth,BMap_k1.bmHeight,&dcMem,0,0,MERGEPAINT);
  554. }
  555. else if(k==9)
  556. {
  557. x+=5;y-=3;
  558. dcMem.SelectObject(&bitmap_k2);
  559. dc->BitBlt(x,y,BMap_k2.bmWidth,BMap_k2.bmHeight,&dcMem,0,0,MERGEPAINT);
  560. }
  561. dcMem.DeleteDC();
  562. }
  563. void CGameDlg::userMessage()
  564. {
  565. int i,j;
  566. for(i=6;i<11;i++)
  567. for(j=11;j<17;j++)
  568. if(user.ID[rotateDirect(0)]==1&&!(i==7&&j==12)&&!(i==7&&j==14)&&
  569. !(i==8&&j==13)&&!(i==9&&j==12)&&!(i==9&&j==14))
  570. board[i][j]=15;
  571. else
  572. board[i][j]=0;
  573. for(i=6;i<11;i++)
  574. for(j=0;j<6;j++)
  575. if(user.ID[rotateDirect(2)]==1&&!(i==7&&j==2)&&!(i==7&&j==4)&&
  576. !(i==8&&j==3)&&!(i==9&&j==2)&&!(i==9&&j==4))
  577. board[i][j]=14;
  578. else
  579. board[i][j]=0;
  580. for(i=0;i<6;i++)
  581. for(j=6;j<11;j++)
  582. if(user.ID[rotateDirect(3)]==1&&!(i==2&&j==7)&&!(i==2&&j==9)&&
  583. !(i==3&&j==8)&&!(i==4&&j==7)&&!(i==4&&j==9))
  584. board[i][j]=13;
  585. else
  586. board[i][j]=0;
  587. for(i=6;i<11;i++)
  588. for(j=6;j<11;j++)
  589. {
  590. if(board[i][j]>0)
  591. board[i][j]=0;
  592. }
  593. m_GamerList.DeleteAllItems();
  594. for(i=0;i<4;i++)
  595. {
  596. if(user.ID[i]==1)
  597. {
  598. m_GamerList.InsertItem(0,user.name[i]);
  599. m_GamerList.SetItemText(0,1,user.sex[i]);
  600. m_GamerList.SetItemText(0,2,user.score[i]);
  601. }
  602. }
  603. Draw();
  604. }
  605. //坐标旋转
  606. int CGameDlg::rotateDirect(int i)
  607. {
  608. int dir;
  609. switch(direct)
  610. {
  611. case 0:
  612. dir=(i+3)%4;
  613. break;
  614. case 1:
  615. dir=i;
  616. break;
  617. case 2:
  618. dir=(i+1)%4;
  619. break;
  620. case 3:
  621. dir=(i+2)%4;
  622. break;
  623. }
  624. return dir;
  625. }
  626. void CGameDlg::chatMessage(CString str)
  627. {
  628. m_strText+=str;
  629. //将输入的话显示到显示窗口中
  630. GetDlgItem(IDC_SHOWTEXT)->SetWindowText(m_strText);
  631. CEdit * output=(CEdit *)GetDlgItem(IDC_SHOWTEXT);
  632. //随时跟踪滚动条的位置
  633. output->LineScroll(output->GetLineCount());
  634. }
  635. void CGameDlg::OnUpdateMessage() 
  636. {
  637. // TODO: If this is a RICHEDIT control, the control will not
  638. // send this notification unless you override the CDialog::OnInitDialog()
  639. // function to send the EM_SETEVENTMASK message to the control
  640. // with the ENM_UPDATE flag ORed into the lParam mask.
  641. CString in;CString s,t;
  642. GetDlgItem(IDC_MESSAGE)->GetWindowText(in);
  643. //输入框中只有回车键被按下,所以不发送回车键字符
  644. if(in.GetLength()<1)
  645. {
  646. return;
  647. }
  648. if(in.GetAt(in.GetLength()-1)=='n')
  649. {
  650. //in.TrimRight(" ")用来消去无用的空格键字符
  651. in.TrimRight(" ");
  652. //将输入框中的字符清空,表示字符已经被发送
  653. GetDlgItem(IDC_MESSAGE)->SetWindowText("");
  654. if(in.GetLength()>2)
  655. {
  656. m_strText+=in;
  657. //将输入的话显示到显示窗口中
  658. GetDlgItem(IDC_SHOWTEXT)->SetWindowText(m_strText);
  659. CEdit * output=(CEdit *)GetDlgItem(IDC_SHOWTEXT);
  660. //随时跟踪滚动条的位置
  661. output->LineScroll(output->GetLineCount());
  662. s=char(20);
  663. s+='A';
  664. t.Format("%d ",desk);
  665. s+=t;
  666. s+=in;s+=char(20);
  667. pClient->SendString(s);
  668. }
  669. }
  670. // TODO: Add your control notification handler code here
  671. }
  672. BOOL CGameDlg::change(CPoint p1, CPoint p2)
  673. {
  674. if(p1.x<11||p2.x<11||board[p1.x][p1.y]==0||board[p2.x][p2.y]==0)
  675. return FALSE;
  676. if(board[p1.x][p1.y]==11)
  677. {
  678. if(p2.x<15||p2.x==16&&p2.y==7||p2.x==16&&p2.y==9)
  679. return FALSE;
  680. }
  681. if(board[p2.x][p2.y]==11)
  682. {
  683. if(p1.x<15||p1.x==16&&p1.y==7||p1.x==16&&p1.y==9)
  684. return FALSE;
  685. }
  686. if(board[p1.x][p1.y]==10)
  687. {
  688. if(p2.x==11||p2.x==16&&p2.y==7||p2.x==16&&p2.y==9)
  689. return FALSE;
  690. }
  691. if(board[p2.x][p2.y]==10)
  692. {
  693. if(p1.x==11||p1.x==16&&p1.y==7||p1.x==16&&p1.y==9)
  694. return FALSE;
  695. }
  696. if(board[p1.x][p1.y]==12)
  697. {
  698. if(!(p2.x==16&&p2.y==7||p2.x==16&&p2.y==9))
  699. return FALSE;
  700. }
  701. if(board[p2.x][p2.y]==12)
  702. {
  703. if(!(p1.x==16&&p1.y==7||p1.x==16&&p1.y==9))
  704. return FALSE;
  705. }
  706. int sum;
  707. sum=board[p1.x][p1.y];
  708. board[p1.x][p1.y]=board[p2.x][p2.y];
  709. board[p2.x][p2.y]=sum;
  710. return TRUE;
  711. }
  712. void CGameDlg::MessageWcdd()
  713. {
  714. CString s,t;
  715. s=char(20);
  716. s+='C';
  717. t.Format("%d ",desk);
  718. s+=t;
  719. t.Format("%d ",direct);
  720. s+=t;
  721. int i,j;
  722. for(i=11;i<17;i++)
  723. for(j=6;j<11;j++)
  724. {
  725. t.Format("%d ",board[i][j]);
  726. s+=t;
  727. }
  728. s+=char(20);
  729. pClient->SendString(s);
  730. }
  731. void CGameDlg::GameBegin()
  732. {
  733. music.PlayMusic(1);
  734. for(int i=0;i<17;i++)
  735. for(int j=0;j<17;j++)
  736. {
  737. game.board[i][j]=board[i][j];
  738. }
  739. m_time=30;
  740. SetTimer(1,1000,NULL);
  741. }
  742. void CGameDlg::play(CPoint p1, CPoint p2)
  743. {
  744. CString s,t;
  745. s=char(20);
  746. s+='E';
  747. t.Format("%d %d %d %d %d %d",desk,direct,p1.x,p1.y,p2.x,p2.y);
  748. s+=t;s+=char(20);
  749. pClient->SendString(s);
  750. }
  751. void CGameDlg::PlayResult(char k,POINT from,POINT to)
  752. {
  753. POINT p,q;
  754. p=AdverseRotate(from,direct);
  755. q=AdverseRotate(to,direct);
  756. if(game.war_kind==TRUE)
  757. {
  758. if(right==direct)
  759. game.MoveLine((CPoint)p,(CPoint)q);
  760. }else
  761. {
  762. if(((direct+1)%4)!=right)
  763. game.MoveLine((CPoint)p,(CPoint)q);
  764. }
  765. lsLine=TRUE;
  766. switch(k)
  767. {
  768. case 'F':
  769. music.PlayMusic(4);
  770. board[q.x][q.y]=board[p.x][p.y];
  771. board[p.x][p.y]=0;
  772. game.board[p.x][p.y]=board[p.x][p.y];
  773. game.board[q.x][q.y]=board[q.x][q.y];
  774. break;
  775. case 'G':
  776. music.PlayMusic(5);
  777. board[p.x][p.y]=0;
  778. game.board[p.x][p.y]=board[p.x][p.y];
  779. game.board[q.x][q.y]=board[q.x][q.y];
  780. break;
  781. case 'R':
  782. music.PlayMusic(0);
  783. board[p.x][p.y]=0;board[q.x][q.y]=0;
  784. game.board[p.x][p.y]=board[p.x][p.y];
  785. game.board[q.x][q.y]=board[q.x][q.y];
  786. break;
  787. case 'H':
  788. music.PlayMusic(0);
  789. board[p.x][p.y]=0;board[q.x][q.y]=0;
  790. game.board[p.x][p.y]=board[p.x][p.y];
  791. game.board[q.x][q.y]=board[q.x][q.y];
  792. break;
  793. }
  794. SetTimer(1,1000,NULL);
  795. m_time=30;
  796. Draw();
  797. }
  798. POINT CGameDlg::AdverseRotate(POINT p, int dir)
  799. {
  800. POINT pos;
  801. switch(dir)
  802. {
  803. case 0:
  804. pos.x=p.y;pos.y=16-p.x;
  805. break;
  806. case 2:
  807. pos.x=16-p.y;pos.y=p.x;
  808. break;
  809. case 1:
  810. pos.x=p.x;pos.y=p.y;
  811. break;
  812. case 3:
  813. pos.x=16-p.x;pos.y=16-p.y;
  814. break;
  815. }
  816. return pos;
  817. }
  818. void CGameDlg::DrawLine(CDC *dc)
  819. {
  820. CDC dcMem;
  821. dcMem.CreateCompatibleDC(dc);
  822. dcMem.SelectObject(&bitmap_arrow);
  823. int x,y,k;
  824. for(k=0;k<game.top;k++)
  825. {
  826. x=game.stack[k].y*39+30;
  827. y=game.stack[k].x*39+10;
  828. if(game.engineer==FALSE)
  829. dc->BitBlt(x,y,BMap_arrow.bmWidth/9,BMap_arrow.bmHeight,&dcMem,BMap_arrow.bmWidth/9*
  830. ((game.stack[k].d+2)%4)*2,0,MERGEPAINT);
  831. else
  832. dc->BitBlt(x,y,BMap_arrow.bmWidth/9,BMap_arrow.bmHeight,&dcMem,BMap_arrow.bmWidth/9*
  833. ((game.stack[k].d+1)%4)*2,0,MERGEPAINT);
  834. }
  835. dcMem.DeleteDC();
  836. }
  837. void CGameDlg::DrawTime(CDC *dc,int num)
  838. {
  839. CDC dcMem;
  840. dcMem.CreateCompatibleDC(dc);
  841. dcMem.SelectObject(&bitmap_time);
  842. int x,y,x1,y1;x=num/10;y=num%10;
  843. int dir;
  844. dir=(1-direct+right+4)%4;
  845. switch(dir)
  846. {
  847. case 0:
  848. x1=650;y1=480;
  849. break;
  850. case 1:
  851. x1=200;y1=500;
  852. break;
  853. case 2:
  854. x1=100;y1=200;
  855. break;
  856. case 3:
  857. x1=480;y1=100;
  858. break;
  859. }
  860. dc->BitBlt(x1,y1,BMap_time.bmWidth/10,BMap_time.bmHeight,&dcMem,
  861. x*BMap_time.bmWidth/10,0,MERGEPAINT);
  862. dc->BitBlt(x1+15,y1,BMap_time.bmWidth/10,BMap_time.bmHeight,&dcMem,
  863. y*BMap_time.bmWidth/10,0,MERGEPAINT);
  864. dcMem.DeleteDC();
  865. }
  866. void CGameDlg::OnTimer(UINT nIDEvent) 
  867. {
  868. // TODO: Add your message handler code here and/or call default
  869. if(m_time<0)
  870. {
  871. KillTimer(1);
  872. CString s,t;
  873. if(right==direct)
  874. {
  875. s=char(20);
  876. t.Format("E%d %d 0 0 0 1",desk,direct);
  877. s+=t;s+=char(20);
  878. pClient->SendString(s);
  879. }
  880. }
  881. else
  882. {
  883. music.PlayMusic(8);
  884. Draw();
  885. m_time--;
  886. };
  887. CDialog::OnTimer(nIDEvent);
  888. }
  889. void CGameDlg::GameEnd(int direct)
  890. {
  891. for(int i=0;i<17;i++)
  892. for(int j=0;j<17;j++)
  893. {
  894. board[i][j]=BOARD[i][j];
  895. game.board[i][j]=BOARD[i][j];
  896. }
  897. m_bwcdd=0;
  898. m_bqh=0;
  899. m_btx=0;
  900. m_time=-1;
  901. right=-1;
  902. music.PlayMusic(3);
  903. userMessage();
  904. }