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

📄 xunaelsfkdlg.cpp

📁 自己动手编的俄罗斯方块游戏。 具有开始、暂停、继续、结束、记分、七种图形方块的变换和不同下落速度等功能。 在游戏窗口下方设置四个用鼠标控制的按键
💻 CPP
📖 第 1 页 / 共 2 页
字号:

void CXuNaElsFKDlg::MoveOn(int n)
{
    CDC *pDC=GetDC();  ASSERT(pDC!=NULL);
	DeleteGroup(object);int b_x=object.x,b_y=object.y; 
		switch(n)
	{
		case 1:	 ChangeShape(object);				   ObjectGroup(object);  break;		
		case 2:  object.x=object.x<M-1?object.x+1:M-1;  if(check1())object.x=b_x; ObjectGroup(object);  break;
		case 3:  object.y=object.y<N-1?object.y+1:N-1;  if(check2())object.y=b_y; ObjectGroup(object);  break;
		case 4:  object.x=object.x>1?object.x-1:0;	   if(check1())object.x=b_x; ObjectGroup(object);  break;
		case 5:  object.y=object.y>1?object.y-1:0; if(check2())object.y=b_y;		ObjectGroup(object);  break;		
	}
	Show(object);
	ReleaseDC(pDC); 
}

void CXuNaElsFKDlg::ObjectGroup(OBJECT object)
{
    if(Runing==0){OnDestroy();return;}
		one(object,a1,a0);
		one(object,a3,a2);
		one(object,a5,a4);
		one(object,a7,a6);
}


void CXuNaElsFKDlg::OnCancelMode() 
{
	CDialog::OnCancelMode();
	
	// TODO: Add your message handler code here
	
}

void CXuNaElsFKDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	
	CDialog::OnChar(nChar, nRepCnt, nFlags);
}

void CXuNaElsFKDlg::OnDestroy()
{
    CXuNaElsFKDlg::OnDestroy();
	for(int i=1;i<=11;i++) KillTimer(i);
}

void CXuNaElsFKDlg::OnDraw(CDC *pDC)
{
    Shape(); int i,j;
	for(i=0;i<M;i++)for(j=0;j<N;j++)G[i][j]=0;   Runing=1;Score=0;
	object.Type=3;object.x=M/2;object.y=0;object.group=3; ZZ=1;
	
	PreView();
	Show(object);
	ChangeShape(object);
	ObjectGroup(object);
	
	if (Run_Time == 0) 
		Run_Time =500;

	SetTimer(11,Run_Time,NULL);
	pointo.x=pointo.y=0;
	ClientToScreen(&pointo);
	poinfrom=pointo;
}

void CXuNaElsFKDlg::one(OBJECT object, int a, int b)
{
    one(object.Type, object.x+b, object.y+a);
}

void CXuNaElsFKDlg::one(int Type, int i, int j)
{
    if(Runing==0){OnDestroy();return;}
	CDC *pDC=GetDC();  ASSERT(pDC!=NULL);	

	COLORREF color,L_color=RGB(0,0,0);
	switch(Type)
	{	case 0: color=L_color=BackColor;break;
		case 1: color=RGB(131,129,222); break;
		case 2: color=RGB(250,90,130);  break;
		case 3: color=RGB(40,220,250);  break;
		case 4: color=RGB(40,120,50);   break;
		case 5: color=RGB(0,250,0);     break;
		case 6: color=RGB(131,19,222);  break;
		case 7: color=RGB(120,190,30);  break;
		case 8: color=RGB(140,20,150);  break;
		case 9: color=RGB(40,120,150);  break;
		case 10: color=RGB(23,62,180);  break;
		case 11: color=RGB(131,129,22); break;
		case 12: color=RGB(20,190,130); break;
		case 13: color=RGB(40,234,220); break;
		case 14: color=RGB(140,70,150); break;
		case 15: color=RGB(30,150,40);  break;
		case 16: color=RGB(78,203,30);	break;
		case 17: color=RGB(120,100,30); break;
		case 18: color=RGB(240,70,20);  break;
		case 19: color=RGB(40,180,90);  break;
		case 20: color=RGB(123,62,180); break;
		case 21: color=RGB(120,0,20);	break;
		case 22: color=RGB(0,0,250);	break;
		case 23: color=RGB(0,250,0);	break;
		case 24: color=RGB(0,250,250);	break;
		case 25: color=RGB(250,0,0);	break;
		case 26: color=RGB(250,0,250);  break;
		case 27: color=RGB(250,250,0);	break;
		case 28: color=RGB(250,250,250);break;
	
		case 29: color=RGB(rand()%250,rand()%250,rand()%250);    break;
		case 30: color=RGB(rand()%250,rand()%250,rand()%250);    break;
		case 31: color=RGB(rand()%250,rand()%250,rand()%250);    break;
		case 32: color=RGB(rand()%250,rand()%250,rand()%250);    break;
		case 33: color=RGB(rand()%250,rand()%250,rand()%250);    break;
		case 34: color=RGB(rand()%250,rand()%250,rand()%250);    break;
	}
	CPen pen;
	CBrush brush;
	pen.CreatePen (PS_SOLID,1,L_color);		
	brush.CreateSolidBrush (color);
	pDC->SelectObject (pen);
	pDC->SelectObject (brush);

	pDC->Rectangle(X+i*r,Y+j*r+10,X+(i+1)*r,Y+(j+1)*r+10);
	DeleteObject(pen);DeleteObject(brush);
	ReleaseDC(pDC);
}

void CXuNaElsFKDlg::one(OBJECT object)
{
    Clear_away;
	one(object.Type, object.x, object.y);
}

void CXuNaElsFKDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	
	CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CXuNaElsFKDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(nIDEvent==2)
	{
		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)
	{
		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)
	{
		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)
	{
		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;}

												
	}

	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)
	{
	// TODO: Add your message handler code here
	DeleteGroup(object);
	int b_x=object.x,b_y=object.y; 			 
	object.y++;

	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;
	
		ClearUp(); PreView();

		object.x=16;object.y=10;
		object.Type=object2.Type;		
		object.group=object2.group;ZZ=ZZ2;
		a0=b0;a1=b1;a2=b2;a3=b3;a4=b4;a5=b5;a6=b6;a7=b7;

		ObjectGroup(object);

		object.Type=object3.Type;object.x=object3.x;
		object.y=object3.y;object.group=object3.group;ZZ=ZZ3;
		a0=c0;a1=c1;a2=c2;a3=c3;a4=c4;a5=c5;a6=c6;a7=c7;
	}
	else ObjectGroup(object);	
	Show(object);

	}
	//CDialog::OnTimer(nIDEvent);
}

BOOL CXuNaElsFKDlg::PreTranslateMessage(MSG *pMsg)
{
    if(WM_KEYDOWN == pMsg->message )
	{
		if(stopflag == true) return true;
		if('W' == pMsg->wParam || VK_UP == pMsg->wParam)
		{
			if(!Runing)return true;
			MoveOn(1);
			return true;
		}
		if('A' == pMsg->wParam ||  VK_LEFT == pMsg->wParam)
		{
			if(!Runing)return true;
			MoveOn(4);
			return true;
		}
		if('S' == pMsg->wParam ||  VK_DOWN == pMsg->wParam)
		{
			if(!Runing)return true;
			MoveOn(3);
			ObjectGroup(object);
			KillTimer(11);
			SetTimer(11,10,NULL); 
		}
		if('D' == pMsg->wParam ||  VK_RIGHT == pMsg->wParam)
		{
			if(!Runing)return true;
			MoveOn(2);
			return true;
		}
		
	}
	return CDialog::PreTranslateMessage(pMsg);
}

void CXuNaElsFKDlg::PreView()
{
    if(Runing==0){OnDestroy();return;}
		CTime tm=CTime::GetCurrentTime();	  		
		object2.Type=(rand()+tm.GetMinute()+tm.GetSecond())%V+1;
		object2.x=M/2;object2.y=0;
		object2.group=(tm.GetMinute()*tm.GetSecond()+rand())%7+1;
		ZZ2=(rand()+tm.GetDay()*tm.GetHour())%97;

		b0=b1=b2=b3=b4=b5=b6=b7=0;
		switch(object2.group)
		{
		case 1:   b2=0;b3=1;b4=1;b5=0;b6=1;b7=1;  break;
		case 2:   b2=0;b3=1;b4=0;b5=-1;b6=1;b7=-1;break;
		case 3:   b2=0;b3=1;b4=0;b5=-1;b6=1;b7=1; break;
		case 4:   b2=0;b3=1;b4=0;b5=2;b6=0;b7=-1; break;
		case 5:   b2=0;b3=-1;b4=1;b5=0;b6=1;b7=1; break;
		case 6:   b2=0;b3=1;b4=1;b5=0;b6=1;b7=-1; break;
		case 7:   b2=0;b3=1;b4=0;b5=2;b6=1;b7=1;  break;
		}				   
		for(int i=0;i<ZZ2;i++) ChangeShape(object2);
		if(object2.y+b3<0||object2.y+b5<0||object2.y+b7<0||object2.y<0) object2.y=object2.y+1;
		if(object2.y+b3>0&&object2.y+b5>0&&object2.y+b7>0&&object2.y>0) object2.y=0;
}

void CXuNaElsFKDlg::ReDraw()
{
    Shape();
	for(int j,i=0;i<M;i++) for(j=0;j<N;j++)
		one(G[i][j],i,j);
}

void CXuNaElsFKDlg::Shape()
{
    int line=18;int rr=4; 
	CDC *pDC=GetDC();
	ASSERT(pDC!=NULL);	
	
	CPen pen;
	pen.CreatePen (PS_SOLID,1,RGB(0,100,200));	
	CBrush brush1,brush2,brush3;
	brush1.CreateSolidBrush (RGB(10,10,10));
	brush3.CreateSolidBrush (RGB(10,10,10));
	brush2.CreateSolidBrush (BackColor);

	pDC->SelectObject (pen);
	pDC->SelectObject (brush1);
	//pDC->Rectangle(X-line,Y-line+10,X+M*r+line,Y+N*r+line+10);

	int b=line*2/3,c=b-rr; 
	pDC->SelectObject (brush3);
	//pDC->Rectangle(X-b,Y-b+10,X+M*r+b,Y+N*r+b+10);
	pDC->SelectObject (brush1);
	//pDC->Rectangle(X-c,Y-c+10,X+M*r+c,Y+N*r+c+10);

	pDC->SelectObject (brush2);
	pDC->Rectangle(X-2,Y-2+10,X+M*r+2,Y+N*r+2+10);
	DeleteObject(pen);DeleteObject(brush1);
	DeleteObject(brush2);DeleteObject(brush3);

	ReleaseDC(pDC);
}

void CXuNaElsFKDlg::Show(OBJECT object)
{
    if(Runing==0){OnDestroy();return;}
	UpdateData(true);
	m_fenshu = Score;
	UpdateData(false);
}


void CXuNaElsFKDlg::OnStart() 
{
	// TODO: Add your control notification handler code here
	CDC *pDC=GetDC();  ASSERT(pDC!=NULL);
	OnDraw(pDC);
	ReleaseDC(pDC);
}

void CXuNaElsFKDlg::OnStop() 
{
	// TODO: Add your control notification handler code here
		stopflag = true;
	SetTimer(11,100000,NULL);
	//Run_TimeTemp =0;
	return;
}

void CXuNaElsFKDlg::OnContinue() 
{
	// TODO: Add your control notification handler code here
	stopflag = false;
	SetTimer(11,Run_Time,NULL);
}

void CXuNaElsFKDlg::OnExit() 
{
	// TODO: Add your control notification handler code here
	CXuNaElsFKDlg::OnCancel();
}

void CXuNaElsFKDlg::OnYouxiimf() 
{
	CGameAboutDlg dlg;
	dlg.DoModal();
	
}

void CXuNaElsFKDlg::OnZuozheimf() 
{
	CAboutDlg dlg;
	dlg.DoModal();
}

void CAboutDlg::OnOK() 
{
	// TODO: Add extra validation here
	
	CDialog::OnOK();
}

BOOL CXuNaElsFKDlg::OnEraseBkgnd(CDC* pDC) 
{
	CBitmap Bitmap;
	CDC dcMemory;
	Bitmap.LoadBitmap(IDB_BITMAP2);   //IDB_BITMAP2
	dcMemory.CreateCompatibleDC(pDC);   
	CBitmap*   OldBitmap=dcMemory.SelectObject(&Bitmap);   
    
	pDC->BitBlt(0,0,800,700,&dcMemory,0,0,SRCCOPY);   
	
	Bitmap.DeleteObject();   
	dcMemory.SelectObject(OldBitmap);   
	dcMemory.DeleteDC();   
	ReleaseDC(pDC);   
	
	return TRUE;	
	//return CDialog::OnEraseBkgnd(pDC);
}

⌨️ 快捷键说明

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