📄 fangkuaidlg.cpp
字号:
// fangkuaiDlg.cpp : implementation file
//
#include "stdafx.h"
#include "fangkuai.h"
#include "fangkuaiDlg.h"
UINT nChar;
int Angle=0;
int n=0;
int Number[2];
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CFangkuaiDlg dialog
CFangkuaiDlg::CFangkuaiDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFangkuaiDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CFangkuaiDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CFangkuaiDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFangkuaiDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFangkuaiDlg, CDialog)
//{{AFX_MSG_MAP(CFangkuaiDlg)
ON_BN_CLICKED(IDC_GameOver, OnGameOver)
ON_BN_CLICKED(IDC_GameStart, OnGameStart)
ON_BN_CLICKED(IDC_PAUSE, OnPause)
ON_BN_CLICKED(IDC_UP, OnUp)
ON_BN_CLICKED(IDC_LEFT, OnLeft)
ON_BN_CLICKED(IDC_DOWN, OnDown)
ON_BN_CLICKED(IDC_RIGHT, OnRight)
ON_BN_CLICKED(IDC_STATIC_NUM, OnStaticNum)
ON_WM_CREATE()
ON_WM_PAINT()
ON_WM_TIMER()
ON_WM_CTLCOLOR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFangkuaiDlg message handlers
BOOL CFangkuaiDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CenterWindow(GetDesktopWindow()); // center to the hpc screen
// TODO: Add extra initialization here
Number[0]=rand()%7;
Number[1]=rand()%7;
SetDlgItemText(IDC_PAUSE,TEXT("暂停"));
CRect rt;
GetClientRect(&rt);
WIDTHOFBRICKS=((rt.right -rt.left )-LEFTMARGIN)/10;
HEIGHTOFBRICKS=((rt.bottom -rt.top )-TOPMARGIN*2-::GetSystemMetrics(SM_CYCAPTION))/20;
WIDTHOFBRICKS=HEIGHTOFBRICKS=min(WIDTHOFBRICKS,HEIGHTOFBRICKS);
TRACE(L"HEIGHTOFBRICKS:%d\n",HEIGHTOFBRICKS);
BrickAtBottom=FALSE;
EraseAline=FALSE;
Level=0;
TimerInterval=10000/20;
GameState=STOP;
InitBricks();
RefreshAll();
return TRUE; // return TRUE unless you set the focus to a control
}
void CFangkuaiDlg::InitBricks(void)
{
for(int i=0;i<20;i++)
for(int j=0;j<10;j++)
MatrixOfBricks[i][j]=0;
RefreshAll();
}
void CFangkuaiDlg::OnKey(UINT nChar)
{
{
switch(nChar)
{
case VK_NUMPAD1:
if(!(IsOutOfRect(1)==2))
{
RefreshBricks();
for(int a=0;a<4;a++)
CurrentBrick[a].y--;
}
break;
case VK_NUMPAD3:
if(!(IsOutOfRect(2)==1))
{
RefreshBricks();
for(int a=0;a<4;a++)
CurrentBrick[a].y++;
}
break;
case VK_NUMPAD7:
OnTimer(1);
break;
case VK_NUMPAD9:
RefreshBricks();
RotateBrick();
break;
}
myDraw();
}
}
void CFangkuaiDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch(nIDEvent)
{
case 1:
if(GameState==RUNNING)
{
if(Isbottom())
{
RefreshBricks();
for(int i=0;i<4;i++)
CurrentBrick[i].x++;
}
else
{
IsGameOver();
CanEraseAline();
DrawNextBrick();
GenerateABrick();
Number[0]=Number[1];
CreateNumber();
}
myDraw();
}
break;
}
CDialog::OnTimer(nIDEvent);
}
void CFangkuaiDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
dc.FillSolidRect(120,30,70,40,RGB(0,0,160));
EraseAline=TRUE;
myDraw();
// Do not call CDialog::OnPaint() for painting messages
}
void CFangkuaiDlg::RefreshBricks(void)
{
int i;
for(i=0;i<4;i++)
{
MatrixOfBricks[CurrentBrick[i].x][CurrentBrick[i].y]=0;
LastPositionOfBrick[i].x=CurrentBrick[i].x;
LastPositionOfBrick[i].y=CurrentBrick[i].y;
}
}
int CFangkuaiDlg::IsOutOfRect(int w)
{
if(w==2)
{
for(int a=0;a<4;a++)
{
if((CurrentBrick[a].y>=9)||(MatrixOfBricks[CurrentBrick[a].x][CurrentBrick[a].y+1]==2))
{
return 1;
}
}
}
if(w==1)
{
for(int a=0;a<4;a++)
if((CurrentBrick[a].y<=0)||MatrixOfBricks[CurrentBrick[a].x][CurrentBrick[a].y-1]==2)
return 2;
}
return 3;
}
int CFangkuaiDlg::Isbottom()
{
BrickAtBottom=TRUE;
for(int a=0;a<4;a++)
{
if(CurrentBrick[a].x==19)
{
for(int c=0;c<4;c++)
MatrixOfBricks[CurrentBrick[c].x][CurrentBrick[c].y]=2;
return 0;//到底了
}
if(MatrixOfBricks[CurrentBrick[a].x +1][CurrentBrick[a].y]==2)
{
for(int c=0;c<4;c++)
MatrixOfBricks[CurrentBrick[c].x][CurrentBrick[c].y]=2;
return 0;
}
}
BrickAtBottom=FALSE;
return 1;
}
void CFangkuaiDlg::CanEraseAline()
{
int flagover=0;
int y=0;
//int n=1;
TCHAR m_strValue[200];
for(int a=19;a>=0;a--)
{
flagover=0;
for(int b=0;b<10;b++)
{
if(MatrixOfBricks[a][b]==2)
flagover++;
}
if(flagover==10)
{
EraseAline=TRUE;
for(int t=a;t>0;t--)
{
for(b=0;b<10;b++)
{
MatrixOfBricks[t][b]=MatrixOfBricks[t-1][b];
MatrixOfBricks[t-1][b]=0;
}
}
y++;
a=a+1;
}
}
switch(y)
{
case 1:
n=n+1;
break;
case 2:
n=n+3;
break;
case 3:
n=n+5;
break;
case 4:
n=n+8;
break;
}
switch(n-(n%10))
{
case 10:
Level=1;
break;
case 20:
Level=2;
break;
case 30:
Level=3;
break;
case 40:
Level=4;
break;
case 50:
Level=5;
break;
case 60:
Level=6;
break;
case 70:
Level=7;
break;
case 80:
Level=8;
break;
case 90:
Level=9;
break;
case 100:
Level=10;
break;
}
if(Level>=8)
TimerInterval=180-(Level-6)*30;
else
TimerInterval=10000/20-Level*50;
SetTimer(1,TimerInterval,NULL);
_itow(n*100,m_strValue,10);
SetDlgItemText(IDC_STATIC_NUM,m_strValue);
_itow(CFangkuaiDlg::Level,m_strValue,10);
SetDlgItemText(IDC_LEVEL_NUM,m_strValue);
if(n>=100)
{
GameState=STOP;
KillTimer(1);
MessageBox(_T("哇噻!你太厉害啦!通关啦!"),_T("通关提示!!"));
InitBricks();
myDraw();
return;
}
}
void CFangkuaiDlg::IsGameOver()
{
int a;
for(a=0;a<9;a++)
{
if(MatrixOfBricks[0][a]==2)
{
CDC*dc=GetDC();
dc->FillSolidRect(120,30,70,40,RGB(0,0,160));
GameState=STOP;
KillTimer(1);
MessageBox(_T("游戏结束!"),_T("俄罗斯方块游戏"));
InitBricks();
myDraw();
return;
}
}
}
void CFangkuaiDlg::CreateNumber()
{
Number[1]=rand()%7;
}
void CFangkuaiDlg::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->FillSolidRect(LEFTMARGIN+LastPositionOfBrick[i].y*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+LastPositionOfBrick[i].x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,RGB(0,0,0));
}
for(i=0;i<4;i++)
{
dc->FillSolidRect(LEFTMARGIN+CurrentBrick[i].y*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+CurrentBrick[i].x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,ColorOfCurrentBrick);
}
}
else
{
RefreshAll();
EraseAline=FALSE;
}
}
ReleaseDC(dc);
}
void CFangkuaiDlg::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->FillSolidRect(LEFTMARGIN+j*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,ColorOfCurrentBrick);
}
else
{
// dc->FillSolidRect(LEFTMARGIN+j*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,HIGHLIGHTCOLOR);
dc->FillSolidRect(LEFTMARGIN+j*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,RGB(0,0,0));
}
}
}
ReleaseDC(dc);
}
void CFangkuaiDlg::Start()
{
// TODO: Add your control notification handler code here
Level=0;
n=0;
TimerInterval=10000/20;
SetTimer(1,TimerInterval,NULL);
GameState=RUNNING;
InitBricks();
SetDlgItemText(IDC_STATIC_NUM,L"0");
SetDlgItemText(IDC_LEVEL_NUM,L"0");
CDC*dc=GetDC();
dc->FillSolidRect(120,30,70,40,RGB(0,0,160));
DrawNextBrick();
GenerateABrick();
Number[0]=Number[1];
CreateNumber();
}
void CFangkuaiDlg::Stop()
{
// TODO: Add your control notification handler code here
GameState=STOP;
KillTimer(1);
InitBricks();
}
void CFangkuaiDlg::Exit()
{
// TODO: Add your control notification handler code here
EndDialog(0);
}
HBRUSH CFangkuaiDlg::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));
pDC->SetTextColor(RGB(0,0,255));
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
BOOL CFangkuaiDlg::PreTranslateMessage(MSG*pMsg)
{
if(pMsg->message==WM_KEYDOWN)
{
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 CFangkuaiDlg::OnGameStart()
{
// TODO: Add your control notification handler code here
SetDlgItemText(IDC_PAUSE,TEXT("暂停"));
Start();
return;
}
void CFangkuaiDlg::OnUp()
{
// TODO: Add your control notification handler code here
if(GameState==RUNNING)
{
nChar=VK_NUMPAD9;
OnKey(nChar);
}
}
void CFangkuaiDlg::OnDown()
{
// TODO: Add your control notification handler code here
if(GameState==RUNNING)
{
nChar=VK_NUMPAD7;
OnKey(nChar);
}
}
void CFangkuaiDlg::OnLeft()
{
// TODO: Add your control notification handler code here
if(GameState==RUNNING)
{
nChar=VK_NUMPAD1;
OnKey(nChar);
}
}
void CFangkuaiDlg::OnRight()
{
// TODO: Add your control notification handler code here
if(GameState==RUNNING)
{
nChar=VK_NUMPAD3;
OnKey(nChar);
}
}
void CFangkuaiDlg::OnPause()
{
// TODO: Add your control notification handler code here
if(GameState==RUNNING)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -