📄 game.cpp
字号:
//画次大的矩形区域,以形成边线
CBrush brush3;
brush3.CreateSolidBrush(RGB(222,222,255));
CRect rect3(Left+48,Top+18+dy*4,Left+m_ColCount*dx+52,Top+dy*(m_RowCount+4)+22);
m_pMemDC->FillRect(rect3,&brush3);
//画最里的矩形区域,即方块运行区域
CBrush brush2;
brush2.CreateSolidBrush(m_clrDiamondsRect);
CRect rect2(Left+50,Top+20+4*dy,Left+dx*m_ColCount+50,Top+dy*(m_RowCount+4)+20);
m_pMemDC->FillRect(rect2,&brush2);
GameRect=rect2; //GameRect存放有格子的区域
//画出格子
CPen pen;
pen.CreatePen(PS_SOLID,1,m_clrLine);
CPen* pOldPen=m_pMemDC->SelectObject(&pen);
for(int i=0;i<m_ColCount;i++)
{
m_pMemDC->MoveTo(i*dx+GameRect.left,GameRect.top);
m_pMemDC->LineTo(i*dx+GameRect.left,GameRect.bottom);
}
for(i=0;i<m_RowCount;i++)
{
m_pMemDC->MoveTo(GameRect.left,GameRect.top+i*dy);
m_pMemDC->LineTo(GameRect.right,GameRect.top+i*dy);
}
//画出说明区域
CRect rect4(Left+5,Top+5,Left+dx*m_ColCount+95,Top+8+dy*4);
m_pMemDC->Rectangle(rect4);
CBrush brush4;
brush4.CreateSolidBrush(m_clrDeclareRect);
m_pMemDC->FillRect(rect4,&brush4); //画出声明区域
m_pMemDC->SetTextColor(m_clrDeclareFont); //设置背景色
m_pMemDC->SetBkColor(m_clrDeclareRect);
m_pMemDC->TextOut(rect4.left+10,rect4.top+13,"速 度");
CString str;
str.Format("%d",m_Speed);
m_pMemDC->TextOut(rect4.left+15,rect4.top+37,str);
m_pMemDC->TextOut(rect4.left+10,rect4.top+52,"成 绩: 0");
DeclareRect=rect4; //保存说明区域
m_pMemDC->SelectObject(pOldPen);
//把当前的内存DC复制到m_pInitialMemDC和图片m_pBitmap;
CBitmap* pOldBitmap2=m_pInitialMemDC->SelectObject(m_pInitialBitmap);
m_pInitialMemDC->BitBlt(Left,Top,1024,768,m_pMemDC,Left,Top,SRCCOPY);
m_pMemDC->SelectObject(pOldBitmap);
m_pInitialMemDC->SelectObject(pOldBitmap2);
//把刚才的状况恢复
// DrawDeclareNode(CubeX,true); //下一要运动的方块
for(i=0;i<m_RowCount;i++)
for(int j=0;j<m_ColCount;j++)
if(DiamondsA[i][j]==1)
DrawNode(i,j,false);
}
void CGame::DrawDeclaration(int score, int speed)
{
CString str;
m_pMemDC->SetTextColor(m_clrDeclareFont);
m_pMemDC->SetBkColor(m_clrDeclareRect);
CBitmap* pOldBitmap=m_pMemDC->SelectObject(m_pBitmap);
str.Format("%d",speed);
if(speed>=0)
m_pMemDC->TextOut(DeclareRect.left+15,DeclareRect.top+37,str);
str.Format("成 绩: %d",score);
if(score>=0)
m_pMemDC->TextOut(DeclareRect.left+10,DeclareRect.top+52,str);
m_pMemDC->SelectObject(pOldBitmap);
}
void CGame::Draw(CDC *pDC)
{
//画方格
DrawDeclaration(m_Score,m_Speed);
DrawDeclareNode(CubeX,false);
CBitmap* pOldBitmap=m_pMemDC->SelectObject(m_pBitmap);
pDC->BitBlt(Left,Top,Left+m_ColCount*dx+100,Top+dy*(m_RowCount+4)+70,m_pMemDC,Left,Top,SRCCOPY);
m_pMemDC->SelectObject(pOldBitmap);
}
void CGame::Start()
{
m_Score=0;
m_StepScore=0;
DrawDeclaration(0,m_Speed);
for(int i=0;i<m_RowCount;i++)
for(int j=0;j<m_ColCount;j++)
DiamondsA[i][j]=0;
SetPosition(Left,Top);
EndFlag=false;
GenerateDiamond();
Sleep(500);
GenerateDiamond();
DrawNode(Cube,false,CubePosition);
}
void CGame::GameInit(CDC *pDC)
{
m_pMemDC->CreateCompatibleDC(pDC);
m_pBitmap->CreateCompatibleBitmap(pDC,1024,768);
CBitmap* pOldBitmap=m_pMemDC->SelectObject(m_pBitmap);
//把当前的内存DC复制到m_pInitialMemDC和图片m_pBitmap;
m_pInitialMemDC->CreateCompatibleDC(pDC);
m_pInitialBitmap->CreateCompatibleBitmap(pDC,1024,768);
CBitmap* pOldBitmap2=m_pInitialMemDC->SelectObject(m_pInitialBitmap);
m_pInitialMemDC->BitBlt(Left,Top,1024,768,m_pMemDC,Left,Top,SRCCOPY);
m_pMemDC->SelectObject(pOldBitmap);
m_pInitialMemDC->SelectObject(pOldBitmap2);
SetPosition(0,0);
}
void CGame::DrawDiamonds()
{
}
void CGame::MoveRotate()
{
Move(4);
}
void CGame::MoveNext()
{
Move(3);
}
void CGame::MoveRight()
{
Move(2);
}
void CGame::MoveLeft()
{
Move(1);
}
void CGame::SetSpeed(int speed)
{
}
void CGame::GenerateDiamond()
{
int i,j;
int k=4,l=4;
CubeAssign(CubeX,Cube); //把要出现的方块变为当前方块
for(i=0;i<4;i++)
for(j=0;j<4;j++)
CubeX[i][j]=0;
srand(GetTickCount()); //初始化随即数种子
int nTemp=rand()%CountMatrix;
switch(nTemp)
{
case 0:
CubeX[0][0]=1;
CubeX[0][1]=1;
CubeX[1][0]=1;
CubeX[1][1]=1;
break;
case 1:
CubeX[0][0]=1;
CubeX[0][1]=1;
CubeX[1][0]=1;
CubeX[2][0]=1;
break;
case 2:
CubeX[0][0]=1;
CubeX[0][1]=1;
CubeX[1][1]=1;
CubeX[2][1]=1;
break;
case 3:
CubeX[0][1]=1;
CubeX[1][0]=1;
CubeX[1][1]=1;
CubeX[2][0]=1;
break;
case 4:
CubeX[0][0]=1;
CubeX[1][0]=1;
CubeX[1][1]=1;
CubeX[2][1]=1;
break;
case 5:
CubeX[0][0]=1;
CubeX[1][0]=1;
CubeX[1][1]=1;
CubeX[2][0]=1;
break;
case 6:
CubeX[0][0]=1;
CubeX[1][0]=1;
CubeX[2][0]=1;
CubeX[3][0]=1;
break;
case 7:
CubeX[0][0]=1;
CubeX[1][0]=1;
CubeX[1][1]=1;
CubeX[1][2]=1;
CubeX[0][2]=1;
break;
case 8:
CubeX[0][0]=1;
CubeX[1][0]=1;
CubeX[2][0]=1;
CubeX[1][1]=1;
CubeX[1][2]=1;
break;
}
int tmp[4][4];
//Matrix rotate randomly
nTemp=rand()%4;
for(;nTemp>=0;nTemp--)
{
for(i=0;i<4;i++)
for(j=0;j<4;j++)
tmp[i][j]=CubeX[j][3-i];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(tmp[i][j]==1)
{
if(k>i) k=i;
if(l>j) l=j;
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
CubeX[i][j]=0;
for(i=k;i<4;i++)
for(j=l;j<4;j++)
{
CubeX[i-k][j-l]=tmp[i][j];
} //把变换后的矩阵移到左上角
}
CubePosition.x=0;
CubePosition.y=m_ColCount/2;
DrawDeclareNode(Cube,true); //
DrawDeclareNode(CubeX,false); //画出下一要出现的方块
}
COLORREF CGame::GetRunCubeColor()
{
//运动方块颜色随机产生
if(m_bRandomCubeColor==FALSE)
return(m_clrCube);
srand((unsigned)time(NULL));
int nTemp=rand()%8;
switch(nTemp)
{
case 0:
m_clrCube=RGB(0,0,0);
break;
case 1:
m_clrCube=RGB(255,0,0);
break;
case 2:
m_clrCube=RGB(0,255,0);
break;
case 3:
m_clrCube=RGB(0,0,255);
break;
case 4:
m_clrCube=RGB(255,0,255);
break;
case 5:
m_clrCube=RGB(255,0,128);
break;
case 6:
m_clrCube=RGB(255,255,0);
break;
case 7:
m_clrCube=RGB(0,255,255);
break;
}
return(m_clrCube);
}
void CGame::CubeAssign(int a[][4], int b[][4])
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
b[i][j]=a[i][j];
}
void CGame::Move(int direction)
{
if(EndFlag) return;
CBitmap* pOldBitmap=m_pMemDC->SelectObject(m_pBitmap);
CRect rect;
CBrush brush;
brush.CreateSolidBrush(RGB(110,0,0));
switch(direction)
{
case 1:
if(MeetBorder(Cube,1,CubePosition)) break;
DrawNode(Cube,true,CubePosition);
CubePosition.y--;
DrawNode(Cube,false,CubePosition);
break;
case 2:
if(MeetBorder(Cube,2,CubePosition)) break;
DrawNode(Cube,true,CubePosition);
CubePosition.y++;
DrawNode(Cube,false,CubePosition);
break;
case 3:
if(MeetBorder(Cube,3,CubePosition))
{
LineDelete();
break;
}
DrawNode(Cube,true,CubePosition);
CubePosition.x++;
DrawNode(Cube,false,CubePosition);
break;
case 4:
DrawNode(Cube,true,CubePosition);
MeetBorder(Cube,4,CubePosition);
DrawNode(Cube,false,CubePosition);
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -