📄 brickdlg.cpp
字号:
CurrentBrick[1].y=5;
CurrentBrick[2].x=0;
CurrentBrick[2].y=5;
CurrentBrick[3].x=0;
CurrentBrick[3].y=6;
CurrentBrick[4].x=3;
break;
case 4:
CurrentBrick[0].x=0;
CurrentBrick[0].y=4;
CurrentBrick[1].x=0;
CurrentBrick[1].y=5;
CurrentBrick[2].x=0;
CurrentBrick[2].y=6;
CurrentBrick[3].x=1;
CurrentBrick[3].y=6;
CurrentBrick[4].x=4;
break;
case 5:
CurrentBrick[0].x=1;
CurrentBrick[0].y=4;
CurrentBrick[1].x=1;
CurrentBrick[1].y=5;
CurrentBrick[2].x=1;
CurrentBrick[2].y=6;
CurrentBrick[3].x=0;
CurrentBrick[3].y=6;
CurrentBrick[4].x=5;
break;
case 6:
CurrentBrick[0].x=0;
CurrentBrick[0].y=4;
CurrentBrick[1].x=1;
CurrentBrick[1].y=4;
CurrentBrick[2].x=1;
CurrentBrick[2].y=5;
CurrentBrick[3].x=1;
CurrentBrick[3].y=3;
CurrentBrick[4].x=6;
break;
case 0:
CurrentBrick[0].x=0;
CurrentBrick[0].y=4;
CurrentBrick[1].x=0;
CurrentBrick[1].y=5;
CurrentBrick[2].x=1;
CurrentBrick[2].y=4;
CurrentBrick[3].x=1;
CurrentBrick[3].y=5;
CurrentBrick[4].x=0;
break;
}
BrickAtBottom=FALSE;
RefreshBricks();
myDraw();
}
void CBrickDlg::myDraw()
{
int i;
CDC* dc=GetDC();
if(GameState!=RUNNING)
{
RefreshAll();
return;
}
else
{
for(i=0;i<4;i++)//在方块数组中标明当前方块
{
MatrixOfBricks[CurrentBrick[i].x][CurrentBrick[i].y]=1;
}
if(!EraseALine)//如果尚未消行
{
if(!BrickAtBottom)
for(i=0;i<4;i++)// 清除移动前的方块痕迹
{
dc->FillSolidRect(LEFTMARGIN+LastPositionOfBrick[i].y*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+LastPositionOfBrick[i].x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,HIGHLIGHTCOLOR);
dc->Draw3dRect(LEFTMARGIN+LastPositionOfBrick[i].y*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+LastPositionOfBrick[i].x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,clrTopLeft, HIGHLIGHTCOLOR);
}
for(i=0;i<4;i++)//重绘正在下落的方块
{
dc->FillSolidRect(LEFTMARGIN+CurrentBrick[i].y*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+CurrentBrick[i].x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,ColorOfCurrentBrick);
dc->Draw3dRect(LEFTMARGIN+CurrentBrick[i].y*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+CurrentBrick[i].x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,clrTopLeft, ColorOfCurrentBrick);
}
}
else
{
RefreshAll();
EraseALine=FALSE;
}
}
ReleaseDC(dc);
}
void CBrickDlg::RefreshAll()
{
CDC* dc=GetDC();
TRACE(L"GETDC:%x\n",dc);
TRACE(L"CYCAPTION:%x\n",::GetSystemMetrics(SM_CYCAPTION));
/////全部重绘//////////
for(int x=0;x<20;x++)
{
for(int j=0;j<10;j++)
{
if((MatrixOfBricks[x][j]==1)||(MatrixOfBricks[x][j]==2))
{
dc->FillSolidRect(LEFTMARGIN+j*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,ColorOfCurrentBrick);
dc->Draw3dRect(LEFTMARGIN+j*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,clrTopLeft, ColorOfCurrentBrick);
TRACE(L"Draw Bricks\n");
}
else
{
dc->FillSolidRect(LEFTMARGIN+j*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,HIGHLIGHTCOLOR);
dc->Draw3dRect(LEFTMARGIN+j*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,clrTopLeft, HIGHLIGHTCOLOR);
TRACE(L"Draw Background\n");
}
}
}
ReleaseDC(dc);
///////////////////////
}
void CBrickDlg::Start()
{
// TODO: Add your control notification handler code here
Level=0;
TimerInterval=5000/20;
SetTimer(1,TimerInterval,NULL);
GameState=RUNNING;
InitBricks();
GenerateABrick();
SetDlgItemText(IDC_STATIC_NUM,L"0");
SetDlgItemText(IDC_LEVEL,L"0");
CDC*dc=GetDC();
dc->FillSolidRect(180,50,100,60,RGB(0,0,255));
}
void CBrickDlg::Stop()
{
// TODO: Add your control notification handler code here
GameState=STOP;
KillTimer(1);//停计时器
InitBricks();
}
void CBrickDlg::Exit()
{
// TODO: Add your control notification handler code here
EndDialog(0);
}
HBRUSH CBrickDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if(nCtlColor==CTLCOLOR_STATIC)
{
pDC->SelectObject(&StaticFont);
pDC->SetTextColor(RGB(255,100,0));
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
BOOL CBrickDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN)
{
// TODO: Add your message handler code here and/or call default
switch(pMsg->wParam)
{
case VK_RETURN:
return true;
case VK_SPACE:
return true;
case VK_LEFT://左方向
case VK_NUMPAD4:
nChar=VK_NUMPAD1;
OnKey( nChar) ;
return true;
case VK_RIGHT://右方向
case VK_NUMPAD6:
nChar=VK_NUMPAD3;
OnKey( nChar) ;
return true;
case VK_DOWN://下落
case VK_NUMPAD2:
nChar=VK_NUMPAD7;
OnKey( nChar) ;
return true;
case VK_UP://旋转
case VK_NUMPAD8:
case VK_NUMPAD5:
nChar=VK_NUMPAD9;
OnKey( nChar) ;
return true;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
void CBrickDlg::OnGameOver()
{
TCHAR m_strValue[200];
if(GameState==STOP)
Exit();
else
Stop();
_itow(0,m_strValue,10 );
SetDlgItemText(IDC_STATIC_NUM,m_strValue);
SetDlgItemText(IDC_LEVEL,m_strValue);
CDC*dc=GetDC();
dc->FillSolidRect(180,50,100,60,RGB(0,0,255));
return;
}
void CBrickDlg::OnGameStart()
{
Start();
Number[0]=rand()%7;
Number[1]=rand()%7;
return;
}
/*void CBrickDlg::OnUpdateGameStart(CCmdUI* pCmdUI)
{
if(GameState==RUNNING)
pCmdUI->Enable(FALSE);
else
pCmdUI->Enable(TRUE);
}*/
void CBrickDlg::OnUp()
{
if(GameState==RUNNING)
{
nChar=VK_NUMPAD9;
OnKey( nChar) ;
}
// TODO: Add your control notification handler code here
}
void CBrickDlg::OnDown()
{
if(GameState==RUNNING)
{nChar=VK_NUMPAD7;
OnKey( nChar) ;
}
// TODO: Add your control notification handler code here
}
void CBrickDlg::OnLeft()
{ if(GameState==RUNNING)
{
nChar=VK_NUMPAD1;
OnKey( nChar) ;
}
// TODO: Add your control notification handler code here
}
void CBrickDlg::OnRight()
{ if(GameState==RUNNING)
{nChar=VK_NUMPAD3;
OnKey( nChar) ;
}
// TODO: Add your control notification handler code here
}
void CBrickDlg::DrawNextBrick()
{
CDC*dc=GetDC();
int i;
if(GameState==RUNNING)
{
switch (Number[1])
{
case 1://-----//
CBrickDlg::CurrentBrick[0].x=0;
CBrickDlg:: CurrentBrick[0].y=4;
CBrickDlg:: CurrentBrick[1].x=0;
CBrickDlg:: CurrentBrick[1].y=5;
CBrickDlg:: CurrentBrick[2].x=0;
CBrickDlg:: CurrentBrick[2].y=3;
CBrickDlg:: CurrentBrick[3].x=0;
CBrickDlg:: CurrentBrick[3].y=2;
CBrickDlg:: CurrentBrick[4].x=1;
break;
case 2:
CBrickDlg:: CurrentBrick[0].x=0;
CBrickDlg:: CurrentBrick[0].y=4;
CBrickDlg:: CurrentBrick[1].x=0;
CBrickDlg:: CurrentBrick[1].y=5;
CBrickDlg:: CurrentBrick[2].x=1;
CBrickDlg:: CurrentBrick[2].y=5;
CBrickDlg:: CurrentBrick[3].x=1;
CBrickDlg:: CurrentBrick[3].y=6;
CBrickDlg:: CurrentBrick[4].x=2;
break;
case 3:
CBrickDlg:: CurrentBrick[0].x=1;
CBrickDlg:: CurrentBrick[0].y=4;
CBrickDlg:: CurrentBrick[1].x=1;
CBrickDlg:: CurrentBrick[1].y=5;
CBrickDlg:: CurrentBrick[2].x=0;
CBrickDlg:: CurrentBrick[2].y=5;
CBrickDlg:: CurrentBrick[3].x=0;
CBrickDlg:: CurrentBrick[3].y=6;
CBrickDlg:: CurrentBrick[4].x=3;
break;
case 4:
CBrickDlg:: CurrentBrick[0].x=0;
CBrickDlg:: CurrentBrick[0].y=4;
CBrickDlg:: CurrentBrick[1].x=0;
CBrickDlg:: CurrentBrick[1].y=5;
CBrickDlg:: CurrentBrick[2].x=0;
CBrickDlg:: CurrentBrick[2].y=6;
CBrickDlg:: CurrentBrick[3].x=1;
CBrickDlg:: CurrentBrick[3].y=6;
CBrickDlg:: CurrentBrick[4].x=4;
break;
case 5:
CBrickDlg:: CurrentBrick[0].x=1;
CBrickDlg:: CurrentBrick[0].y=4;
CBrickDlg:: CurrentBrick[1].x=1;
CBrickDlg:: CurrentBrick[1].y=5;
CBrickDlg:: CurrentBrick[2].x=1;
CBrickDlg:: CurrentBrick[2].y=6;
CBrickDlg:: CurrentBrick[3].x=0;
CBrickDlg:: CurrentBrick[3].y=6;
CBrickDlg:: CurrentBrick[4].x=5;
break;
case 6:
CBrickDlg:: CurrentBrick[0].x=0;
CBrickDlg:: CurrentBrick[0].y=4;
CBrickDlg:: CurrentBrick[1].x=1;
CBrickDlg:: CurrentBrick[1].y=4;
CBrickDlg:: CurrentBrick[2].x=1;
CBrickDlg:: CurrentBrick[2].y=5;
CBrickDlg:: CurrentBrick[3].x=1;
CBrickDlg:: CurrentBrick[3].y=3;
CBrickDlg:: CurrentBrick[4].x=6;
break;
case 0:
CBrickDlg:: CurrentBrick[0].x=0;
CBrickDlg:: CurrentBrick[0].y=4;
CBrickDlg:: CurrentBrick[1].x=0;
CBrickDlg:: CurrentBrick[1].y=5;
CBrickDlg:: CurrentBrick[2].x=1;
CBrickDlg:: CurrentBrick[2].y=4;
CBrickDlg:: CurrentBrick[3].x=1;
CBrickDlg:: CurrentBrick[3].y=5;
CBrickDlg:: CurrentBrick[4].x=0;
break;
}
dc->FillSolidRect(180,50,100,60,RGB(0,0,255));
for(i=0;i<4;i++)
{
dc->FillSolidRect(175+ CBrickDlg:: CurrentBrick[i].y*CBrickDlg::WIDTHOFBRICKS,80+CBrickDlg::CurrentBrick[i].x*CBrickDlg::HEIGHTOFBRICKS,CBrickDlg::WIDTHOFBRICKS,CBrickDlg::HEIGHTOFBRICKS,RGB(255, 100, 140));
dc->Draw3dRect(175+ CBrickDlg:: CurrentBrick[i].y*CBrickDlg::WIDTHOFBRICKS,80+CBrickDlg::CurrentBrick[i].x*CBrickDlg::HEIGHTOFBRICKS,CBrickDlg::WIDTHOFBRICKS,CBrickDlg::HEIGHTOFBRICKS,RGB(68, 71, 140),RGB(255,100,0));
}
}
}
void CBrickDlg::OnPause()
{
if(GameState==RUNNING)
{
GameState=PAUSED;
myDraw();
}
else if(GameState==PAUSED)
GameState=RUNNING;
// TODO: Add your control notification handler code here
}
int CBrickDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -