📄 game.cpp
字号:
// Game.cpp: implementation of the CGame class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "HandTetris.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(64,128,128); //最大区域颜色
m_clrDeclareRect=RGB(190,190,190); //声明区域颜色
m_clrDiamondsRect=RGB(57,83,60); //运行区域颜色
m_clrLine=RGB(45,100,50); //方格线颜色
m_clrDeclareCube=RGB(0,0,0); //声明区域的方块颜色
m_clrDeclareFont=RGB(0,0,0); //声明区域的字体颜色
m_clrGameOverFont=RGB(20,20,255); //游戏结束字体的颜色
m_Score=0; //初始分数
m_Speed=5; //初始速度
m_Level=1; //初始难度
m_StepScore=0; //每到100分,难度递增
m_Music=TRUE; //音乐开关
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=10;//pApp->GetProfileInt(L"Settings",L"方块大小",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::GetLevel()
{
return(m_Level);
}
//等级为:1-10
void CGame::SetLevel(int level)
{
m_Level=level;
if(level<=8)
CountMatrix=level+6;
if(level>8) CountMatrix=14;
if(level<1) CountMatrix=7;
}
//速度为1-10,共10个等级,数越小,速度越快。
void CGame::SetSpeed(int speed)
{
m_Speed=speed;
if(m_Speed<=0) m_Speed=1;
if(m_Speed>=10) m_Speed=10;
}
//速度返回为速度等级*50,最慢为0。5秒钟/次
int CGame::GetSpeed()
{
return(m_Speed);
}
//产生上一方快Cube:存放当前方块, CubeX:下一要出现的方块
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;
case 9://以下为增加不规则方块的出现次数
CubeX[0][0]=1;
CubeX[0][1]=1;
CubeX[1][1]=1;
CubeX[2][1]=1;
break;
case 10:
CubeX[0][1]=1;
CubeX[1][0]=1;
CubeX[1][1]=1;
CubeX[2][0]=1;
break;
case 11:
CubeX[0][0]=1;
CubeX[1][0]=1;
CubeX[1][1]=1;
CubeX[1][2]=1;
CubeX[0][2]=1;
break;
case 12:
CubeX[0][0]=1;
CubeX[1][0]=1;
CubeX[2][0]=1;
CubeX[1][1]=1;
CubeX[1][2]=1;
break;
case 13:
CubeX[0][0]=1;
CubeX[0][1]=1;
CubeX[1][1]=1;
CubeX[2][1]=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); //画出下一要出现的方块
}
void CGame::MoveLeft()
{
Move(1);
}
void CGame::MoveRight()
{
Move(2);
}
void CGame::MoveNext()
{
Move(3);
}
void CGame::MoveRotate()
{
Move(4);
}
void CGame::DrawDiamonds()
{
}
void CGame::GameInit(CDC* pDC)
{
m_pMemDC->CreateCompatibleDC(pDC);
m_pBitmap->CreateCompatibleBitmap(pDC,1024,768);
CBitmap* pOldBitmap=m_pMemDC->SelectObject(m_pBitmap);
/*
//画最大矩行区域的边框
CBrush borderbrush;
borderbrush.CreateSolidBrush(RGB(222,222,255));
CRect borderrect(Left,Top,Left+100+dx*m_ColCount,Top+150+dy*m_RowCount);
m_pMemDC->FillRect(borderrect,&borderbrush);
//画最大的矩形区域
CBrush brush;
brush.CreateSolidBrush(RGB(0,128,192));//255,220,0
CRect rect(Left+2,Top+2,Left+98+dx*m_ColCount,Top+148+dy*m_RowCount);
m_pMemDC->FillRect(rect,&brush);
//画次大的矩形区域,以形成边线
CBrush brush3;
brush3.CreateSolidBrush(RGB(222,222,255));
CRect rect3(Left+48,Top+98,Left+m_ColCount*dx+52,Top+dy*m_RowCount+102);
m_pMemDC->FillRect(rect3,&brush3);
//画最里的矩形区域,即方块运行区域
CBrush brush2;
brush2.CreateSolidBrush(RGB(222,0,255));
CRect rect2(Left+50,Top+100,Left+dx*m_ColCount+50,Top+dy*m_RowCount+100);
m_pMemDC->FillRect(rect2,&brush2);
GameRect=rect2; //GameRect存放有格子的区域
//画出格子
CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(220,100,255));
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+90);
m_pMemDC->Rectangle(rect4);
CBrush brush4;
brush4.CreateSolidBrush(RGB(255,255,255));
m_pMemDC->FillRect(rect4,&brush4);
m_pMemDC->TextOut(rect4.left+10,rect4.top+15,"难 度");
m_pMemDC->TextOut(rect4.right-50,rect4.top+15,"速 度");
CString str;
str.Format("%d",m_Level);
m_pMemDC->TextOut(rect4.left+15,rect4.top+40,str);
str.Format("%d",m_Speed);
m_pMemDC->TextOut(rect4.right-40,rect4.top+40,str);
m_pMemDC->TextOut(DeclareRect.left+10,rect4.top+55,"SCORE: 0");
DeclareRect=rect4; //保存说明区域
m_pMemDC->SelectObject(pOldPen);
*/
//把当前的内存DC复制到m_pInitialMemDC和图片m_pBitmap;
m_pInitialMemDC->CreateCompatibleDC(pDC);
m_pInitialBitmap->CreateCompatibleBitmap(pDC,240,320);
CBitmap* pOldBitmap2=m_pInitialMemDC->SelectObject(m_pInitialBitmap);
m_pInitialMemDC->BitBlt(Left,Top,240,320,m_pMemDC,Left,Top,SRCCOPY);
m_pMemDC->SelectObject(pOldBitmap);
m_pInitialMemDC->SelectObject(pOldBitmap2);
SetPosition(0,0);
}
void CGame::Start()
{
m_Score=0;
m_StepScore=0;
DrawDeclaration(0,m_Speed,m_Level);
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();
//CubeAssign(CubeX,Cube);
Sleep(500);
GenerateDiamond();
DrawNode(Cube,false,CubePosition);
//Sleep(1000);
//GenerateDiamond();
}
void CGame::Draw(CDC *pDC)
{ //画方格
DrawDeclaration(m_Score,m_Speed,m_Level);
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::Move(int direction)
{
//direction=1:Move Left
//direction=2:Move Right
//direction=3:Move Next
//direction=4:Rotate
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);
//LineDelete();
break;
case 4:
DrawNode(Cube,true,CubePosition);
MeetBorder(Cube,4,CubePosition);
DrawNode(Cube,false,CubePosition);
break;
default:
break;
}
}
void CGame::DrawDeclaration(int score,int speed,int level)
{
CString str;
m_pMemDC->SetTextColor(m_clrDeclareFont);
m_pMemDC->SetBkColor(m_clrDeclareRect);
CBitmap* pOldBitmap=m_pMemDC->SelectObject(m_pBitmap);
str.Format(L"%d",level);
if(speed>=0)
{
CRect a(DeclareRect.left+15,DeclareRect.top+17,DeclareRect.right,DeclareRect.bottom);
m_pMemDC->DrawText(str,a,NULL);
//m_pMemDC->TextOut(DeclareRect.left+15,DeclareRect.top+37,str);
}
str.Format(L"%d",speed);
if(level>=0)
{
CRect a(DeclareRect.right-40,DeclareRect.top+17,DeclareRect.right,DeclareRect.bottom);
m_pMemDC->DrawText(str,a,NULL);
//m_pMemDC->TextOut(DeclareRect.right-40,DeclareRect.top+37,str);
}
str.Format(L"分数: %d",score);
if(score>=0)
{
CRect a(DeclareRect.left+10,DeclareRect.top+32,DeclareRect.right,DeclareRect.bottom);
m_pMemDC->DrawText(str,a,NULL);
//m_pMemDC->TextOut(DeclareRect.left+10,DeclareRect.top+52,str);
}
m_pMemDC->SelectObject(pOldBitmap);
//DrawDeclareNode(Cube,false);
}
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+70+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);
//画次大的矩形区域,以形成边线
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+10+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);
CRect a(rect4.left+10,rect4.top+3,rect4.right,rect4.bottom);
m_pMemDC->DrawText(L"难 度",a,NULL);
//m_pMemDC->TextOut(rect4.left+10,rect4.top+13,"难 度");
a.left=rect4.right-50;
m_pMemDC->DrawText(L"速 度",a,NULL);
//m_pMemDC->TextOut(rect4.right-50,rect4.top+13,"速 度");
CString str;
str.Format(L"%d",m_Level);
a.left=rect4.left+15;a.top=rect4.top+17;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -