📄 game.cpp
字号:
// Game.cpp: implementation of the CGame class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Tetris.h"
#include "Game.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CGame::CGame()
{
m_bRandomCubeColor=TRUE; //运动方块颜色随即产生
m_clrCube=RGB(255,255,200);//运动方块颜色
m_clrMaxRect=RGB(0,80,80); //最大区域颜色
m_clrDeclareRect=RGB(192,192,192); //声明区域颜色
m_clrDiamondsRect=RGB(80,80,80); //运行区域颜色
m_clrLine=RGB(50,120,50); //方格线颜色
m_clrDeclareCube=RGB(0,255,0); //声明区域的方块颜色
m_clrDeclareFont=RGB(0,0,255); //声明区域的字体颜色
m_clrGameOverFont=RGB(255,0,0); //游戏结束字体的颜色
m_Score=0; //初始分数
m_Speed=1; //初始速度
m_StepScore=0;
m_RowCount=20; //行数
m_ColCount=10; //列数
EndFlag=false; //运行结束标志
m_pMemDC=new CDC; //内存DC
m_pBitmap=new CBitmap; //存放内存图画
m_pInitialMemDC=new CDC; //存放初始内存dc
m_pInitialBitmap=new CBitmap; //。。。图画
Left=0; //左边界
Top=0; //右边界
//dx=20; //方块宽度
//dy=20; //方块高度
CWinApp* pApp = AfxGetApp();
dx=pApp->GetProfileInt("Settings","方块大小",20);
dy=dx;
CountMatrix=7; //方块种类
for(int i=0;i<m_RowCount;i++)
for(int j=0;j<m_ColCount;j++)
{
DiamondsA[i][j]=0;
DiamondsB[i][j]=0;
}
for(i=0;i<4;i++)
for(int j=0;j<4;j++)
{
Cube[i][j]=0;
CubeX[i][j]=0;
}
}
CGame::~CGame()
{
delete m_pMemDC;
delete m_pBitmap;
delete m_pInitialMemDC;
delete m_pInitialBitmap;
}
int CGame::GetSpeed()
{
return(m_Speed);
}
void CGame::DrawDeclareNode(int a[][4], bool IsErase)
{
CRect rect;
CBrush brush;
CBitmap* pOldBitmap=m_pMemDC->SelectObject(m_pBitmap);
if(!IsErase) //画出要出现的图形
{
brush.CreateSolidBrush(m_clrDeclareCube);
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
if(a[i][j]==0) continue;
rect.left=DeclareRect.left+DeclareRect.Width()/2-2*dx+j*dx+1;
rect.top=DeclareRect.top+DeclareRect.Height()/2-2*dy+i*dy+1;
rect.right=rect.left+dx-1;
rect.bottom=rect.top+dy-1;
m_pMemDC->FillRect(rect,&brush);
}
}
else
{
//擦除上一图形
CBrush brush2;
brush2.CreateSolidBrush(m_clrDeclareRect); //以声明区域的颜色擦除
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
rect.left=DeclareRect.left+DeclareRect.Width()/2-2*dx+j*dx+1;
rect.top=DeclareRect.top+DeclareRect.Height()/2-2*dy+i*dy+1;
rect.right=rect.left+dx-1;
rect.bottom=rect.top+dy-1;
m_pMemDC->FillRect(rect,&brush2);
}
}
m_pMemDC->SelectObject(pOldBitmap);
}
bool CGame::Rotatable(int a[][4], CPoint p, int b[][100])
{
int tmp[4][4];
int i,j;
int k=4,l=4;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
tmp[i][j]=a[j][3-i];
CubeR[i][j]=0; //存放变换后的方块矩阵
}
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=k;i<4;i++)
for(j=l;j<4;j++)
{
CubeR[i-k][j-l]=tmp[i][j];
} //把变换后的矩阵移到左上角
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
if(CubeR[i][j]==0) continue;
if(((p.x+i)>=m_RowCount)||((p.y+j)<0)||((p.y+j)>=m_ColCount)) return false;
if(b[p.x+i][p.y+j]==1)
return false;
}
return true;
}
void CGame::LineDelete()
{
int m=0; //本次共消去的行数
bool flag=0;
for(int i=0;i<m_RowCount;i++)
{
flag=true;
for(int j=0;j<m_ColCount;j++)
if(DiamondsA[i][j]==0)
flag=false;
if(flag==true)
{
m++;
for(int k=i;k>0;k--)
{
for(int l=0;l<m_ColCount;l++)
{
DiamondsA[k][l]=DiamondsA[k-1][l];
if(DiamondsA[k][l]==0)
DrawNode(k,l,true);
else
DrawNode(k,l,false);
}
}
for(int l=0;l<m_ColCount;l++)
{
DiamondsA[0][l]=0;
DrawNode(0,l,true);
}
}
}
GenerateDiamond();
switch(m)
{
case 1:
m_Score++;
break;
case 2:
m_Score+=3;
break;
case 3:
m_Score+=6;
break;
case 4:
m_Score+=10;
break;
default:
break;
}
if(m>0)
{
int temp=m_StepScore;
m_StepScore=m_Score%50;
if(m_StepScore<temp) SetSpeed(m_Speed+1);
}
DrawDeclaration(m_Score,m_Speed);
for(i=0;i<4;i++)
for(int j=0;j<4;j++)
if(Cube[i][j]==1)
if(DiamondsA[i+CubePosition.x][j+CubePosition.y]==1)
{
EndFlag=1;
CBitmap* pOldBitmap=m_pMemDC->SelectObject(m_pBitmap);
m_pMemDC->SetTextColor(m_clrGameOverFont);
m_pMemDC->SetBkColor(m_clrDeclareRect);
m_pMemDC->TextOut(DeclareRect.right-70,DeclareRect.top+55,"游戏结束");
m_pMemDC->SetTextColor(m_clrDeclareFont);
m_pMemDC->SelectObject(pOldBitmap);
}
}
bool CGame::MeetBorder(int a[][4], int direction, CPoint p)
{
int i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i][j]==1)
DiamondsA[p.x+i][p.y+j]=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i][j]==1)
{
switch(direction)
{
case 1: //左移
if((p.y+j-1)<0) goto exit;
if(DiamondsA[p.x+i][p.y+j-1]==1) goto exit;
break;
case 2://右移
if((p.y+j+1)>=m_ColCount) goto exit;
if(DiamondsA[p.x+i][p.y+j+1]==1) goto exit;
break;
case 3://下移
if((p.x+i+1)>=m_RowCount) goto exit;
if(DiamondsA[p.x+i+1][p.y+j]==1) goto exit;
break;
case 4://变换
if(!Rotatable(a,p,DiamondsA)) goto exit;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
Cube[i][j]=CubeR[i][j];
a[i][j]=Cube[i][j];
if(Cube[i][j]==1) DiamondsA[p.x+i][p.y+j]=0;
}
return false;
break;
}
}
int x,y;
x=p.x;
y=p.y;
switch(direction)
{
case 1:
y--;break;
case 2:
y++;break;
case 3:
x++;break;
case 4:
break;
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i][j]==1)
DiamondsA[x+i][y+j]=1;
return false;
exit:
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i][j]==1)
DiamondsA[p.x+i][p.y+j]=1;
return true;
}
void CGame::DrawNode(int a[][4], bool IsErase, CPoint position)
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
if(a[i][j]==0)
continue;
else
DrawNode(position.x+i,position.y+j,IsErase);
}
void CGame::DrawNode(int i, int j, bool IsErase)
{
CRect rect;
CBrush brush;
CBitmap* pOldBitmap=m_pMemDC->SelectObject(m_pBitmap);
if(!IsErase)
{
brush.CreateSolidBrush(GetRunCubeColor());
rect.left=GameRect.left+j*dx+1;
rect.top=GameRect.top+i*dy+1;
rect.right=rect.left+dx-1;
rect.bottom=rect.top+dy-1;
m_pMemDC->FillRect(rect,&brush);
}
else
{
CBitmap* pOldInitBitmap=m_pInitialMemDC->SelectObject(m_pInitialBitmap);
rect.left=GameRect.left+j*dx+1;
rect.top=GameRect.top+i*dy+1;
rect.right=rect.left+dx-1;
rect.bottom=rect.top+dy-1;
m_pMemDC->BitBlt(rect.left,rect.top,dx,dy,m_pInitialMemDC,rect.left,rect.top,SRCCOPY);
m_pInitialMemDC->SelectObject(pOldInitBitmap);
}
m_pMemDC->SelectObject(pOldBitmap);
}
void CGame::SetPosition(int x, int y)
{
//擦除原先的区域
CBitmap* pOldBitmap=m_pMemDC->SelectObject(m_pBitmap);
CBrush mybrush1;
mybrush1.CreateSolidBrush(RGB(255,255,255));
CRect myrect1(Left,Top,1024,768);
m_pMemDC->FillRect(myrect1,&mybrush1);
Left=x;
Top=y;
//画最大矩行区域的边框
CBrush borderbrush;
borderbrush.CreateSolidBrush(RGB(222,222,255));
CRect borderrect(Left,Top,Left+100+dx*m_ColCount,Top+40+dy*(m_RowCount+4));
m_pMemDC->FillRect(borderrect,&borderbrush);
//画最大的矩形区域
CBrush brush;
brush.CreateSolidBrush(m_clrMaxRect);
CRect rect(Left+2,Top+2,Left+98+dx*m_ColCount,Top+68+dy*(m_RowCount+4));
m_pMemDC->FillRect(rect,&brush);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -