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

📄 game.cpp

📁 一个wince操作系统下面的俄罗斯方块的小游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -