⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 game.cpp

📁 一个很好的俄罗斯方块游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -