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

📄 diamonddlg.cpp

📁 This file can be directly edited in Microsoft Visual C++.新的俄罗师方块游戏
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		for(int j=0;j<10;j++)
			m_Matrix[i][j][0]=m_Matrix[i][j][1]=0;
	DrawAll();

	char str[128];
	m_Score=0;
	sprintf(str,"%d",m_Score);
	m_ScoreCtrl.SetWindowText(str);
	sprintf(str,"%d",m_Level);
	m_LevelCtrl.SetWindowText(str);

	CTime Time;
	i=Time.GetCurrentTime().GetSecond();
	srand(i);	//以时间为种子
	m_Index=abs(rand()%8);	//计算方块形状
	if(m_Index==0) m_Index=1;
	
	DrawInitBlock();
	SetTimer(1,600-50*m_Level,NULL);
}


void CDiamondDlg::DropDown()	//自由下落
{
 CString str;

 for(int i=0;i<4;i++)
	 if(m_Matrix[m_CurBlock[i].y+1][m_CurBlock[i].x][0]==1||m_CurBlock[i].y==21) //如果已经下降到底
	 {
		m_Matrix[m_CurBlock[0].y][m_CurBlock[0].x][0]=1;	//
		m_Matrix[m_CurBlock[1].y][m_CurBlock[1].x][0]=1;
		m_Matrix[m_CurBlock[2].y][m_CurBlock[2].x][0]=1;
		m_Matrix[m_CurBlock[3].y][m_CurBlock[3].x][0]=1;
		m_Matrix[m_CurBlock[0].y][m_CurBlock[0].x][1]=m_CurBlockMap;	//
		m_Matrix[m_CurBlock[1].y][m_CurBlock[1].x][1]=m_CurBlockMap;
		m_Matrix[m_CurBlock[2].y][m_CurBlock[2].x][1]=m_CurBlockMap;
		m_Matrix[m_CurBlock[3].y][m_CurBlock[3].x][1]=m_CurBlockMap;
		for(int j=0;j<10;j++)
			if(m_Matrix[0][j][0]==1)	//结束
			{
				KillTimer(1);
				if(m_maxScore<m_Score)
				{
					NewRecord();
				}
				else
				{
				 str.Format("----------------------GAME OVER--------------------\n\n\tYour Score\t\tLevel\n\t%ld\t\t\t%d\t\n\n------------WELCOME TO PLAY AGAIN------------",m_Score,m_Level);
				 MessageBox(str,"THE END");
				}
				return;
			}
		GetScore();	//判断是否得分
		DrawInitBlock();
		return;
	 }
 EraseLastBlock();	//删除上次的
 m_CurBlock[0].y+=1;
 m_CurBlock[1].y+=1;
 m_CurBlock[2].y+=1;
 m_CurBlock[3].y+=1;
 DrawCurBlock();
 return;
}

void CDiamondDlg::DrawCurBlock()
{	
	CDC MemDC;
	MemDC.CreateCompatibleDC(m_pBlockDC);
	MemDC.SelectObject(m_Bitmap+m_CurBlockMap);
	for(int i=0;i<4;i++)
	{
	 m_pBlockDC->BitBlt(m_CurBlock[i].x*20+1,m_CurBlock[i].y*20+1,18,18,&MemDC,0,0,SRCCOPY);
	 m_pBlockDC->Draw3dRect(m_CurBlock[i].x*20,m_CurBlock[i].y*20,20,20,m_RasterColor,m_RasterColor);
	}
}

void CDiamondDlg::GetScore()
{
 int count;
 int row=0;	//计算消掉几行
 char str[128];

 for(int i=21;i>=0;i--)	//从下至上判断
 {
	 count=0;
	 for(int j=0;j<10;j++)
		count+=m_Matrix[i][j][0];
	 if(count==10)	//如果i行已经满
	 {
		 row++;
		 HighLightIt(i);
		 for(int k=i;k>0;k--)	//从数据上删除
			 for(int w=0;w<10;w++)
			 {
				 m_Matrix[k][w][1]=m_Matrix[k-1][w][1];
				 m_Matrix[k][w][0]=m_Matrix[k-1][w][0];
			 }
			 for(int w=0;w<10;w++) { m_Matrix[0][w][0]=0; m_Matrix[0][w][1]=0; }
		 i++;	//再判断该行一次
		 DrawAll();
		 m_Score+=(long)(50*sqrt(m_Level));	//增加分值
		 sprintf(str,"%d",m_Score);
		 m_ScoreCtrl.SetWindowText(str);
		 sprintf(str,"%d",m_Level);
		 m_LevelCtrl.SetWindowText(str);
	 }
 }
 if(row>1)
 {
	 m_Score+=(long)(10*pow(2,(row-1)));		//Get extra score
	 sprintf(str,"%d",m_Score);
	 m_ScoreCtrl.SetWindowText(str);
	 sprintf(str,"%d",m_Level);
	 m_LevelCtrl.SetWindowText(str);
 }
 m_Level=m_SettingLevel+(int)(m_Score/1000);
 if(m_Level>10) m_Level=10;
 SetTimer(1,600-50*m_Level,NULL);
 sprintf(str,"%d",m_Score);
 m_ScoreCtrl.SetWindowText(str);
 sprintf(str,"%d",m_Level);
 m_LevelCtrl.SetWindowText(str);
 return;
}

void CDiamondDlg::HighLightIt(int Row)
{
	//SetTimer(2,200,NULL);
	CBrush Brush;
	Brush.CreateSolidBrush(RGB(255,255,255));
	CBrush* pOldBrush=m_pBlockDC->SelectObject(&Brush);
	RECT rect;
	for(int j=0;j<4;j++)
	{
	 for(int i=0;i<10;i++)
	 {
		rect.left=20*i;
		rect.top=20*Row;
		rect.right=rect.left;
		rect.bottom=rect.top;
		m_pBlockDC->FillRect(&rect,&Brush);
	 }
	}
    m_pBlockDC->SelectObject(pOldBrush);
}

void CDiamondDlg::DrawAll()
{
 CDC MemDC;
 MemDC.CreateCompatibleDC(m_pBlockDC);
 CBrush Brush;
 Brush.CreateSolidBrush(m_bkColor);
 CBrush* pOldBrush=m_pBlockDC->SelectObject(&Brush);
 RECT rect;
 for(int i=0;i<22;i++)
	 for(int j=0;j<10;j++)
		 if(m_Matrix[i][j][0]==1)
		 {
			 MemDC.SelectObject(m_Bitmap+m_Matrix[i][j][1]);
			 m_pBlockDC->BitBlt(20*j+1,20*i+1,18,18,&MemDC,0,0,SRCCOPY);
			 m_pBlockDC->Draw3dRect(20*j,20*i,20,20,m_RasterColor,m_RasterColor);
		 }
		 else	//没有的地方清除
		 {
			rect.left=20*j;
			rect.top=20*i;
			rect.right=rect.left+20;
			rect.bottom=rect.top+20;
			m_pBlockDC->FillRect(&rect,&Brush);
			if(m_bShowRaster==TRUE) m_pBlockDC->Draw3dRect(20*j,20*i,20,20,m_RasterColor,m_RasterColor);
		 }
 m_pBlockDC->SelectObject(pOldBrush);
 DrawNextBlock(m_Index);
}

void CDiamondDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	DropDown();
	CDialog::OnTimer(nIDEvent);
}

void CDiamondDlg::DrawInitBlock()
{
	m_CurBlock[0].y=m_CurBlock[1].y=m_CurBlock[2].y=m_CurBlock[3].y=0;
	switch(m_Index)
	{
	 case 1:
		 m_CurBlock[0].x=3;
		 m_CurBlock[1].x=4;
		 m_CurBlock[2].x=5;
		 m_CurBlock[3].x=6;
		 break;
	 case 2:
		 m_CurBlock[0].x=4;
		 m_CurBlock[1].x=5;
		 m_CurBlock[2].x=5;
		 m_CurBlock[2].y=1;
		 m_CurBlock[3].x=6;
		 m_CurBlock[3].y=1;
		 break;
	 case 3:
		 m_CurBlock[0].x=4;
		 m_CurBlock[0].y=1;
		 m_CurBlock[1].x=5;
		 m_CurBlock[1].y=1;
		 m_CurBlock[2].x=5;
		 m_CurBlock[3].x=6;
		 break;
	 case 4:
		 m_CurBlock[0].x=4;
		 m_CurBlock[1].x=5;
		 m_CurBlock[2].x=6;
		 m_CurBlock[3].x=5;
		 m_CurBlock[3].y=1;
		 break;
	 case 5:
		 m_CurBlock[0].x=4;
		 m_CurBlock[1].x=5;
		 m_CurBlock[2].x=4;
		 m_CurBlock[2].y=1;
		 m_CurBlock[3].x=5;
		 m_CurBlock[3].y=1;
		 break;
	 case 6:
		 m_CurBlock[0].x=4;
		 m_CurBlock[1].x=5;
		 m_CurBlock[2].x=6;
		 m_CurBlock[3].x=6;
		 m_CurBlock[3].y=1;
		 break;
	 case 7:
		 m_CurBlock[0].x=4;
		 m_CurBlock[1].x=5;
		 m_CurBlock[2].x=6;
		 m_CurBlock[3].x=4;
		 m_CurBlock[3].y=1;
		 break;
	 default:
		break;
	}
	m_OldIndex=m_Index;
	CTime Time;
	int i=Time.GetCurrentTime().GetSecond()+1;
	srand(i);	//产生下一个方块
	m_Index=rand()%8;	//计算方块形状
	if(m_Index==0) m_Index=1;
	m_CurBlockMap=abs(rand()%12);	//计算当前方块图案

	DrawCurBlock();
	DrawNextBlock(m_Index);
}

void CDiamondDlg::MoveLeft()
{
	for(int i=0;i<4;i++)	//如果已经到边
	{
		if(m_CurBlock[i].x==0) return;
		if(m_CurBlock[i].x>0&&m_Matrix[m_CurBlock[i].y][m_CurBlock[i].x-1][0]==1) return; //如果左边已经有方块
	}
	EraseLastBlock();
	for(i=0;i<4;i++)
		m_CurBlock[i].x--;
	DrawCurBlock();
}

void CDiamondDlg::EraseLastBlock()
{
 RECT rect;
 CBrush Brush;
 Brush.CreateSolidBrush(m_bkColor);
 CBrush* pOldBrush=m_pBlockDC->SelectObject(&Brush);
 for(int i=0;i<4;i++)	//擦掉前一次的
 {
	 rect.left=20*m_CurBlock[i].x;
	 rect.top=20*m_CurBlock[i].y;
	 rect.right=rect.left+20;
	 rect.bottom=rect.top+20;
	m_pBlockDC->FillRect(&rect,&Brush);
	if(m_bShowRaster==TRUE) m_pBlockDC->Draw3dRect(rect.left-1,rect.top-1,20,20,m_RasterColor,m_RasterColor);

 }	//End of for
 m_pBlockDC->SelectObject(pOldBrush);
 return;
}

void CDiamondDlg::MoveRight()
{
 	for(int i=0;i<4;i++)	//如果已经到边
	{
		if(m_CurBlock[i].x==9) return;
		if(m_CurBlock[i].x<9&&m_Matrix[m_CurBlock[i].y][m_CurBlock[i].x+1][0]==1) return; //如果右边已经有方块
	}
	EraseLastBlock();
	for(i=0;i<4;i++)
		m_CurBlock[i].x++;
	DrawCurBlock();
}

void CDiamondDlg::Rotation()
{
	EraseLastBlock();
	int count=0,i,j;
	switch(m_OldIndex)
	{
		case 1:
			 //首先判断m_CurBlock[1]上下是否有连续的四个空位
			 i=m_CurBlock[1].y+1;
			 j=m_CurBlock[1].x;
			 count=0;
			 while(m_Matrix[i][j][0]==0) { count++; i++;} //向下搜索
			 i=m_CurBlock[1].y-1;
			 while(m_Matrix[i][j][0]==0) { count++; i--;} //向上搜索
			if(count>=4)	//以m_CurBlock[1]为中心逆时针旋转
			{
			//////////////////////////
			 m_CurBlock[0].x=m_CurBlock[1].x;
			 m_CurBlock[0].y=m_CurBlock[1].y+1;
			 m_CurBlock[2].x=m_CurBlock[1].x;
			 m_CurBlock[2].y=m_CurBlock[1].y-1;
			 m_CurBlock[3].x=m_CurBlock[1].x;
			 m_CurBlock[3].y=m_CurBlock[1].y-2;
			 while(m_CurBlock[3].y<0||m_Matrix[m_CurBlock[3].y][m_CurBlock[3].x][0]==1)		//如果顶出边界或有BLOCK
				 for(i=0;i<4;i++) m_CurBlock[i].y++;
			 while(m_CurBlock[0].y>21||m_Matrix[m_CurBlock[0].y][m_CurBlock[0].x][0]==1)		//如果底出边界或有BLOCK
				 for(i=0;i<4;i++) m_CurBlock[i].y--;
			}
			else	//以m_CurBlock[2]为中心顺时针旋转
			{
				//首先判断m_CurBlock[1]上下是否有连续的四个空位
			 i=m_CurBlock[2].y+1;
			 j=m_CurBlock[2].x;
			 count=0;
			 while(m_Matrix[i][j][0]==0) { count++; i++;} //向下搜索
			 i=m_CurBlock[2].y-1;
			 while(m_Matrix[i][j][0]==0) { count++; i--;} //向上搜索
			 if(count<4) break;
			//////////////////////////
			 m_CurBlock[3].x=m_CurBlock[2].x;
			 m_CurBlock[3].y=m_CurBlock[2].y+1;
			 m_CurBlock[1].x=m_CurBlock[2].x;
			 m_CurBlock[1].y=m_CurBlock[2].y-1;
			 m_CurBlock[0].x=m_CurBlock[2].x;
			 m_CurBlock[0].y=m_CurBlock[2].y-2;
			 while(m_CurBlock[0].y<0||m_Matrix[m_CurBlock[0].y][m_CurBlock[0].x][0]==1)	//如果顶出边界或有BLOCK
				 for(int i=0;i<4;i++) m_CurBlock[i].y++;
			 while(m_CurBlock[3].y>21||m_Matrix[m_CurBlock[3].y][m_CurBlock[3].x][0]==1)	//如果底出边界或有BLOCK
				 for(int i=0;i<4;i++) m_CurBlock[i].y--;
			}
			m_OldIndex=8;
			break;
		case 2:
			//以m_CurBlock[1]为中心逆时针旋转
			i=m_CurBlock[1].y;
			j=m_CurBlock[1].x;
			if(m_Matrix[i+1][j][0]+m_Matrix[i][j+1][0]+m_Matrix[i-1][j+1][0]==0) //如果有空位
			{
			 m_CurBlock[0].x=j;
			 m_CurBlock[0].y=i+1;
			 m_CurBlock[2].x=j+1;
			 m_CurBlock[2].y=i;
			 m_CurBlock[3].x=j+1;
			 m_CurBlock[3].y=i-1;
			}
			else //以m_CurBlock[2]为中心逆时针旋转
			{
			 i=m_CurBlock[2].y;
			 j=m_CurBlock[2].x;
			 if(m_Matrix[i+1][j-1][0]+m_Matrix[i][j-1][0]+m_Matrix[i-1][j][0]==0)	//如果有空位
			 {
				m_CurBlock[0].x=j-1;
				m_CurBlock[0].y=i+1;
				m_CurBlock[1].x=j-1;
				m_CurBlock[1].y=i;
				m_CurBlock[3].x=j;
				m_CurBlock[3].y=i-1;
			 }
			 else break;	//不能旋转
			}
			while(m_CurBlock[3].y<0)
			{
			 m_CurBlock[0].y++;
			 m_CurBlock[1].y++;
			 m_CurBlock[2].y++;
			 m_CurBlock[3].y++;
			}
			m_OldIndex=9;
			break;
		case 3:
			//先以m_CurBlock[1]为中心旋转
			i=m_CurBlock[1].y;
			j=m_CurBlock[1].x;
			if(m_Matrix[i+1][j][0]+m_Matrix[i][j-1][0]+m_Matrix[i-1][j-1][0]==0)	//如果有空位
			{
				m_CurBlock[0].x=j;
				m_CurBlock[0].y=i+1;
				m_CurBlock[2].x=j-1;
				m_CurBlock[2].y=i;
				m_CurBlock[3].x=j-1;
				m_CurBlock[3].y=i-1;
			}
			else	//先以m_CurBlock[2]为中心旋转
			{
				i=m_CurBlock[2].y;
				j=m_CurBlock[2].x;
				if(m_Matrix[i+1][j+1][0]+m_Matrix[i][j+1][0]+m_Matrix[i-1][j][0]==0)	//如果有空位
				{
					m_CurBlock[0].x=j+1;
					m_CurBlock[0].y=i+1;
					m_CurBlock[1].x=j+1;
					m_CurBlock[1].y=i;
					m_CurBlock[3].x=j;
					m_CurBlock[3].y=i-1;
				}
				else break;	//不能旋转
			}
			while(m_CurBlock[0].y>21)
				for(i=0;i<4;i++)
					m_CurBlock[i].y--;
			m_OldIndex=10;
			break;
		case 4:
			i=m_CurBlock[1].y;
			j=m_CurBlock[1].x;
			if(m_Matrix[i+1][j][0]+m_Matrix[i-1][j][0]+m_Matrix[i][j+1][0]==0)	//逆转成11
			{
				m_CurBlock[0].x=j;
				m_CurBlock[0].y=i+1;
				m_CurBlock[2].x=j;
				m_CurBlock[2].y=i-1;
				m_CurBlock[3].x=j+1;
				m_CurBlock[3].y=i;
				m_OldIndex=11;
			}
			else if(m_Matrix[i-1][j][0]+m_Matrix[i+1][j][0]+m_Matrix[i][j-1][0]==0)	//顺转成13
			{
				m_CurBlock[0].x=j;
				m_CurBlock[0].y=i-1;
				m_CurBlock[2].x=j;
				m_CurBlock[2].y=i+1;
				m_CurBlock[3].x=j-1;
				m_CurBlock[3].y=i;
				m_OldIndex=13;
			}
			break;

⌨️ 快捷键说明

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