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

📄 gamedlg.cpp

📁 一个俄罗斯方块程序 功能齐全
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	brush4.CreateSolidBrush (color4);
	pDC->SelectObject(pen);           //把之前的再重画,以覆盖走过的痕迹,边框
/////////////////////////////////////////////////////////////////////
//  pDC->SelectObject(brush2);                   //美化添加一个边框
//	pDC->Rectangle(X+i*r,Y+j*r,X+(i+1)*r,Y+(j+1)*r);
/////////////////////////////////////////////////////////////////////


/////////
////////////////////////////////////////////

//////////////////////////////////////////////
//	if(go)
//	{
/////上边
	pDC->SelectObject(brush4);
	POINT pt_up[4]={{X+i*r,Y+j*r},{X+(i+1)*r,Y+j*r},{X+(i+1)*r-5,Y+j*r+5},{X+i*r+5,Y+j*r+5}};
	pDC->Polygon(pt_up,4);
/////左边
	pDC->SelectObject(brush);
	POINT pt_left[4]={{X+i*r,Y+j*r},{X+i*r+5,Y+j*r+5},{X+i*r+5,Y+(j+1)*r-5},{X+i*r,Y+(j+1)*r}};
    pDC->Polygon(pt_left,4);
/////右边
	pDC->SelectObject(brush2);
	POINT pt_right[4]={{X+(i+1)*r,Y+j*r},{X+(i+1)*r-5,Y+j*r+5},{X+(i+1)*r-5,Y+(j+1)*r-5},{X+(i+1)*r,Y+(j+1)*r}};
	pDC->Polygon(pt_right,4);
/////下边
	pDC->SelectObject(brush3);
	POINT pt_down[4]={{X+i*r,Y+(j+1)*r},{X+i*r+5,Y+(j+1)*r-5},{X+(i+1)*r-5,Y+(j+1)*r-5},{X+(i+1)*r,Y+(j+1)*r}};
	pDC->Polygon(pt_down,4);
//	}

////////////////////////////////////////////////////////////////////////////////
	pDC->SelectObject(brush);         //同上,矩形
	pDC->Rectangle(X+i*r+4,Y+j*r+4,X+(i+1)*r-3,Y+(j+1)*r-3);  //将对应的区域染上颜色,显示成方格
///////////////////////////////////////////////////////////

	DeleteObject(brush);
	DeleteObject(brush2);
	DeleteObject(brush3);
	DeleteObject(brush4);
	DeleteObject(pen);

 //   ReleaseDC(pDC);
/////////////////////////////////////////////////////////////////////////////////补框工作
	if(repaircount<=4) //本来3就可以,但是个别图像在刚下落时按变形还会破坏边框,所以加画一次
	{
//		repair--;
	int line =18,rr=7;	
	int b=line*2/3,c=b-rr;
//	CDC *pDC=GetDC();
	CPen pen1,pen2,pen_bk;
	pen1.CreatePen (PS_SOLID,1,RGB(43,45,57));
	pen2.CreatePen (PS_SOLID,1,RGB(53,73,162));
	pen_bk.CreatePen (PS_SOLID,1,RGB(233,230,214));
	
	CBrush brush11,brush22,brush3_up,brush_bk;
	brush11.CreateSolidBrush(RGB(53,73,162));//
	brush3_up.CreateSolidBrush(RGB(20,20,20));
	brush_bk.CreateSolidBrush(RGB(233,230,214));

	pDC->Rectangle(X-2,Z-line,X+M*r+2,Z-1);
	pDC->SelectObject (pen2);     //
	pDC->SelectObject (brush11);
	pDC->Rectangle(X-2,Z-line+1,X+M*r+2,Z-2);//
	pDC->SelectObject (pen1);
	pDC->SelectObject (brush3_up);
	POINT pt_up_bu[4]={{X-b,Z-b},{X-b+10,Z-b+7},{X+M*r+b-10,Z-b+7},{X+M*r+b,Z-b}};
	pDC->Polygon(pt_up_bu,4);
	pDC->SelectObject (pen_bk);
	pDC->SelectObject (brush_bk);
	pDC->Rectangle(X-2,0,X+M*r+2,Z-line);

	DeleteObject(pen1);
	DeleteObject(pen2);
	DeleteObject(brush11);
	DeleteObject(brush22);
	DeleteObject(brush3_up);
	}



///////////////////////////////////////////////////////////////////////////////////	
	ReleaseDC(pDC);
}


void CGameDlg::ObjectGroup(OBJECT object)//画组
{		
	if(Running==0)
	{
		OnDestroy();
		return;
	}
	one(object,a1,a0);               //调用one(OBJECT object,int a,int b)
	one(object,a3,a2);
	one(object,a5,a4);
	one(object,a7,a6);
}

void CGameDlg::DeleteGroup(OBJECT object)//删组
{		
	if(Running==0)
	{
		OnDestroy();
		return;
	}
	Clear(a0,a1); //下移一个单位后删除原位置上的图像  调用one(int Type,int i,int j)实际为重画,把原画覆盖
    one(0,object.x+a2, object.y+a3); //可用次语句代替,也Clear(a2,a3)相同
	//Clear(a2,a3);
	Clear(a4,a5);
	Clear(a6,a7);
}


void CGameDlg::ChangeShape(OBJECT object)//转组
{	
	int z[4][2] = {0};
	int i,j,k;
	if(Running==0)
	{
		OnDestroy();
		return;
	}
	do{
		switch(object.group)
		{
		case 1:  
			ZZ=0; z[1][0]=1;z[1][1]=0; z[2][0]=0;z[2][1]=1;z[3][0]=1;z[3][1]=1;break;
		case 2:  
			ZZ++; ZZ%=4;
			switch(ZZ)
			{	
			case 0:  
				z[1][0]=-1;z[1][1]=0; z[2][0]=1;z[2][1]=0;z[3][0]=-1;z[3][1]=-1;break;
			case 1:  
				z[1][0]=0;z[1][1]=1; z[2][0]=0;z[2][1]=-1;z[3][0]=1;z[3][1]=-1;break;
			case 2:  
				z[1][0]=-1;z[1][1]=0; z[2][0]=1;z[2][1]=0;z[3][0]=1;z[3][1]=1;break;
			case 3:	 
				z[1][0]=0;z[1][1]=-1; z[2][0]=0;z[2][1]=1;z[3][0]=-1;z[3][1]=1;break;
			}
			break;
		case 3:  
			ZZ++; ZZ%=4;
			switch(ZZ)
			{	
			case 0:  
				z[1][0]=-1;z[1][1]=0; z[2][0]=1;z[2][1]=0;z[3][0]=1;z[3][1]=-1;break;
			case 1:  
				z[1][0]=0;z[1][1]=1; z[2][0]=0;z[2][1]=-1;z[3][0]=1;z[3][1]=1;break;
			case 2:  
				z[1][0]=-1;z[1][1]=0; z[2][0]=1;z[2][1]=0;z[3][0]=-1;z[3][1]=1;break;
			case 3:	 
				z[1][0]=0;z[1][1]=-1; z[2][0]=0;z[2][1]=1;z[3][0]=-1;z[3][1]=-1;break;
			}
			break;
		case 4:  ZZ++; ZZ%=2;
			switch(ZZ)
			{	
			case 1:
				z[1][0]=0;z[1][1]=-1; z[2][0]=0;z[2][1]=2;z[3][0]=0;z[3][1]=1;break;
			case 0:
				z[1][0]=1;z[1][1]=0; z[2][0]=2;z[2][1]=0;z[3][0]=-1;z[3][1]=0;break;
			}
			break;
		case 5:  
			ZZ++; ZZ%=2;
		switch(ZZ)
		{	
		case 1:
			z[1][0]=0;z[1][1]=-1; z[2][0]=1;z[2][1]=0;z[3][0]=1;z[3][1]=1;break;
		case 0:
			z[1][0]=0;z[1][1]=1; z[2][0]=-1;z[2][1]=1;z[3][0]=1;z[3][1]=0;break;
		}
		break;
		case 6:  
			ZZ++; ZZ%=2;
			switch(ZZ)
			{	
			case 1:
				z[1][0]=0;z[1][1]=1; z[2][0]=1;z[2][1]=0;z[3][0]=1;z[3][1]=-1;break;
			case 0:
				z[1][0]=-1;z[1][1]=0; z[2][0]=0;z[2][1]=1;z[3][0]=1;z[3][1]=1;break;
			}
			break;
		case 7: 
			ZZ++;  ZZ%=4;
			switch(ZZ)
			{	
			case 0:
				z[1][0]=0;z[1][1]=-1; z[2][0]=1;z[2][1]=0;z[3][0]=-1;z[3][1]=0;break;
			case 1:
				z[1][0]=0;z[1][1]=1; z[2][0]=0;z[2][1]=-1;z[3][0]=1;z[3][1]=0;break;
			case 2:
				z[1][0]=0;z[1][1]=1; z[2][0]=-1;z[2][1]=0;z[3][0]=1;z[3][1]=0;break;
			case 3:
				z[1][0]=-1;z[1][1]=0; z[2][0]=0;z[2][1]=1;z[3][0]=0;z[3][1]=-1;break;
			}
			break;
		}
		int t[8];
		for(i=0,k=0;i<4;i++)
			for(j=0;j<2;j++) 
			{
				t[k]=z[i][j];
				k++;
			}
		InPut(object,t); 
	}while(check2()||check1());
}

void CGameDlg::Show(OBJECT object)  //显示某组信息 位置已调整
{	
	if(Running==0)
	{
		OnDestroy();
		return;
	}
	CDC *pDC=GetDC();  
	ASSERT(pDC!=NULL);	
	CBrush brush;
	brush.CreateSolidBrush(RGB(118,138,231));
	pDC->SelectObject(brush);
	pDC->Rectangle(m_a-10,m_b+50,m_a+90,m_b+113); //背景色
	DeleteObject(brush);

//////////////////////////////////////////////////

//////////////////////////////////////////////////

	char ch[10];

/*	pDC->SetTextColor(RGB(200,13,6));
	pDC->TextOut(m_a,m_b+30,"Type: ");
	gcvt(object.Type,10,ch); 
	pDC->TextOut(m_a+40,m_b+30,ch);
	
	pDC->SetTextColor(RGB(45,13,230));
	pDC->TextOut(m_a,m_b+50,"i: ");
	cout(object.x,m_a+20,m_b+50);
	
	pDC->TextOut(m_a+40,m_b+50,"j: ");	
	cout(object.y,m_a+60,m_b+50);
	

	pDC->SetTextColor(RGB(45,213,10));
	pDC->TextOut(m_a,m_b+70,"groups:  ");
	gcvt(object.group,10,ch); 
	pDC->TextOut(m_a+50,m_b+70,ch);
	pDC->SetTextColor(RGB(140,213,6));
	pDC->TextOut(m_a,m_b+90,"ZZ:  "); 
	cout(ZZ,m_a+50,m_b+90);
*/	
//	CFont font;
//	font.CreateFont(15,0,0,0,300,0,0,0,OEM_CHARSET,OUT_DEFAULT_PRECIS,   //20为字体大小 500为字体粗度
//	CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"楷体");//宋体楷体
//	pDC->SelectObject(font);
	pDC->SetBkMode(TRANSPARENT);  //无背景色
	pDC->SetTextColor(RGB(190,0,100));
	pDC->TextOut(m_a-5,m_b+55," 分   数:");
	pDC->SetTextColor(RGB(255,255,0));
	gcvt(Score,10,ch); 
	pDC->TextOut(m_a+50,m_b+55,ch);
	pDC->SetTextColor(RGB(190,0,100));
	pDC->TextOut(m_a-5,m_b+75,"最高分:");
	pDC->SetTextColor(RGB(255,255,0));
	gcvt(HScore,10,ch); 
	pDC->TextOut(m_a+50,m_b+75,ch);
	
//	DeleteObject(font);

	pDC->SetTextColor(RGB(190,0,100));
	pDC->TextOut(m_a-5,m_b+95," LEVEL:");
	pDC->SetTextColor(RGB(255,255,0));
	gcvt(level,10,ch); 
	pDC->TextOut(m_a+50,m_b+95,ch);

	ReleaseDC(pDC);
}


void CGameDlg::InPut(OBJECT object,int t[])//状态付值
{
	a0=t[0];
	a1=t[1];
	a2=t[2];
	a3=t[3];
	a4=t[4];
	a5=t[5];
	a6=t[6];
	a7=t[7];
}


void CGameDlg::OnTimer(UINT nIDEvent) //处理往下运动过程
{

	//+_______________________________________________
	//============================================2	         往右收埋
	if(nIDEvent==2)
	{
		////////////////////////////先暂停

	    KillTimer(11);
		MoveWindow(p1.x,p1.y,m_W,m_H);
		p1.x+=10;
		if(p1.x>desktopRect.Width())
		{
			KillTimer(2);	   
			Set=2;
			Si.left=LW-T;     
			Si.top=Sj.top;
			Si.right=LW;     
			Si.bottom=Sj.bottom;
		}
	}
	
	if(nIDEvent==6)
	{
		MoveWindow(p1.x,p1.y,m_W,m_H);
		p1.x-=10;
		if(p1.x<=pp.x) 
			KillTimer(6);
	}	
	//============================================3	    往上收埋
	if(nIDEvent==3)
	{
		////////////////////////////先暂停
		KillTimer(11);

	    
		MoveWindow(p1.x,p1.y,m_W,m_H);
		p1.y+=10;
		if(p1.y>desktopRect.Height())
		{
			KillTimer(3);    
			Set=3;
			Si.left=Sj.left; 
			Si.top=LH-T;
			Si.right=Sj.right; 
			Si.bottom=LH;
		}
	}
	
	if(nIDEvent==7)
	{
		MoveWindow(p1.x,p1.y,m_W,m_H);
		p1.y-=10;
		if(p1.y<=pp.y) 
			KillTimer(7);
	}
	//============================================1	     往下收埋
	if(nIDEvent==1)  
	{
		////////////////////////////先暂停

	    KillTimer(11);
		MoveWindow(p1.x,p1.y,m_W,m_H);
		p1.y-=10;
		if(p1.y+m_H+10<0) 
		{	
			KillTimer(1);    
			Set=1;
			Si.left=Sj.left;   
			Si.top=0;
			Si.right=Sj.right; 
			Si.bottom=T;
		}
	}
	
	if(nIDEvent==5)
	{

		MoveWindow(p1.x,p1.y,m_W,m_H);
		p1.y+=10;
		if(p1.y>=30)
			KillTimer(5);
		
	}
	//============================================4	       往左收埋
	if(nIDEvent==4)
	{
		////////////////////////////先暂停

	    KillTimer(11);
		MoveWindow(p1.x,p1.y,m_W,m_H);
		p1.x-=10;
		if(p1.x+m_W+10<0)
		{	
			KillTimer(4);    
			Set=4;
			Si.left=0;        
			Si.top=Sj.top;
			Si.right=T;     
			Si.bottom=Sj.bottom;
		}
	}
	
	if(nIDEvent==8)
	{
		MoveWindow(p1.x,p1.y,m_W,m_H);
		p1.x+=10;
		if(p1.x>=30) 
			KillTimer(8);
	}
	//____________________________________________
	if(nIDEvent==9)           //检测鼠标的位置
	{
		CPoint p2; 
		GetCursorPos(&p2);
		if(Check(p2,Si)&&Set)
		{
			SetTimer(Set+4,10,NULL);
			Set=0;
    		CString strButtonCaption;
    		m_Pause.GetWindowText(strButtonCaption);
			m_Pause.SetWindowText("继续");
		}
	}
	
	if(nIDEvent==10)       //显示窗口
	{
		CPoint p;
		GetCursorPos(&p); 
		if(p!=rectp) 
			rectp=p;
		p=ooo;  
		ClientToScreen(&p); 
		if(p!=recto) 
			recto=p;
		
		Sj.left=recto.x;     
		Sj.top=recto.y;
		Sj.right=recto.x+m_W; 
		Sj.bottom=recto.y+m_H;
	}
	//___________________________________________________________________________
	
	if(nIDEvent==11)              // 当一个方块已经完全下落后,将预画的方块显示出来
	{
		repaircount++;
//		if(repaircount==3)
//			repair=2;
		
		// TODO: Add your message handler code here
		DeleteGroup(object);
					
		int b_x=object.x,b_y=object.y; 			 
		object.y++;
//////////////////////////////////////////////////////
		CDC *pDC=GetDC();  
				ASSERT(pDC!=NULL);	
			//	CBrush brush;
			//	pDC->SetBkMode(TRANSPARENT);//无背景色
				switch(movie)
				{
				case 0:
					pDC->SetTextColor(RGB(200,73,75));
                    pDC->TextOut(m_a+5,m_b+240,"                  ");
					movie++;
					break;
				case 1:
					pDC->SetTextColor(RGB(200,73,75));
                    pDC->TextOut(m_a+5,m_b+240,"  加         ");
					movie++;
					break;
				case 2:
					pDC->SetTextColor(RGB(200,73,75));
                    pDC->TextOut(m_a+5,m_b+240,"  加油       ");
					movie++;
					break;
				case 3:
					pDC->SetTextColor(RGB(200,73,75));
                    pDC->TextOut(m_a+5,m_b+240,"  加油啊!  ");
					movie=0;
					break;
				}
				ReleaseDC(pDC);
//////////////////////////////////////////////////////
		
		pointo.x=pointo.y=0;
		ClientToScreen(&pointo);

		if(poinfrom!=pointo||Back)
		{ 
			poinfrom=pointo;
			ReDraw();
			Back=0;
		}	
		
		if(check3())
		{			
			object.y=b_y;  
			ObjectGroup(object);
			KillTimer(11);	//游戏结束暂停
			KeepData();
			
			object.Type=object2.Type;
			object.x=object2.x;
			object.y=object2.y;
			object.group=object2.group;
			ZZ=ZZ2;
			a0=b0;a1=b1;a2=b2;a3=b3;a4=b4;a5=b5;a6=b6;a7=b7;
			
			SetTimer(11,Run_Time,NULL);   
			for(int i=0;i<ZZ;i++)
				ChangeShape(object);
			
			object3.Type=object.Type;object3.x=object.x;
			object3.y=object.y;
			object3.group=object.group;
			ZZ3=ZZ;
			c0=a0;c1=a1;c2=a2;c3=a3;c4=a4;c5=a5;c6=a6;c7=a7;
			

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -