fangkuaiDlg.cpp
上传用户:lzx_cnc
上传日期:2014-10-21
资源大小:3001k
文件大小:20k
源码类别:

Windows CE

开发平台:

Visual C++

  1. // fangkuaiDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "fangkuai.h"
  5. #include "fangkuaiDlg.h"
  6. UINT nChar;
  7. int n=0;//记录分数,即消的行数
  8. int Number[2];//随机的数据用于获取方块
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CFangkuaiDlg dialog
  16. CFangkuaiDlg::CFangkuaiDlg(CWnd* pParent /*=NULL*/)
  17. : CDialog(CFangkuaiDlg::IDD, pParent)
  18. {
  19. //{{AFX_DATA_INIT(CFangkuaiDlg)
  20. // NOTE: the ClassWizard will add member initialization here
  21. //}}AFX_DATA_INIT
  22. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  23. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  24. }
  25. void CFangkuaiDlg::DoDataExchange(CDataExchange* pDX)
  26. {
  27. CDialog::DoDataExchange(pDX);
  28. //{{AFX_DATA_MAP(CFangkuaiDlg)
  29. // NOTE: the ClassWizard will add DDX and DDV calls here
  30. //}}AFX_DATA_MAP
  31. }
  32. BEGIN_MESSAGE_MAP(CFangkuaiDlg, CDialog)
  33. //{{AFX_MSG_MAP(CFangkuaiDlg)
  34. ON_BN_CLICKED(IDC_GameOver, OnGameOver)
  35. ON_BN_CLICKED(IDC_GameStart, OnGameStart)
  36. ON_BN_CLICKED(IDC_UP, OnUp)
  37. ON_BN_CLICKED(IDC_DOWN, OnDown)
  38. ON_BN_CLICKED(IDC_LEFT, OnLeft)
  39. ON_BN_CLICKED(IDC_RIGHT, OnRight)
  40. ON_BN_CLICKED(IDC_PAUSE, OnPause)
  41. ON_WM_TIMER()
  42. ON_WM_CREATE()
  43. ON_WM_PAINT()
  44. ON_WM_CTLCOLOR()
  45. ON_BN_CLICKED(IDC_STATIC_NUM, OnStaticNum)
  46. //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CFangkuaiDlg message handlers
  50. BOOL CFangkuaiDlg::OnInitDialog()
  51. {
  52. CDialog::OnInitDialog();
  53. // Set the icon for this dialog.  The framework does this automatically
  54. //  when the application's main window is not a dialog
  55. SetIcon(m_hIcon, TRUE); // Set big icon
  56. SetIcon(m_hIcon, FALSE); // Set small icon
  57. CenterWindow(GetDesktopWindow()); // center to the hpc screen
  58. // TODO: Add extra initialization here
  59.     CRect rt;
  60. GetClientRect(&rt);
  61. WIDTHOFBRICKS=((rt.right-rt.left)-LEFTMARGIN)/10;
  62. HEIGHTOFBRICKS=((rt.bottom-rt.top)-TOPMARGIN-::GetSystemMetrics(SM_CYCAPTION))/20;
  63. WIDTHOFBRICKS=HEIGHTOFBRICKS=min(WIDTHOFBRICKS,HEIGHTOFBRICKS);
  64. // TRACE(L"HEIGHTOFBRICKS:%dn",HEIGHTOFBRICKS);
  65. BrickAtBottom=FALSE;
  66. EraseALine=FALSE;
  67. Level=0;
  68.     TimerInterval=5000/20;
  69.     GameState=STOP;
  70.     InitBricks();
  71.     RefreshAll();
  72. return TRUE;  // return TRUE  unless you set the focus to a control
  73. }
  74. void CFangkuaiDlg::OnKey(UINT nChar) 
  75. {
  76. {
  77. switch(nChar)
  78. {
  79. case VK_NUMPAD1://左方向
  80. if(!(IsOutOfRect(1)==2))
  81. {
  82. RefreshBricks();
  83. for(int a=0;a<4;a++)//a为循环用变量
  84. CurrentBrick[a].y--;//Y表示的是横向坐标,左起为0,向左移动Y减小
  85. }
  86. break;
  87. case VK_NUMPAD3://右方向
  88. if(!(IsOutOfRect(2)==1))
  89. {
  90. RefreshBricks();
  91. for(int a=0;a<4;a++)
  92. CurrentBrick[a].y++;//右移动Y增加
  93. }
  94. break;
  95. case VK_NUMPAD7://下落
  96. OnTimer(1);
  97. break;
  98. case VK_NUMPAD9://旋转
  99. RefreshBricks();
  100. RotateBrick();
  101. break;
  102. }
  103. myDraw();
  104. }
  105. }
  106. void CFangkuaiDlg::OnTimer(UINT nIDEvent) 
  107. {
  108. // TODO: Add your message handler code here and/or call default
  109. switch(nIDEvent)
  110. {
  111. case 1:
  112. if(GameState==RUNNING)
  113. {
  114. if(Isbottom())//如果未到底
  115. {   
  116. RefreshBricks();//刷新
  117.                
  118. for(int i=0;i<4;i++)
  119. CurrentBrick[i].x++;//方块下降X增加
  120. }
  121. else //如果到底了
  122. {
  123. IsGameOver();
  124. CanEraseALine();//消去一行
  125.             DrawNextBrick();//绘制下一个方块以提示
  126.                 GenerateABrick();//生成新的方块
  127.                 Number[0]=Number[1];
  128.                 CreateNumber();//获取随机的数据
  129. }
  130. myDraw();
  131. }
  132. break;
  133. }
  134. CDialog::OnTimer(nIDEvent);
  135. }
  136. void CFangkuaiDlg::OnPaint() 
  137. {
  138. CPaintDC dc(this); // device context for painting
  139. // TODO: Add your message handler code here
  140. dc.FillSolidRect(180,50,100,60,RGB(0,0,255));
  141. EraseALine=TRUE;
  142. myDraw();
  143. // Do not call CDialog::OnPaint() for painting messages
  144. }
  145. //////////////以下为自定义函数////////////////////////
  146. void CFangkuaiDlg::InitBricks()
  147. {
  148. for(int i=0;i<20;i++)
  149. for(int j=0;j<10;j++)
  150. MatrixOfBricks[i][j]=0;
  151. RefreshAll();
  152. }
  153. // 刷新方块区域,已看懂
  154. void CFangkuaiDlg::RefreshBricks(void)
  155. {
  156. int i;
  157. for(i=0;i<4;i++)
  158. {
  159. MatrixOfBricks[CurrentBrick[i].x][CurrentBrick[i].y]=0;//消去原先的方块
  160. LastPositionOfBrick[i].x=CurrentBrick[i].x;//记录原先位置
  161. LastPositionOfBrick[i].y=CurrentBrick[i].y;
  162. }
  163. }
  164. //旋转,已看懂
  165. void CFangkuaiDlg::RotateBrick()
  166. {
  167. int i,j;//循环变量
  168. int IndexOfCenter=0;//旋转轴的方块序号
  169. Brick CenterBrick;//用于存放中间方块的位置
  170. Brick TempBrick[4];//用于存放当前方块的位置,一旦旋转后出界,则用此恢复
  171. CenterBrick.y=0;
  172. CenterBrick.x=0;
  173. if(CurrentBrick[4].x==0) return;
  174. for(i=0;i<4;i++)
  175. {
  176. TempBrick[i].x=CurrentBrick[i].x;
  177. TempBrick[i].y=CurrentBrick[i].y;
  178. }
  179. if((CurrentBrick[0].x==CurrentBrick[1].x==CurrentBrick[2].x==CurrentBrick[3].x)
  180. ||(CurrentBrick[0].y==CurrentBrick[1].y==CurrentBrick[2].y==CurrentBrick[3].y))
  181. {//如果是长棒,则以第二块为轴心,否则以第一块为轴心
  182. CenterBrick.x=CurrentBrick[2].x;
  183. CenterBrick.y=CurrentBrick[2].y;
  184. IndexOfCenter=2;
  185. }
  186. else
  187. {
  188. CenterBrick.x=CurrentBrick[1].x;
  189. CenterBrick.y=CurrentBrick[1].y;
  190. IndexOfCenter=1;
  191. }
  192. for(i=0;i<4;i++)
  193. {
  194. if(i!=IndexOfCenter)
  195. {//逆时针旋转
  196. CurrentBrick[i].x=TempBrick[i].y-CenterBrick.y+CenterBrick.x;
  197. CurrentBrick[i].y=CenterBrick.x-TempBrick[i].x+CenterBrick.y;
  198. if((MatrixOfBricks[CurrentBrick[i].x][CurrentBrick[i].y]==2)||//如果碰底
  199. (CurrentBrick[i].y>9)||//如果右出界
  200. (CurrentBrick[i].y<0)||//如果左出界
  201. (CurrentBrick[i].x>19)||//如果下出界
  202. (CurrentBrick[i].x<0))//如果上出界
  203. {//如果已出界,则不能旋转,用备份方块还原
  204. for(j=0;j<4;j++)
  205. {
  206. CurrentBrick[j].x=TempBrick[j].x;
  207. CurrentBrick[j].y=TempBrick[j].y;
  208. }
  209. break;
  210. }
  211. }
  212. }
  213. }
  214. //是否出界,已看懂
  215. int CFangkuaiDlg::IsOutOfRect(int w)
  216. {
  217. if(w==2)//右移
  218. {
  219. for(int a=0;a<4;a++)
  220. {
  221. if((CurrentBrick[a].y>=9)//如果即将右移出界或碰到已有方块
  222. ||(MatrixOfBricks[CurrentBrick[a].x][CurrentBrick[a].y+1]==2))
  223. {
  224. return 1;//表示已到右边界
  225. }
  226. }
  227. }
  228. if(w==1)//左移
  229. {
  230. for(int a=0;a<4;a++)
  231. if((CurrentBrick[a].y<=0)//如果即将左移出界或碰到已有方块
  232. ||(MatrixOfBricks[CurrentBrick[a].x][CurrentBrick[a].y-1]==2))
  233. return 2;//表示已到左边界
  234. }
  235. return 3;//未到边界
  236. }
  237. //判断是否到底,已看懂
  238. int CFangkuaiDlg::Isbottom()
  239. {
  240. BrickAtBottom=TRUE;
  241. for(int a=0;a<4;a++)
  242. {
  243. if(CurrentBrick[a].x==19)//如果当前方块已经到了最底端,X是纵向的坐标
  244. {
  245. for(int c=0;c<4;c++)
  246. MatrixOfBricks[CurrentBrick[c].x][CurrentBrick[c].y]=2;//2表示不再自由下落
  247. return 0;//到底了
  248. }
  249. if(MatrixOfBricks[CurrentBrick[a].x+1][CurrentBrick[a].y]==2)//如果当前方块碰到了别的方块
  250. {  
  251. for(int c=0;c<4;c++)
  252. MatrixOfBricks[CurrentBrick[c].x][CurrentBrick[c].y]=2;//2表示不再自由下落
  253.    
  254. return 0;//到底了
  255. }
  256. }
  257. BrickAtBottom=FALSE;
  258. return 1;
  259. }
  260. //消行,判断是否游戏结束,已看懂
  261. void CFangkuaiDlg::CanEraseALine()
  262. {
  263. int flagover=0;
  264. //int i=1;  //用于对等级进行判断
  265. TCHAR m_strValue[200];
  266. for(int a=19;a>=0;a--)
  267. {
  268. flagover=0;
  269. /////////////////////////////////
  270. /////判断是否有一行可消去////////
  271. /////////////////////////////////
  272. for(int b=0;b<10;b++)
  273. {
  274. if(MatrixOfBricks[a][b]==2)
  275. {
  276. flagover++;
  277. }
  278. }
  279. //////如果可消去////////////////
  280. if(flagover==10)
  281. {
  282. EraseALine=TRUE;
  283. for(int t=a;t>0;t--)//方块下移
  284. {
  285. for(b=0;b<10;b++)
  286. {
  287. MatrixOfBricks[t][b]=MatrixOfBricks[t-1][b];//标识移位
  288. MatrixOfBricks[t-1][b]=0;//本位置置空
  289. }
  290.           n++;//如果可以消一行,则n值增加1
  291. a=a+1;//重新判断这一行
  292. }
  293. }
  294.    
  295. switch (n)
  296. {
  297. case 5:
  298. Level=1;
  299. break;
  300. case 10:
  301. Level=2;
  302. break;
  303. case 15:
  304. Level=3;
  305. break;
  306. case 20:
  307. Level=4;
  308. break;
  309. case 25:
  310. Level=5;
  311. break;
  312. case 30:
  313. Level=6;
  314. break;
  315. case 35:
  316. Level=7;
  317. break;
  318. case 40:
  319. Level=8;
  320. break;
  321. case 45:
  322. Level=9;
  323. break;
  324.     } //对等级进行计数判断
  325.   TimerInterval=5000/20-Level*25;//重新设定时间间隔以适合不同等级
  326.   SetTimer(1,TimerInterval,NULL); //重新定义记时器     
  327.    _itow(n*100,m_strValue,10 );
  328. SetDlgItemText(IDC_STATIC_NUM,m_strValue);//显示分数
  329. _itow(CFangkuaiDlg::Level,m_strValue,10 );
  330. SetDlgItemText(IDC_LEVEL,m_strValue);//显示等级数
  331. //////////////////////////////
  332. /////////判断结束/////////////
  333. //////////////////////////////
  334. }
  335. void CFangkuaiDlg::IsGameOver()
  336. {
  337. int a;
  338. for(a=0;a<9;a++)
  339. {
  340. if(MatrixOfBricks[0][a]==2)//如果任一列到顶
  341. {
  342. GameState=STOP;
  343. KillTimer(1);//停计时器
  344. MessageBox(_T("Game Over!"));
  345. InitBricks();
  346. myDraw();
  347. return;
  348. }
  349. }
  350. }
  351. //初始化,已看懂
  352. void CFangkuaiDlg::CreateNumber()
  353. {
  354.   
  355.  Number[1]=rand()%7;
  356. }
  357. void CFangkuaiDlg::GenerateABrick()
  358. {
  359. switch (Number[0])
  360. {
  361. case 1://-----//
  362. CurrentBrick[0].x=0;
  363. CurrentBrick[0].y=4;
  364. CurrentBrick[1].x=0;
  365. CurrentBrick[1].y=5;
  366. CurrentBrick[2].x=0;
  367. CurrentBrick[2].y=3;
  368. CurrentBrick[3].x=0;
  369. CurrentBrick[3].y=2;
  370. CurrentBrick[4].x=1;
  371. break;
  372. case 2:
  373. CurrentBrick[0].x=0;
  374. CurrentBrick[0].y=4;
  375. CurrentBrick[1].x=0;
  376. CurrentBrick[1].y=5;
  377. CurrentBrick[2].x=1;
  378. CurrentBrick[2].y=5;
  379. CurrentBrick[3].x=1;
  380. CurrentBrick[3].y=6;
  381. CurrentBrick[4].x=2;
  382. break;
  383. case 3:
  384. CurrentBrick[0].x=1;
  385. CurrentBrick[0].y=4;
  386. CurrentBrick[1].x=1;
  387. CurrentBrick[1].y=5;
  388. CurrentBrick[2].x=0;
  389. CurrentBrick[2].y=5;
  390. CurrentBrick[3].x=0;
  391. CurrentBrick[3].y=6;
  392. CurrentBrick[4].x=3;
  393. break;
  394. case 4:
  395. CurrentBrick[0].x=0;
  396. CurrentBrick[0].y=4;
  397. CurrentBrick[1].x=0;
  398. CurrentBrick[1].y=5;
  399. CurrentBrick[2].x=0;
  400. CurrentBrick[2].y=6;
  401. CurrentBrick[3].x=1;
  402. CurrentBrick[3].y=6;
  403. CurrentBrick[4].x=4;
  404. break;
  405. case 5:
  406. CurrentBrick[0].x=1;
  407. CurrentBrick[0].y=4;
  408. CurrentBrick[1].x=1;
  409. CurrentBrick[1].y=5;
  410. CurrentBrick[2].x=1;
  411. CurrentBrick[2].y=6;
  412. CurrentBrick[3].x=0;
  413. CurrentBrick[3].y=6;
  414. CurrentBrick[4].x=5;
  415. break;
  416. case 6:
  417. CurrentBrick[0].x=0;
  418. CurrentBrick[0].y=4;
  419. CurrentBrick[1].x=1;
  420. CurrentBrick[1].y=4;
  421. CurrentBrick[2].x=1;
  422. CurrentBrick[2].y=5;
  423. CurrentBrick[3].x=1;
  424. CurrentBrick[3].y=3;
  425. CurrentBrick[4].x=6;
  426. break;
  427. case 0:
  428. CurrentBrick[0].x=0;
  429. CurrentBrick[0].y=4;
  430. CurrentBrick[1].x=0;
  431. CurrentBrick[1].y=5;
  432. CurrentBrick[2].x=1;
  433. CurrentBrick[2].y=4;
  434. CurrentBrick[3].x=1;
  435. CurrentBrick[3].y=5;
  436. CurrentBrick[4].x=0;
  437. break;
  438. }
  439. BrickAtBottom=FALSE;
  440. RefreshBricks();
  441. myDraw();
  442.    
  443. }
  444. void CFangkuaiDlg::myDraw()
  445. {
  446. int i;
  447. CDC* dc=GetDC();
  448. if(GameState!=RUNNING) 
  449. {
  450. RefreshAll();
  451. return;
  452. }
  453. else
  454. {
  455. for(i=0;i<4;i++)//在方块数组中标明当前方块
  456. {
  457. MatrixOfBricks[CurrentBrick[i].x][CurrentBrick[i].y]=1;
  458. }
  459. if(!EraseALine)//如果尚未消行
  460. {
  461. if(!BrickAtBottom)
  462. for(i=0;i<4;i++)// 清除移动前的方块痕迹
  463. {
  464. dc->FillSolidRect(LEFTMARGIN+LastPositionOfBrick[i].y*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+LastPositionOfBrick[i].x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,HIGHLIGHTCOLOR);
  465. // dc->Draw3dRect(LEFTMARGIN+LastPositionOfBrick[i].y*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+LastPositionOfBrick[i].x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,clrTopLeft, HIGHLIGHTCOLOR);
  466. }
  467. for(i=0;i<4;i++)//重绘正在下落的方块
  468. {
  469. dc->FillSolidRect(LEFTMARGIN+CurrentBrick[i].y*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+CurrentBrick[i].x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,ColorOfCurrentBrick);
  470. // dc->Draw3dRect(LEFTMARGIN+CurrentBrick[i].y*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+CurrentBrick[i].x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,clrTopLeft, ColorOfCurrentBrick);
  471. }
  472. }
  473. else
  474. {
  475. RefreshAll();
  476. EraseALine=FALSE;
  477. }
  478. }
  479. ReleaseDC(dc);
  480. }
  481. void CFangkuaiDlg::RefreshAll()
  482. {
  483. CDC* dc=GetDC();
  484. TRACE(L"GETDC:%xn",dc);
  485. TRACE(L"CYCAPTION:%xn",::GetSystemMetrics(SM_CYCAPTION));
  486. /////全部重绘//////////
  487. for(int x=0;x<20;x++)
  488. {
  489. for(int j=0;j<10;j++)
  490. {
  491. if((MatrixOfBricks[x][j]==1)||(MatrixOfBricks[x][j]==2))
  492. {
  493. dc->FillSolidRect(LEFTMARGIN+j*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,ColorOfCurrentBrick);
  494. // dc->Draw3dRect(LEFTMARGIN+j*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,clrTopLeft, ColorOfCurrentBrick);
  495. TRACE(L"Draw Bricksn");
  496. }
  497. else
  498. {
  499. dc->FillSolidRect(LEFTMARGIN+j*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,HIGHLIGHTCOLOR);
  500. // dc->Draw3dRect(LEFTMARGIN+j*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,clrTopLeft, HIGHLIGHTCOLOR);
  501. TRACE(L"Draw Backgroundn");
  502. }
  503. }
  504. }
  505. ReleaseDC(dc);
  506. ///////////////////////
  507. }
  508. void CFangkuaiDlg::Start() 
  509. {
  510. // TODO: Add your control notification handler code here
  511. Level=0;
  512.     TimerInterval=5000/20;
  513.     SetTimer(1,TimerInterval,NULL);
  514. GameState=RUNNING;
  515. InitBricks();
  516. GenerateABrick();
  517. SetDlgItemText(IDC_STATIC_NUM,L"0");
  518. SetDlgItemText(IDC_LEVEL,L"0");
  519.     CDC*dc=GetDC();
  520.     dc->FillSolidRect(180,50,100,60,RGB(0,0,255));
  521. }
  522. void CFangkuaiDlg::Stop() 
  523. {
  524. // TODO: Add your control notification handler code here
  525. GameState=STOP;
  526. KillTimer(1);//停计时器
  527. InitBricks();
  528. }
  529. void CFangkuaiDlg::Exit() 
  530. {
  531. // TODO: Add your control notification handler code here
  532. EndDialog(0);
  533. }
  534. HBRUSH CFangkuaiDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
  535. {
  536. HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  537. // TODO: Change any attributes of the DC here
  538. if(nCtlColor==CTLCOLOR_STATIC)
  539. {
  540. pDC->SelectObject(&StaticFont);
  541. pDC->SetTextColor(RGB(255,0,0));
  542. }
  543. // TODO: Return a different brush if the default is not desired
  544. return hbr;
  545. }
  546. BOOL CFangkuaiDlg::PreTranslateMessage(MSG* pMsg) 
  547. {   
  548. if (pMsg->message == WM_KEYDOWN)
  549. {
  550.        
  551. // TODO: Add your message handler code here and/or call default
  552. switch(pMsg->wParam)
  553. {   
  554.            case VK_RETURN:
  555.              return true;
  556.            case VK_SPACE:
  557.              return true;
  558. case VK_LEFT://左方向
  559. case VK_NUMPAD4:
  560. nChar=VK_NUMPAD1;
  561. OnKey( nChar) ;
  562. return  true;
  563. case VK_RIGHT://右方向
  564. case VK_NUMPAD6:
  565. nChar=VK_NUMPAD3;
  566. OnKey( nChar) ;
  567. return  true;
  568. case VK_DOWN://下落
  569. case VK_NUMPAD2:
  570. nChar=VK_NUMPAD7;
  571.             OnKey( nChar) ;
  572. return true;
  573. case VK_UP://旋转
  574. case VK_NUMPAD8:
  575. case VK_NUMPAD5:
  576. nChar=VK_NUMPAD9;
  577. OnKey( nChar) ;
  578.            return  true;
  579. }
  580. }
  581.   
  582. return CDialog::PreTranslateMessage(pMsg);
  583. }
  584. void CFangkuaiDlg::OnGameOver() 
  585. {
  586. TCHAR m_strValue[200];
  587. if(GameState==STOP)
  588. Exit();
  589. else
  590. Stop();
  591.     _itow(0,m_strValue,10 );
  592. SetDlgItemText(IDC_STATIC_NUM,m_strValue);
  593.     SetDlgItemText(IDC_LEVEL,m_strValue);
  594.     CDC*dc=GetDC();
  595.     dc->FillSolidRect(180,50,100,60,RGB(0,0,255));
  596. return;
  597. }
  598. void CFangkuaiDlg::OnGameStart() 
  599. {
  600. Start();
  601. Number[0]=rand()%7;
  602. Number[1]=rand()%7;
  603. return;
  604. }
  605. void CFangkuaiDlg::OnUp() 
  606. {
  607. if(GameState==RUNNING) 
  608. {
  609. nChar=VK_NUMPAD9;
  610.     OnKey( nChar) ;
  611. }
  612. // TODO: Add your control notification handler code here
  613. }
  614. void CFangkuaiDlg::OnDown() 
  615. {
  616. if(GameState==RUNNING) 
  617. {nChar=VK_NUMPAD7;
  618. OnKey( nChar) ;
  619. }
  620. // TODO: Add your control notification handler code here
  621. }
  622. void CFangkuaiDlg::OnLeft() 
  623. {  if(GameState==RUNNING) 
  624. {
  625. nChar=VK_NUMPAD1;
  626. OnKey( nChar) ;
  627. }
  628. // TODO: Add your control notification handler code here
  629. }
  630. void CFangkuaiDlg::OnRight() 
  631. { if(GameState==RUNNING) 
  632. {nChar=VK_NUMPAD3;
  633.     OnKey( nChar) ;
  634. }
  635. // TODO: Add your control notification handler code here
  636. }
  637. void CFangkuaiDlg::DrawNextBrick()
  638. {
  639. CDC*dc=GetDC();
  640. int i;
  641. if(GameState==RUNNING) 
  642. {
  643. switch (Number[1])
  644. {
  645. case 1://-----//
  646. CFangkuaiDlg::CurrentBrick[0].x=0;
  647. CFangkuaiDlg:: CurrentBrick[0].y=4;
  648. CFangkuaiDlg:: CurrentBrick[1].x=0;
  649. CFangkuaiDlg:: CurrentBrick[1].y=5;
  650. CFangkuaiDlg:: CurrentBrick[2].x=0;
  651. CFangkuaiDlg:: CurrentBrick[2].y=3;
  652. CFangkuaiDlg:: CurrentBrick[3].x=0;
  653. CFangkuaiDlg:: CurrentBrick[3].y=2;
  654. CFangkuaiDlg:: CurrentBrick[4].x=1;
  655. break;
  656. case 2:
  657. CFangkuaiDlg:: CurrentBrick[0].x=0;
  658. CFangkuaiDlg:: CurrentBrick[0].y=4;
  659. CFangkuaiDlg:: CurrentBrick[1].x=0;
  660. CFangkuaiDlg:: CurrentBrick[1].y=5;
  661. CFangkuaiDlg:: CurrentBrick[2].x=1;
  662. CFangkuaiDlg:: CurrentBrick[2].y=5;
  663. CFangkuaiDlg:: CurrentBrick[3].x=1;
  664. CFangkuaiDlg:: CurrentBrick[3].y=6;
  665. CFangkuaiDlg:: CurrentBrick[4].x=2;
  666. break;
  667. case 3:
  668. CFangkuaiDlg:: CurrentBrick[0].x=1;
  669. CFangkuaiDlg:: CurrentBrick[0].y=4;
  670. CFangkuaiDlg:: CurrentBrick[1].x=1;
  671. CFangkuaiDlg:: CurrentBrick[1].y=5;
  672. CFangkuaiDlg:: CurrentBrick[2].x=0;
  673. CFangkuaiDlg:: CurrentBrick[2].y=5;
  674. CFangkuaiDlg:: CurrentBrick[3].x=0;
  675. CFangkuaiDlg:: CurrentBrick[3].y=6;
  676. CFangkuaiDlg:: CurrentBrick[4].x=3;
  677. break;
  678. case 4:
  679. CFangkuaiDlg:: CurrentBrick[0].x=0;
  680. CFangkuaiDlg:: CurrentBrick[0].y=4;
  681. CFangkuaiDlg:: CurrentBrick[1].x=0;
  682. CFangkuaiDlg:: CurrentBrick[1].y=5;
  683. CFangkuaiDlg:: CurrentBrick[2].x=0;
  684. CFangkuaiDlg:: CurrentBrick[2].y=6;
  685. CFangkuaiDlg:: CurrentBrick[3].x=1;
  686. CFangkuaiDlg:: CurrentBrick[3].y=6;
  687. CFangkuaiDlg:: CurrentBrick[4].x=4;
  688. break;
  689. case 5:
  690. CFangkuaiDlg:: CurrentBrick[0].x=1;
  691. CFangkuaiDlg:: CurrentBrick[0].y=4;
  692. CFangkuaiDlg:: CurrentBrick[1].x=1;
  693. CFangkuaiDlg:: CurrentBrick[1].y=5;
  694. CFangkuaiDlg:: CurrentBrick[2].x=1;
  695. CFangkuaiDlg:: CurrentBrick[2].y=6;
  696. CFangkuaiDlg:: CurrentBrick[3].x=0;
  697. CFangkuaiDlg:: CurrentBrick[3].y=6;
  698. CFangkuaiDlg:: CurrentBrick[4].x=5;
  699. break;
  700. case 6:
  701. CFangkuaiDlg:: CurrentBrick[0].x=0;
  702. CFangkuaiDlg:: CurrentBrick[0].y=4;
  703. CFangkuaiDlg:: CurrentBrick[1].x=1;
  704. CFangkuaiDlg:: CurrentBrick[1].y=4;
  705. CFangkuaiDlg:: CurrentBrick[2].x=1;
  706. CFangkuaiDlg:: CurrentBrick[2].y=5;
  707. CFangkuaiDlg:: CurrentBrick[3].x=1;
  708. CFangkuaiDlg:: CurrentBrick[3].y=3;
  709. CFangkuaiDlg:: CurrentBrick[4].x=6;
  710. break;
  711. case 0:
  712. CFangkuaiDlg:: CurrentBrick[0].x=0;
  713. CFangkuaiDlg:: CurrentBrick[0].y=4;
  714. CFangkuaiDlg:: CurrentBrick[1].x=0;
  715. CFangkuaiDlg:: CurrentBrick[1].y=5;
  716. CFangkuaiDlg:: CurrentBrick[2].x=1;
  717. CFangkuaiDlg:: CurrentBrick[2].y=4;
  718. CFangkuaiDlg:: CurrentBrick[3].x=1;
  719. CFangkuaiDlg:: CurrentBrick[3].y=5;
  720. CFangkuaiDlg:: CurrentBrick[4].x=0;
  721. break;
  722. }
  723. dc->FillSolidRect(180,50,100,60,RGB(0,0,255));
  724. for(i=0;i<4;i++)
  725. {
  726. dc->FillSolidRect(175+ CFangkuaiDlg:: CurrentBrick[i].y*CFangkuaiDlg::WIDTHOFBRICKS,80+CFangkuaiDlg::CurrentBrick[i].x*CFangkuaiDlg::HEIGHTOFBRICKS,CFangkuaiDlg::WIDTHOFBRICKS,CFangkuaiDlg::HEIGHTOFBRICKS,RGB(255, 100, 140));
  727. }
  728. }
  729. }
  730. void CFangkuaiDlg::OnPause() 
  731. {
  732. if(GameState==RUNNING) 
  733. {
  734. GameState=PAUSED;
  735. myDraw();
  736. }
  737. else if(GameState==PAUSED)
  738. GameState=RUNNING;
  739. // TODO: Add your control notification handler code here
  740. }
  741. int CFangkuaiDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  742. {
  743. if (CDialog::OnCreate(lpCreateStruct) == -1)
  744. return -1;
  745. // TODO: Add your specialized creation code here
  746. return 0;
  747. }
  748. void CFangkuaiDlg::OnStaticNum() 
  749. {
  750. // TODO: Add your control notification handler code here
  751. }