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

📄 game.cpp

📁 一个很好的俄罗斯方块游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	//画次大的矩形区域,以形成边线
	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 + -