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

📄 gamedlg.cpp

📁 一个俄罗斯方块程序 功能齐全
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			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);


	}
}


void CGameDlg::KeepData()				//保存放好所在位置  //里面都是在停止计时器11后进行的操作
{
	G[object.x+a0][object.y+a1]=object.Type;
	G[object.x+a2][object.y+a3]=object.Type;
	G[object.x+a4][object.y+a5]=object.Type;
	G[object.x+a6][object.y+a7]=object.Type;
	
	int i,j,k,p,q,o=0;
	for(i=0;i<M;i++) 
		if(G[i][1]>0||G[i][0]>0||G[i][2]>0) //如果准备下的方块的高度大于剩余高度时会出错
		{
			Running=0;
			AfxMessageBox("游戏结束!");
			OnCancel();//OnOK();都可以实现,避免了之前的结束后选继续又出现一个窗口
			start=0; //start恢复初始值;
			Gameover dlg; 
//			dlg.DoModal();
			if(dlg.DoModal()!=IDOK) 
			{
				CGameDlg dlg;
				dlg.DoModal();
			//	return;
			}
			return;  //如果按确定就直接返回结束游戏
			//else OnCancel();
			
		}
		
	for( j = N-1; j >= 0; j--)
	{	
		for(i=0,k=0;i<M;i++) 
			if(G[i][j]>0) 
				k++;
			if(k==M)                      //如果G[i][j]>0的个数k等于行数M ,既行慢了 消去(0为背景色,其余数值对应颜色在前面定义)
			{	
				o++;                         //一次消多行的奖励得分的计数量

/////////////////////////////////////////////////////////消行特效
				G[M-1][j]=0;				
				one(G[M-1][N-1],M-1,j);
//				go=0;
				for (p=M-1;p>0;p--)
				{
					//MessageBox("as");
				for (int hangfire=0;hangfire<=30000000;hangfire++){}//用来延时   StartTimer(1000);
				for (q=0;q<M;q++)
				{
					G[q][j]=G[q+1][j];
					one(G[q][j],q,j);
					
				}
				}

//				go=1;
////////////////////////////////////////////////////////

				for(p=j;p>=1;p--)
				{
					for(q=0;q<M;q++)
					{
						G[q][p]=G[q][p-1];  //调用one(int Type,int i,int j)     画单元格,//全部下落一行,代替原来一行
						one(G[q][p],q,p);
					}
				}	
				for(q=0;q<M;q++)            //这只是在前一个for循环把所有方格(除最底下一格外)下移后,再把最顶行全部致零(由于全下一后顶部没有初始化)
				{
					G[q][0]=0;             //0即为背景色,
					one(G[q][p],q,p);     //调用one(int Type,int i,int j)     画单元格
					
				}
				j++;
				Score+=100*o;             //一次消多行加分;
				if (Score>HScore) 
				{
					HScore=Score;
					
					CFile f;//存储最高记录;
					f.Open ("D:\\Highest Score.dat",CFile::modeCreate|CFile::modeWrite);
					CArchive in(&f,CArchive::store);
					in<<HScore;
					in.Close();
					f.Close();
				}

				level=Score/1000+1;				
				if(Run_Time>100&&level>llevel)         //确保速度不会减为Run_Time不回减为零
				{  
				   if(Score!=0) Run_Time-=100;//随等级提升,速度加快
				   llevel=level;
////////////////////////////////////////////////////////////
				 CDC *pDC=GetDC();  
				ASSERT(pDC!=NULL);	
			//	CBrush brush;
				pDC->SetBkMode(TRANSPARENT);//无背景色
				switch(movie)
				{
				case 0:

					pDC->SetTextColor(RGB(250,0,0));
                    pDC->TextOut(m_a+5,m_b+240," level up! ");
					movie++;
					break;
					
				case 1:
					pDC->SetTextColor(RGB(250,0,0));
                    pDC->TextOut(m_a+5,m_b+240,"  升级了!  ");
					movie++;
					break;
				case 2:
					pDC->SetTextColor(RGB(250,0,0));
                    pDC->TextOut(m_a+5,m_b+240,"  加点速!  ");
					movie++;
					break;
				case 3:
					pDC->SetTextColor(RGB(250,0,0));
                    pDC->TextOut(m_a+5,m_b+240,"  努力啊!  ");
					movie=0;
					break;
				}
				ReleaseDC(pDC);
////////////////////////////////////////////////////////////
				}
			}
	}
}


void CGameDlg::OnDestroy()				//关闭
{
	CGameDlg::OnDestroy();  //为何出现这条语句? 屏蔽后暂无发现问题
	for(int i=1;i<=11;i++) 
		KillTimer(i);
	// TODO: Add your message handler code here	
}


void CGameDlg::PreView()					//预先显示组
{
	repaircount=1;
	if(Running==0)
	{
		OnDestroy();
		return;
	}
	CTime tm=CTime::GetCurrentTime();	  		
	object2.Type=(rand()+tm.GetMinute()+tm.GetSecond())%V+1;   //产生下一个方块颜色Type号 
	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;  //正方形(坐标从-1到2?)             
	case 2:   b2=0;b3=1;b4=0;b5=-1;b6=1;b7=-1;break;  //倒L形   23是不能相互转换的
	case 3:   b2=0;b3=1;b4=0;b5=-1;b6=1;b7=1; break;  //L形
	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;  //竖Z 左高   56是不能通过变形相互转换的
	case 6:   b2=0;b3=1;b4=1;b5=0;b6=1;b7=-1; break;  //竖Z 右高
	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 CGameDlg::OnButton1() 
{	
	start=1;
	////////////////////////读取记录
    CFile f;
	if(f.Open("D:\\Highest Score.dat",CFile::modeRead)==FALSE)
	{HScore=0;
//	return;
	}
	else
	{
		CArchive out(&f,CArchive::load);
		out>>HScore;
		out.Close();
		f.Close();
	}

//////////////
	CDC *pDC = GetDC();  
	ASSERT(pDC != NULL);
	OnDraw(pDC);
	ReleaseDC(pDC);
}


void CGameDlg::OnDown() 
{	
	if(!Running)
		return;
	MoveOn(3);
	ObjectGroup(object);
	KillTimer(11);
	CString strButtonCaption;
	m_Pause.GetWindowText(strButtonCaption);
	if(!strButtonCaption.Compare("暂停")) SetTimer(11, 20, NULL);   //禁止它在暂停时作用
}

void CGameDlg::OnLeft() 
{	
	if(!Running)
		return;
	MoveOn(4);
}

void CGameDlg::OnRight() 
{
	if(!Running)
		return;
	MoveOn(2);
}

void CGameDlg::OnUp() 
{
	if(!Running)
		return;
	MoveOn(1);
}


void CGameDlg::MoveOn(int n)
{
	// TODO: Add your message handler code here and/or call default
	CDC *pDC=GetDC();  ASSERT(pDC!=NULL);
	DeleteGroup(object);int b_x=object.x,b_y=object.y; 
	CString strButtonCaption;
	m_Pause.GetWindowText(strButtonCaption);
	
	
	switch(n)
	{
	case 1:	                              //变形
		if(!strButtonCaption.Compare("暂停")) ChangeShape(object);				   
		ObjectGroup(object);  
		break;		
	case 2:
		if(!strButtonCaption.Compare("暂停")){
		object.x = object.x < M-1 ? object.x+1 : M-1;  
		if(check1())
			object.x=b_x; }
		ObjectGroup(object);  
		break;
	case 3:  
		if(!strButtonCaption.Compare("暂停"))
		{object.y=object.y<N-1?object.y+1:N-1;  
		if(check2())
			object.y=b_y;} 
		ObjectGroup(object);  
		break;
	case 4:  
		if(!strButtonCaption.Compare("暂停")){
		object.x=object.x>1?object.x-1:0;	 
		if(check1())
			object.x=b_x; }
		ObjectGroup(object); 
		break;
	case 5:  
		if(!strButtonCaption.Compare("暂停")){
		object.y=object.y>1?object.y-1:0;
		if(check2())object.y=b_y;	}
		ObjectGroup(object); 
		break;		
	}
	
	Show(object);
	
	////////////////////////
//	SetTimer(11,Run_Time,NULL);
	////////////////////////
	ReleaseDC(pDC); 

}


void CGameDlg::ClearUp()					//清空预备显示 地方
{
	CDC *pDC=GetDC();  
	ASSERT(pDC!=NULL);
	
	COLORREF color=RGB(200,230,214);       //RGB(233,230,214)与背景色相同
	CPen pen;
	CBrush brush;
	pen.CreatePen(PS_SOLID,1,color);
	brush.CreateSolidBrush (color);
	pDC->SelectObject(pen);
	pDC->SelectObject(brush);
	pDC->Rectangle(J_x,J_y-45,J_x+100,J_y+56);      //预备显示的区域,既下一个方块的显示区域,已经调整对齐//101刚好全部覆盖
	DeleteObject(brush);
	DeleteObject(pen);
	ReleaseDC(pDC);
}

void CGameDlg::OnBackcolor()						//背景色
{

	KillTimer(11);
	CColorDialog dlg(BackColor);					//++++++++++++++
	if(dlg.DoModal()==IDOK)
		BackColor=dlg.GetColor();
	CString strButtonCaption;
    m_Pause.GetWindowText(strButtonCaption);
    if(!strButtonCaption.Compare("暂停")) SetTimer(11, Run_Time, NULL);  //在非暂停时才恢复
	Back=1;

}

void CGameDlg::ReDraw()
{
	Shape();
	for(int j,i=0;i<M;i++) 
		for(j=0;j<N;j++)
			one(G[i][j],i,j);             //调用one(int Type,int i,int j)     画单元格
}



int CGameDlg::Check(CPoint p, CRect rect)
{
	if(p.x>=rect.left&&p.x<=rect.right&&p.y>=rect.top&&p.y<=rect.bottom) 
		return 1;		
	else 
		return 0;
}



int CGameDlg::WentTo()
{
	int AB1,AB2,AB3,AB4,k,t;
	
	AB4=Sj.left; 
	AB1=Sj.top;
	AB2=LW-Sj.right; 
	AB3=LH-Sj.bottom;
	
	AB1>AB4 ? (k=AB4,t=4) : (k=AB1,t=1);
	k>AB2?(k=AB2,t=2):(k=k,t=t);
	k>AB3?(k=AB3,t=3):(k=k,t=t);
	if(k<10) 
		return t;
	else     
		return 0;
}


void CGameDlg::OnButton5() 
{
	// TODO: Add your control notification handler code here
	p1.x=p1.y=0;
	ClientToScreen(&p1); 
	pp=p1;
	SetTimer(1,10,NULL); 
	UpdateData(FALSE);
}


void CGameDlg::OnButton2() 
{
	// TODO: Add your control notification handler code here
	p1.x=p1.y=0;
	ClientToScreen(&p1); pp=p1;
	SetTimer(2,10,NULL); 
}

void CGameDlg::OnButton3() 
{
	// TODO: Add your control notification handler code here
	p1.x=p1.y=0;
	ClientToScreen(&p1); 
	pp=p1;
	SetTimer(3,10,NULL); 
}

void CGameDlg::OnButton4() 
{
	// TODO: Add your control notification handler code here
	p1.x=p1.y=0;
	ClientToScreen(&p1);
	pp=p1;
	SetTimer(4,10,NULL); 
}

void CGameDlg::OnMyself() 
{
	// TODO: Add your control notification handler code here
	CDC *pDC=GetDC();  
	ASSERT(pDC!=NULL);	
	
/*	int m_x=425,m_y=490;
	pDC->SetBkMode(TRANSPARENT);
	pDC->SetTextColor(RGB(15,113,210));
	pDC->TextOut(m_x,m_y,"2008年8月12日");
	CFont font;
	font.CreateFont(20,0,0,0,500,0,0,0,OEM_CHARSET,OUT_DEFAULT_PRECIS,   //20为字体大小 500为字体粗度
		CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"楷体");//宋体楷体
	pDC->SelectObject(font);
	pDC->SetTextColor(RGB(165,124,10));	
	pDC->TextOut(m_x,m_y+30,"作者: 修改");
	pDC->SetTextColor(RGB(165,13,170));
	pDC->TextOut(m_x,m_y+40,"");
	DeleteObject(font);
*/	
	ReleaseDC(pDC);
	Gameover dlg;
	KillTimer(11);
	if(dlg.DoModal()==IDOK) 
	{
		CDialog::OnCancel();
	}

	if(start)
	{
			
	Back=1;  //重画  //////无用,个人观点,在没有结束游戏时点次按钮然后点继续会使屏幕闪一下
	SetTimer(11,Run_Time,NULL);
	
	}
}

void CGameDlg::OnPause() 
{
	if(start)
	{
	CString strButtonCaption;
	m_Pause.GetWindowText(strButtonCaption);

	if(!strButtonCaption.Compare("暂停"))//if(pause%2)
	{

		KillTimer(11);
		m_Pause.SetWindowText("继续");
//		pause++;
	}
	
	else
	{
		SetTimer(11,Run_Time,NULL);
		m_Pause.SetWindowText("暂停");
//		pause++;
	}
	}
	
}
/*添加键盘的另一种方法
前提 所有控件为disable (禁用)
在ClassWizard为CGameDlg添加击键消息WM_KEYDOWN的消息映射函数OnKeyDown(),添加代码如下
void CGameDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{

	switch (nChar)
	{
	case '1':
		CGameDlg::OnButton1();
		break;

	case VK_LEFT:
	case 'J':
	case 'j':
		CGameDlg::OnLeft(); 
		break;
	case VK_RIGHT:
	case 'L':
	case 'l':
		CGameDlg::OnRight(); 
		break;
	case VK_UP:
	case 'I':
	case 'i':
		CGameDlg::OnUp(); 
		break;
	case VK_DOWN:
	case 'K':
	case 'k':
		CGameDlg::OnDown(); 
		break;
	}
	
	CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
*/

⌨️ 快捷键说明

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