📄 elsgamedlg.cpp
字号:
if(CanRotate(m_nCurIndexX-mDX,m_nCurIndexY))
{
DrawCurBlock(TRUE);
m_nCurIndexX-=mDX;
DrawCurBlock(FALSE);
RotateBlock();
}
}
}
break;
case 'P':
case 'p':
OnPause();
break;
case VK_ESCAPE:
break;
default:
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}//switch
}//if
else
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
//键盘消息自己处理
BOOL CElsGameDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN)
{
OnKeyDown((UINT)pMsg->wParam,(UINT)pMsg->lParam,(UINT)pMsg->lParam);
return TRUE;
}
else
return CDialog::PreTranslateMessage(pMsg);
}
//检查是否可以移动
BOOL CElsGameDlg::CheckCanMove(int nDir)
{
int i;
CPoint pt[4];
pt[0].x=m_nCurIndexX;pt[0].y=m_nCurIndexY;
for(i=1;i<=3;i++)
{
pt[i].x=m_nCurIndexX+m_nBlockInfoArray[m_nCurBlock-1][m_nCurDir-1][i-1].x;
pt[i].y=m_nCurIndexY+m_nBlockInfoArray[m_nCurBlock-1][m_nCurDir-1][i-1].y;
}
switch(nDir)
{
case 1://down
for(i=0;i<4;i++)
{
if(pt[i].y>=18)
return FALSE;
if(m_nArray[pt[i].y+1][pt[i].x]>0)
return FALSE;
}
break;
case 2://left
for(i=0;i<4;i++)
{
if(pt[i].x<=0)
return FALSE;
if(m_nArray[pt[i].y][pt[i].x-1]>0)
return FALSE;
}
break;
case 3://right
for(i=0;i<4;i++)
{
if(pt[i].x>=9)
return FALSE;
if(m_nArray[pt[i].y][pt[i].x+1]>0)
return FALSE;
}
break;
}
return TRUE;
}
//检查当前是否可以转动
BOOL CElsGameDlg::CanRotate(int ix,int iy)
{
int i;
CPoint pt[4];
int nextDir=m_nCurDir+1;
if(nextDir>4)
nextDir=1;
///////////////////////////////////////////
pt[0].x=ix;pt[0].y=iy;
for(i=1;i<=3;i++)
{
pt[i].x=ix+m_nBlockInfoArray[m_nCurBlock-1][nextDir-1][i-1].x;
pt[i].y=iy+m_nBlockInfoArray[m_nCurBlock-1][nextDir-1][i-1].y;
}
//////////////////////////////////////////////
for(i=0;i<4;i++)
{
if((pt[i].x<0)||(pt[i].x>9)||(pt[i].y<0)||(pt[i].y>18))
return FALSE;
if(m_nArray[pt[i].y][pt[i].x]>0)
return FALSE;
}
return TRUE;
}
//转动当前块(顺时针)
void CElsGameDlg::RotateBlock()
{
DrawCurBlock(TRUE);
m_nCurDir++;
if(m_nCurDir>4)
m_nCurDir=1;
DrawCurBlock(FALSE);
}
//块数据添入矩阵
void CElsGameDlg::SetArrayBlockData()
{
m_nArray[m_nCurIndexY][m_nCurIndexX]=m_nCurBmpIndex+1;
for(int i=0;i<3;i++)
{
m_nArray[m_nCurIndexY+m_nBlockInfoArray[m_nCurBlock-1][m_nCurDir-1][i].y][m_nCurIndexX+m_nBlockInfoArray[m_nCurBlock-1][m_nCurDir-1][i].x]=m_nCurBmpIndex+1;;
}
}
//画各个方块
void CElsGameDlg::DrawTheMap()
{
int i,j;
CDC memDC;
CDC *pDC=GetDC();
memDC.CreateCompatibleDC(pDC);
if(m_bSameGraph)
memDC.SelectObject(m_BmpBlock[m_nCurBmpIndex]);
for(i=0;i<19;i++)
{
for(j=0;j<10;j++)
{
if(m_nArray[i][j]>0)
{
if(!m_bSameGraph)
memDC.SelectObject(m_BmpBlock[m_nArray[i][j]-1]);
pDC->BitBlt(j*20+m_nInitX,i*20+m_nInitY,20,20,&memDC,0,0,SRCCOPY);
}
}
}
memDC.DeleteDC();
pDC->DeleteDC();
}
//游戏界面
void CElsGameDlg::DrawGameFace()
{
CBrush br;
CDC *pDC=GetDC();
CPen pen;
CRect rc_client;
pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
if(!m_bBackGround)
{
br.CreateSolidBrush(RGB(0,0,0));
pDC->FillRect(&m_rcGame,&br);
pDC->FillRect(&m_rcNext,&br);
}
else
{
pDC->FillRect(&m_rcGame,&m_brBack);
pDC->FillRect(&m_rcNext,&m_brBack);
}
pDC->SelectObject(&pen);
GetClientRect(&rc_client);
pDC->MoveTo(1,m_nInitY-10);
pDC->LineTo(rc_client.right-1,m_nInitY-10);
rc_client.left=m_rcGame.left-3;
rc_client.right=m_rcGame.right+3;
rc_client.top=m_rcGame.top-3;
rc_client.bottom=m_rcGame.bottom+3;
pDC->Draw3dRect(rc_client,RGB(150,150,150),RGB(0,0,0));
rc_client.left=m_rcNext.left-3;
rc_client.right=m_rcNext.right+3;
rc_client.top=m_rcNext.top-3;
rc_client.bottom=m_rcNext.bottom+3;
pDC->Draw3dRect(rc_client,RGB(150,150,150),RGB(0,0,0));
br.DeleteObject();
pen.DeleteObject();
pDC->DeleteDC();
}
//初始化块信息矩阵
void CElsGameDlg::InitTheArray()
{
int i,j;
ClearArray();
//case 1:
m_nBlockInfoArray[0][0][0].x=1;m_nBlockInfoArray[0][0][0].y=0;
m_nBlockInfoArray[0][0][1].x=1;m_nBlockInfoArray[0][0][1].y=1;
m_nBlockInfoArray[0][0][2].x=0;m_nBlockInfoArray[0][0][2].y=1;
for(i=1;i<=3;i++)
{
for(j=0;j<3;j++)
{
m_nBlockInfoArray[0][i][j].x=m_nBlockInfoArray[0][0][j].x;
m_nBlockInfoArray[0][i][j].y=m_nBlockInfoArray[0][0][j].y;
}
}
//case 2:
m_nBlockInfoArray[1][0][0].x=0;m_nBlockInfoArray[1][0][0].y=1;
m_nBlockInfoArray[1][0][1].x=0;m_nBlockInfoArray[1][0][1].y=2;
m_nBlockInfoArray[1][0][2].x=0;m_nBlockInfoArray[1][0][2].y=3;
m_nBlockInfoArray[1][1][0].x=1;m_nBlockInfoArray[1][1][0].y=0;
m_nBlockInfoArray[1][1][1].x=2;m_nBlockInfoArray[1][1][1].y=0;
m_nBlockInfoArray[1][1][2].x=3;m_nBlockInfoArray[1][1][2].y=0;
m_nBlockInfoArray[1][2][0].x=0;m_nBlockInfoArray[1][2][0].y=1;
m_nBlockInfoArray[1][2][1].x=0;m_nBlockInfoArray[1][2][1].y=2;
m_nBlockInfoArray[1][2][2].x=0;m_nBlockInfoArray[1][2][2].y=3;
m_nBlockInfoArray[1][3][0].x=1;m_nBlockInfoArray[1][3][0].y=0;
m_nBlockInfoArray[1][3][1].x=2;m_nBlockInfoArray[1][3][1].y=0;
m_nBlockInfoArray[1][3][2].x=3;m_nBlockInfoArray[1][3][2].y=0;
//case 3:
m_nBlockInfoArray[2][0][0].x=0;m_nBlockInfoArray[2][0][0].y=1;
m_nBlockInfoArray[2][0][1].x=1;m_nBlockInfoArray[2][0][1].y=1;
m_nBlockInfoArray[2][0][2].x=1;m_nBlockInfoArray[2][0][2].y=2;
m_nBlockInfoArray[2][1][0].x=1; m_nBlockInfoArray[2][1][0].y=0;
m_nBlockInfoArray[2][1][1].x=0; m_nBlockInfoArray[2][1][1].y=1;
m_nBlockInfoArray[2][1][2].x=-1;m_nBlockInfoArray[2][1][2].y=1;
m_nBlockInfoArray[2][2][0].x=0;m_nBlockInfoArray[2][2][0].y=1;
m_nBlockInfoArray[2][2][1].x=1;m_nBlockInfoArray[2][2][1].y=1;
m_nBlockInfoArray[2][2][2].x=1;m_nBlockInfoArray[2][2][2].y=2;
m_nBlockInfoArray[2][3][0].x=1; m_nBlockInfoArray[2][3][0].y=0;
m_nBlockInfoArray[2][3][1].x=0; m_nBlockInfoArray[2][3][1].y=1;
m_nBlockInfoArray[2][3][2].x=-1;m_nBlockInfoArray[2][3][2].y=1;
//case 4:
m_nBlockInfoArray[3][0][0].x=0; m_nBlockInfoArray[3][0][0].y=1;
m_nBlockInfoArray[3][0][1].x=-1;m_nBlockInfoArray[3][0][1].y=1;
m_nBlockInfoArray[3][0][2].x=-1;m_nBlockInfoArray[3][0][2].y=2;
m_nBlockInfoArray[3][1][0].x=1; m_nBlockInfoArray[3][1][0].y=0;
m_nBlockInfoArray[3][1][1].x=1; m_nBlockInfoArray[3][1][1].y=1;
m_nBlockInfoArray[3][1][2].x=2; m_nBlockInfoArray[3][1][2].y=1;
m_nBlockInfoArray[3][2][0].x=0; m_nBlockInfoArray[3][2][0].y=1;
m_nBlockInfoArray[3][2][1].x=-1;m_nBlockInfoArray[3][2][1].y=1;
m_nBlockInfoArray[3][2][2].x=-1;m_nBlockInfoArray[3][2][2].y=2;
m_nBlockInfoArray[3][3][0].x=1; m_nBlockInfoArray[3][3][0].y=0;
m_nBlockInfoArray[3][3][1].x=1; m_nBlockInfoArray[3][3][1].y=1;
m_nBlockInfoArray[3][3][2].x=2; m_nBlockInfoArray[3][3][2].y=1;
//case 5:
m_nBlockInfoArray[4][0][0].x=0; m_nBlockInfoArray[4][0][0].y=1;
m_nBlockInfoArray[4][0][1].x=0; m_nBlockInfoArray[4][0][1].y=2;
m_nBlockInfoArray[4][0][2].x=1; m_nBlockInfoArray[4][0][2].y=2;
m_nBlockInfoArray[4][1][0].x=1; m_nBlockInfoArray[4][1][0].y=0;
m_nBlockInfoArray[4][1][1].x=2; m_nBlockInfoArray[4][1][1].y=0;
m_nBlockInfoArray[4][1][2].x=0; m_nBlockInfoArray[4][1][2].y=1;
m_nBlockInfoArray[4][2][0].x=1; m_nBlockInfoArray[4][2][0].y=0;
m_nBlockInfoArray[4][2][1].x=1; m_nBlockInfoArray[4][2][1].y=1;
m_nBlockInfoArray[4][2][2].x=1; m_nBlockInfoArray[4][2][2].y=2;
m_nBlockInfoArray[4][3][0].x=0; m_nBlockInfoArray[4][3][0].y=1;
m_nBlockInfoArray[4][3][1].x=-1;m_nBlockInfoArray[4][3][1].y=1;
m_nBlockInfoArray[4][3][2].x=-2;m_nBlockInfoArray[4][3][2].y=1;
//case 6:
m_nBlockInfoArray[5][0][0].x=0; m_nBlockInfoArray[5][0][0].y=1;
m_nBlockInfoArray[5][0][1].x=0; m_nBlockInfoArray[5][0][1].y=2;
m_nBlockInfoArray[5][0][2].x=-1;m_nBlockInfoArray[5][0][2].y=2;
m_nBlockInfoArray[5][1][0].x=0; m_nBlockInfoArray[5][1][0].y=1;
m_nBlockInfoArray[5][1][1].x=1; m_nBlockInfoArray[5][1][1].y=1;
m_nBlockInfoArray[5][1][2].x=2; m_nBlockInfoArray[5][1][2].y=1;
m_nBlockInfoArray[5][2][0].x=1; m_nBlockInfoArray[5][2][0].y=0;
m_nBlockInfoArray[5][2][1].x=0; m_nBlockInfoArray[5][2][1].y=1;
m_nBlockInfoArray[5][2][2].x=0; m_nBlockInfoArray[5][2][2].y=2;
m_nBlockInfoArray[5][3][0].x=-2;m_nBlockInfoArray[5][3][0].y=0;
m_nBlockInfoArray[5][3][1].x=-1;m_nBlockInfoArray[5][3][1].y=0;
m_nBlockInfoArray[5][3][2].x=0; m_nBlockInfoArray[5][3][2].y=1;
//case 7:
m_nBlockInfoArray[6][0][0].x=-1;m_nBlockInfoArray[6][0][0].y=0;
m_nBlockInfoArray[6][0][1].x=0; m_nBlockInfoArray[6][0][1].y=-1;
m_nBlockInfoArray[6][0][2].x=1; m_nBlockInfoArray[6][0][2].y=0;
m_nBlockInfoArray[6][1][0].x=0; m_nBlockInfoArray[6][1][0].y=-1;
m_nBlockInfoArray[6][1][1].x=1; m_nBlockInfoArray[6][1][1].y=0;
m_nBlockInfoArray[6][1][2].x=0; m_nBlockInfoArray[6][1][2].y=1;
m_nBlockInfoArray[6][2][0].x=-1;m_nBlockInfoArray[6][2][0].y=0;
m_nBlockInfoArray[6][2][1].x=0; m_nBlockInfoArray[6][2][1].y=1;
m_nBlockInfoArray[6][2][2].x=1; m_nBlockInfoArray[6][2][2].y=0;
m_nBlockInfoArray[6][3][0].x=0; m_nBlockInfoArray[6][3][0].y=-1;
m_nBlockInfoArray[6][3][1].x=-1;m_nBlockInfoArray[6][3][1].y=0;
m_nBlockInfoArray[6][3][2].x=0; m_nBlockInfoArray[6][3][2].y=1;
}
//随机生成新块,并刷新界面
void CElsGameDlg::CreateNewBlock()
{
m_nCurBlock=m_nNextBlock;
m_nCurDir=m_nNextDir;
if((m_nCurBlock==7)&&
((m_nCurDir==1)||(m_nCurDir==2)||(m_nCurDir==4)))
{
m_nCurIndexY=1;
m_nCurIndexX=4;
}
else
{
m_nCurIndexY=0;
m_nCurIndexX=4;
}
m_nCurBmpIndex=m_nNextBmpIndex;
//下一块信息
m_nNextBlock=rand()%7+1;
m_nNextDir=rand()%4+1;
m_nNextBmpIndex=rand()%7;
///////////////////////////
DrawCurBlock(FALSE);
if(m_bSameGraph)
DrawTheMap();
}
//检查满行
int CElsGameDlg::CheckFullLine()
{
int i,j,k;
int nSum,nCount,nNum[4];
nCount=0;
for(i=0;i<19;i++)
{
nSum=0;
for(j=0;j<10;j++)
{
if(m_nArray[i][j]>0)
nSum++;
}
if(nSum>=10)
{
nNum[nCount]=i;
nCount++;
}
}
for(i=0;i<nCount;i++)//从最高满行开始
{
for(j=nNum[i]-1;j>=0;j--)//从满行开始所有行下移
{
for(k=0;k<10;k++)
m_nArray[j+1][k]=m_nArray[j][k];
}
for(k=0;k<10;k++)
m_nArray[0][k]=0;
}
if(nCount>0)
{
m_lsumLev+=nCount;
m_lscore+=(nCount*nCount-(nCount-1))*10;
if(m_nSpeedLevel<(m_lsumLev/100))
{
m_nSpeedLevel++;
if((m_nUserSpeed+m_nSpeedLevel)>=9)
m_slevel.Format("%d",9);
else
m_slevel.Format("%d",m_nUserSpeed+m_nSpeedLevel);
UpdateData(FALSE);
KillTimer(1);
MySetTimer();
}
ShowScore();
}
return nCount;
}
//画下一方块
void CElsGameDlg::DrawNextBlock(BOOL bErase)
{
int ix,iy;
if(m_nNextBlock==2)
{
if((m_nNextDir==1)||(m_nNextDir==3))
{
ix=12;
iy=0;
}
else
{
ix=11;
iy=1;
}
}
else if((m_nNextBlock==5)&&(m_nNextDir==4))
{
ix=13;
iy=1;
}
else if((m_nNextBlock==6)&&(m_nNextDir==4))
{
ix=14;
iy=1;
}
else
{
ix=12;
iy=1;
}
DrawSingleBlock(ix,iy,bErase,m_nNextBmpIndex);
for(int i=0;i<3;i++)
DrawSingleBlock(ix+m_nBlockInfoArray[m_nNextBlock-1][m_nNextDir-1][i].x,
iy+m_nBlockInfoArray[m_nNextBlock-1][m_nNextDir-1][i].y,
bErase,m_nNextBmpIndex);
}
//检查游戏结束
BOOL CElsGameDlg::CheckOver()
{
int i;
if(m_nCurIndexY<=0)
return TRUE;
for(i=1;i<=3;i++)
{
if((m_nCurIndexY+m_nBlockInfoArray[m_nCurBlock-1][m_nCurDir-1][i-1].y)<=0)
return TRUE;
}
return FALSE;
}
//关于
void CElsGameDlg::OnAbout()
{
CAboutDlg dlg;
dlg.DoModal();
}
//显示分数和层数
void CElsGameDlg::ShowScore()
{
m_sumLev.Format("%d",m_lsumLev);
m_score.Format("%d",m_lscore);
UpdateData(FALSE);
}
//读取ini文件
void CElsGameDlg::ReadHiScore()
{
CWinApp * pApp=AfxGetApp();
m_nHiScore=0;
m_nHiScore=pApp->GetProfileInt("SCORE","HISCORE",0);
m_hiscore.Format("%d",m_nHiScore);
UpdateData(FALSE);
}
//写入ini文件
void CElsGameDlg::WriteHiScore()
{
CWinApp * pApp=AfxGetApp();
pApp->WriteProfileInt("SCORE","HISCORE",m_nHiScore);
pApp->WriteProfileInt("SCORE","HILEVEL",m_lsumLev);
}
//帮助
void CElsGameDlg::OnContents()
{
CDlgHelp dlg;
dlg.DoModal();
}
//暂停
void CElsGameDlg::OnPause()
{
if(!m_bPlaying)
return;
if(m_bPause)//active
{
m_nArray[m_nCurIndexY][m_nCurIndexX]=0;
for(int i=0;i<3;i++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -