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

📄 elsgamedlg.cpp

📁 俄罗斯方块
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					if(CanRotate(m_nCurIndexX-mDX,m_nCurIndexY))
					{
						DrawCurBlock(TRUE);
						m_nCurIndexX-=mDX;
						DrawCurBlock(FALSE);
						RotateBlock();
					}
				}
			}
			break;
		case 'P':
		case 'p':
			OnPause();
			break;
		case VK_ESCAPE:
			break;
		default:
			CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
		}//switch
	}//if
	else
		CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
//键盘消息自己处理
BOOL CElsGameDlg::PreTranslateMessage(MSG* pMsg) 
{
	if(pMsg->message==WM_KEYDOWN)
	{
		OnKeyDown((UINT)pMsg->wParam,(UINT)pMsg->lParam,(UINT)pMsg->lParam);
		return TRUE;
	}
	else
		return CDialog::PreTranslateMessage(pMsg);
}

//检查是否可以移动 
BOOL CElsGameDlg::CheckCanMove(int nDir)
{
	int i;
	CPoint pt[4];
	pt[0].x=m_nCurIndexX;pt[0].y=m_nCurIndexY;
	for(i=1;i<=3;i++)
	{
		pt[i].x=m_nCurIndexX+m_nBlockInfoArray[m_nCurBlock-1][m_nCurDir-1][i-1].x;
		pt[i].y=m_nCurIndexY+m_nBlockInfoArray[m_nCurBlock-1][m_nCurDir-1][i-1].y;
	}
	switch(nDir)
	{
	case 1://down
		for(i=0;i<4;i++)
		{
			if(pt[i].y>=18)
				return FALSE;
			if(m_nArray[pt[i].y+1][pt[i].x]>0)
				return FALSE;
		}
		break;
	case 2://left
		for(i=0;i<4;i++)
		{
			if(pt[i].x<=0)
				return FALSE;
			if(m_nArray[pt[i].y][pt[i].x-1]>0)
				return FALSE;
		}
		break;
	case 3://right
		for(i=0;i<4;i++)
		{
			if(pt[i].x>=9)
				return FALSE;
			if(m_nArray[pt[i].y][pt[i].x+1]>0)
				return FALSE;
		}
		break;
	}
	return TRUE;
}
//检查当前是否可以转动
BOOL CElsGameDlg::CanRotate(int ix,int iy)
{
	int i;
	CPoint pt[4];
	int nextDir=m_nCurDir+1;
	if(nextDir>4)
		nextDir=1;
	///////////////////////////////////////////
	pt[0].x=ix;pt[0].y=iy;
	for(i=1;i<=3;i++)
	{
		pt[i].x=ix+m_nBlockInfoArray[m_nCurBlock-1][nextDir-1][i-1].x;
		pt[i].y=iy+m_nBlockInfoArray[m_nCurBlock-1][nextDir-1][i-1].y;
	}
	//////////////////////////////////////////////
	for(i=0;i<4;i++)
	{
		if((pt[i].x<0)||(pt[i].x>9)||(pt[i].y<0)||(pt[i].y>18))
			return FALSE;
		if(m_nArray[pt[i].y][pt[i].x]>0)
			return FALSE;
	}
	return TRUE;
}
//转动当前块(顺时针)
void CElsGameDlg::RotateBlock()
{
	DrawCurBlock(TRUE);
	m_nCurDir++;
	if(m_nCurDir>4)
		m_nCurDir=1;
	DrawCurBlock(FALSE);
}
//块数据添入矩阵
void CElsGameDlg::SetArrayBlockData()
{
	m_nArray[m_nCurIndexY][m_nCurIndexX]=m_nCurBmpIndex+1;
	for(int i=0;i<3;i++)
	{
		m_nArray[m_nCurIndexY+m_nBlockInfoArray[m_nCurBlock-1][m_nCurDir-1][i].y][m_nCurIndexX+m_nBlockInfoArray[m_nCurBlock-1][m_nCurDir-1][i].x]=m_nCurBmpIndex+1;;
	}
}
//画各个方块
void CElsGameDlg::DrawTheMap()
{
	int i,j;
	CDC memDC;
	CDC *pDC=GetDC();
	memDC.CreateCompatibleDC(pDC);
	if(m_bSameGraph)
		memDC.SelectObject(m_BmpBlock[m_nCurBmpIndex]);

	for(i=0;i<19;i++)
	{
		for(j=0;j<10;j++)
		{
			if(m_nArray[i][j]>0)
			{
				if(!m_bSameGraph)
					memDC.SelectObject(m_BmpBlock[m_nArray[i][j]-1]);
				pDC->BitBlt(j*20+m_nInitX,i*20+m_nInitY,20,20,&memDC,0,0,SRCCOPY);
			}
		}
	}
	memDC.DeleteDC();
	pDC->DeleteDC();
}
//游戏界面
void CElsGameDlg::DrawGameFace()
{
	CBrush br;
	CDC *pDC=GetDC();
	CPen pen;
	CRect rc_client;
	pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
	if(!m_bBackGround)
	{
		br.CreateSolidBrush(RGB(0,0,0));
		pDC->FillRect(&m_rcGame,&br);
		pDC->FillRect(&m_rcNext,&br);
	}
	else
	{
		pDC->FillRect(&m_rcGame,&m_brBack);
		pDC->FillRect(&m_rcNext,&m_brBack);
	}
	pDC->SelectObject(&pen);
	GetClientRect(&rc_client);
	pDC->MoveTo(1,m_nInitY-10);
	pDC->LineTo(rc_client.right-1,m_nInitY-10);
	rc_client.left=m_rcGame.left-3;
	rc_client.right=m_rcGame.right+3;
	rc_client.top=m_rcGame.top-3;
	rc_client.bottom=m_rcGame.bottom+3;

	pDC->Draw3dRect(rc_client,RGB(150,150,150),RGB(0,0,0));

	rc_client.left=m_rcNext.left-3;
	rc_client.right=m_rcNext.right+3;
	rc_client.top=m_rcNext.top-3;
	rc_client.bottom=m_rcNext.bottom+3;

	pDC->Draw3dRect(rc_client,RGB(150,150,150),RGB(0,0,0));
	br.DeleteObject();
	pen.DeleteObject();
	pDC->DeleteDC();
}
//初始化块信息矩阵
void CElsGameDlg::InitTheArray()
{
	int i,j;
	ClearArray();
	//case 1:
	m_nBlockInfoArray[0][0][0].x=1;m_nBlockInfoArray[0][0][0].y=0;
	m_nBlockInfoArray[0][0][1].x=1;m_nBlockInfoArray[0][0][1].y=1;
	m_nBlockInfoArray[0][0][2].x=0;m_nBlockInfoArray[0][0][2].y=1;
	for(i=1;i<=3;i++)
	{
		for(j=0;j<3;j++)
		{
			m_nBlockInfoArray[0][i][j].x=m_nBlockInfoArray[0][0][j].x;
			m_nBlockInfoArray[0][i][j].y=m_nBlockInfoArray[0][0][j].y;
		}
	}
	//case 2:
	m_nBlockInfoArray[1][0][0].x=0;m_nBlockInfoArray[1][0][0].y=1;
	m_nBlockInfoArray[1][0][1].x=0;m_nBlockInfoArray[1][0][1].y=2;
	m_nBlockInfoArray[1][0][2].x=0;m_nBlockInfoArray[1][0][2].y=3;

	m_nBlockInfoArray[1][1][0].x=1;m_nBlockInfoArray[1][1][0].y=0;
	m_nBlockInfoArray[1][1][1].x=2;m_nBlockInfoArray[1][1][1].y=0;
	m_nBlockInfoArray[1][1][2].x=3;m_nBlockInfoArray[1][1][2].y=0;

	m_nBlockInfoArray[1][2][0].x=0;m_nBlockInfoArray[1][2][0].y=1;
	m_nBlockInfoArray[1][2][1].x=0;m_nBlockInfoArray[1][2][1].y=2;
	m_nBlockInfoArray[1][2][2].x=0;m_nBlockInfoArray[1][2][2].y=3;

	m_nBlockInfoArray[1][3][0].x=1;m_nBlockInfoArray[1][3][0].y=0;
	m_nBlockInfoArray[1][3][1].x=2;m_nBlockInfoArray[1][3][1].y=0;
	m_nBlockInfoArray[1][3][2].x=3;m_nBlockInfoArray[1][3][2].y=0;
	//case 3:
	m_nBlockInfoArray[2][0][0].x=0;m_nBlockInfoArray[2][0][0].y=1;
	m_nBlockInfoArray[2][0][1].x=1;m_nBlockInfoArray[2][0][1].y=1;
	m_nBlockInfoArray[2][0][2].x=1;m_nBlockInfoArray[2][0][2].y=2;

	m_nBlockInfoArray[2][1][0].x=1; m_nBlockInfoArray[2][1][0].y=0;
	m_nBlockInfoArray[2][1][1].x=0; m_nBlockInfoArray[2][1][1].y=1;
	m_nBlockInfoArray[2][1][2].x=-1;m_nBlockInfoArray[2][1][2].y=1;

	m_nBlockInfoArray[2][2][0].x=0;m_nBlockInfoArray[2][2][0].y=1;
	m_nBlockInfoArray[2][2][1].x=1;m_nBlockInfoArray[2][2][1].y=1;
	m_nBlockInfoArray[2][2][2].x=1;m_nBlockInfoArray[2][2][2].y=2;

	m_nBlockInfoArray[2][3][0].x=1; m_nBlockInfoArray[2][3][0].y=0;
	m_nBlockInfoArray[2][3][1].x=0; m_nBlockInfoArray[2][3][1].y=1;
	m_nBlockInfoArray[2][3][2].x=-1;m_nBlockInfoArray[2][3][2].y=1;
	//case 4:
	m_nBlockInfoArray[3][0][0].x=0; m_nBlockInfoArray[3][0][0].y=1;
	m_nBlockInfoArray[3][0][1].x=-1;m_nBlockInfoArray[3][0][1].y=1;
	m_nBlockInfoArray[3][0][2].x=-1;m_nBlockInfoArray[3][0][2].y=2;

	m_nBlockInfoArray[3][1][0].x=1; m_nBlockInfoArray[3][1][0].y=0;
	m_nBlockInfoArray[3][1][1].x=1; m_nBlockInfoArray[3][1][1].y=1;
	m_nBlockInfoArray[3][1][2].x=2; m_nBlockInfoArray[3][1][2].y=1;

	m_nBlockInfoArray[3][2][0].x=0; m_nBlockInfoArray[3][2][0].y=1;
	m_nBlockInfoArray[3][2][1].x=-1;m_nBlockInfoArray[3][2][1].y=1;
	m_nBlockInfoArray[3][2][2].x=-1;m_nBlockInfoArray[3][2][2].y=2;

	m_nBlockInfoArray[3][3][0].x=1; m_nBlockInfoArray[3][3][0].y=0;
	m_nBlockInfoArray[3][3][1].x=1; m_nBlockInfoArray[3][3][1].y=1;
	m_nBlockInfoArray[3][3][2].x=2; m_nBlockInfoArray[3][3][2].y=1;
	//case 5:
	m_nBlockInfoArray[4][0][0].x=0; m_nBlockInfoArray[4][0][0].y=1;
	m_nBlockInfoArray[4][0][1].x=0; m_nBlockInfoArray[4][0][1].y=2;
	m_nBlockInfoArray[4][0][2].x=1; m_nBlockInfoArray[4][0][2].y=2;

	m_nBlockInfoArray[4][1][0].x=1; m_nBlockInfoArray[4][1][0].y=0;
	m_nBlockInfoArray[4][1][1].x=2; m_nBlockInfoArray[4][1][1].y=0;
	m_nBlockInfoArray[4][1][2].x=0; m_nBlockInfoArray[4][1][2].y=1;

	m_nBlockInfoArray[4][2][0].x=1; m_nBlockInfoArray[4][2][0].y=0;
	m_nBlockInfoArray[4][2][1].x=1; m_nBlockInfoArray[4][2][1].y=1;
	m_nBlockInfoArray[4][2][2].x=1; m_nBlockInfoArray[4][2][2].y=2;

	m_nBlockInfoArray[4][3][0].x=0; m_nBlockInfoArray[4][3][0].y=1;
	m_nBlockInfoArray[4][3][1].x=-1;m_nBlockInfoArray[4][3][1].y=1;
	m_nBlockInfoArray[4][3][2].x=-2;m_nBlockInfoArray[4][3][2].y=1;
	//case 6:
	m_nBlockInfoArray[5][0][0].x=0; m_nBlockInfoArray[5][0][0].y=1;
	m_nBlockInfoArray[5][0][1].x=0; m_nBlockInfoArray[5][0][1].y=2;
	m_nBlockInfoArray[5][0][2].x=-1;m_nBlockInfoArray[5][0][2].y=2;

	m_nBlockInfoArray[5][1][0].x=0; m_nBlockInfoArray[5][1][0].y=1;
	m_nBlockInfoArray[5][1][1].x=1; m_nBlockInfoArray[5][1][1].y=1;
	m_nBlockInfoArray[5][1][2].x=2; m_nBlockInfoArray[5][1][2].y=1;

	m_nBlockInfoArray[5][2][0].x=1; m_nBlockInfoArray[5][2][0].y=0;
	m_nBlockInfoArray[5][2][1].x=0; m_nBlockInfoArray[5][2][1].y=1;
	m_nBlockInfoArray[5][2][2].x=0; m_nBlockInfoArray[5][2][2].y=2;

	m_nBlockInfoArray[5][3][0].x=-2;m_nBlockInfoArray[5][3][0].y=0;
	m_nBlockInfoArray[5][3][1].x=-1;m_nBlockInfoArray[5][3][1].y=0;
	m_nBlockInfoArray[5][3][2].x=0; m_nBlockInfoArray[5][3][2].y=1;
	//case 7:
	m_nBlockInfoArray[6][0][0].x=-1;m_nBlockInfoArray[6][0][0].y=0;
	m_nBlockInfoArray[6][0][1].x=0; m_nBlockInfoArray[6][0][1].y=-1;
	m_nBlockInfoArray[6][0][2].x=1; m_nBlockInfoArray[6][0][2].y=0;

	m_nBlockInfoArray[6][1][0].x=0; m_nBlockInfoArray[6][1][0].y=-1;
	m_nBlockInfoArray[6][1][1].x=1; m_nBlockInfoArray[6][1][1].y=0;
	m_nBlockInfoArray[6][1][2].x=0; m_nBlockInfoArray[6][1][2].y=1;

	m_nBlockInfoArray[6][2][0].x=-1;m_nBlockInfoArray[6][2][0].y=0;
	m_nBlockInfoArray[6][2][1].x=0; m_nBlockInfoArray[6][2][1].y=1;
	m_nBlockInfoArray[6][2][2].x=1; m_nBlockInfoArray[6][2][2].y=0;

	m_nBlockInfoArray[6][3][0].x=0; m_nBlockInfoArray[6][3][0].y=-1;
	m_nBlockInfoArray[6][3][1].x=-1;m_nBlockInfoArray[6][3][1].y=0;
	m_nBlockInfoArray[6][3][2].x=0; m_nBlockInfoArray[6][3][2].y=1;
}
//随机生成新块,并刷新界面
void CElsGameDlg::CreateNewBlock()
{

	m_nCurBlock=m_nNextBlock;
	m_nCurDir=m_nNextDir;
	if((m_nCurBlock==7)&&
		((m_nCurDir==1)||(m_nCurDir==2)||(m_nCurDir==4)))
	{
		m_nCurIndexY=1;
		m_nCurIndexX=4;
	}
	else
	{
		m_nCurIndexY=0;
		m_nCurIndexX=4;
	}
	m_nCurBmpIndex=m_nNextBmpIndex;
	//下一块信息
	m_nNextBlock=rand()%7+1;
	m_nNextDir=rand()%4+1;
	m_nNextBmpIndex=rand()%7;
	///////////////////////////
	DrawCurBlock(FALSE);
	if(m_bSameGraph)
		DrawTheMap();
}
//检查满行
int CElsGameDlg::CheckFullLine()
{
	int i,j,k;
	int nSum,nCount,nNum[4];
	nCount=0;
	for(i=0;i<19;i++)
	{
		nSum=0;
		for(j=0;j<10;j++)
		{
			if(m_nArray[i][j]>0)
				nSum++;
		}
		if(nSum>=10)
		{
			nNum[nCount]=i;
			nCount++;
		}
	}
	for(i=0;i<nCount;i++)//从最高满行开始
	{
		for(j=nNum[i]-1;j>=0;j--)//从满行开始所有行下移
		{
			for(k=0;k<10;k++)
				m_nArray[j+1][k]=m_nArray[j][k];
		}
		for(k=0;k<10;k++)
			m_nArray[0][k]=0;
	}
	if(nCount>0)
	{
		m_lsumLev+=nCount;
		m_lscore+=(nCount*nCount-(nCount-1))*10;
		if(m_nSpeedLevel<(m_lsumLev/100))
		{
			m_nSpeedLevel++;
			if((m_nUserSpeed+m_nSpeedLevel)>=9)
				m_slevel.Format("%d",9);
			else
				m_slevel.Format("%d",m_nUserSpeed+m_nSpeedLevel);
			UpdateData(FALSE);
			KillTimer(1);
			MySetTimer();
		}
		ShowScore();
	}
	return nCount;
}
//画下一方块
void CElsGameDlg::DrawNextBlock(BOOL bErase)
{
	int ix,iy;
	if(m_nNextBlock==2)
	{	
		if((m_nNextDir==1)||(m_nNextDir==3))
		{
			ix=12;
			iy=0;
		}
		else
		{
			ix=11;
			iy=1;
		}
	}
	else if((m_nNextBlock==5)&&(m_nNextDir==4))
	{
		ix=13;
		iy=1;
	}
	else if((m_nNextBlock==6)&&(m_nNextDir==4))
	{
		ix=14;
		iy=1;
	}
	else
	{
		ix=12;
		iy=1;
	}
	DrawSingleBlock(ix,iy,bErase,m_nNextBmpIndex);
	for(int i=0;i<3;i++)
		DrawSingleBlock(ix+m_nBlockInfoArray[m_nNextBlock-1][m_nNextDir-1][i].x,
						iy+m_nBlockInfoArray[m_nNextBlock-1][m_nNextDir-1][i].y,
						bErase,m_nNextBmpIndex);
}
//检查游戏结束
BOOL CElsGameDlg::CheckOver()
{
	int i;
	if(m_nCurIndexY<=0)
		return TRUE;
	for(i=1;i<=3;i++)
	{
		if((m_nCurIndexY+m_nBlockInfoArray[m_nCurBlock-1][m_nCurDir-1][i-1].y)<=0)
			return TRUE;
	}
	return FALSE;
}
//关于
void CElsGameDlg::OnAbout() 
{
	CAboutDlg dlg;
	dlg.DoModal();
}
//显示分数和层数
void CElsGameDlg::ShowScore()
{	
	m_sumLev.Format("%d",m_lsumLev);
	m_score.Format("%d",m_lscore);
	UpdateData(FALSE);
}
//读取ini文件
void CElsGameDlg::ReadHiScore()
{	
	CWinApp * pApp=AfxGetApp();
	m_nHiScore=0;
	m_nHiScore=pApp->GetProfileInt("SCORE","HISCORE",0);
	m_hiscore.Format("%d",m_nHiScore);
	UpdateData(FALSE);
}
//写入ini文件
void CElsGameDlg::WriteHiScore()
{	
	CWinApp * pApp=AfxGetApp();
	pApp->WriteProfileInt("SCORE","HISCORE",m_nHiScore);
	pApp->WriteProfileInt("SCORE","HILEVEL",m_lsumLev);
}
//帮助
void CElsGameDlg::OnContents() 
{
	CDlgHelp dlg;
	dlg.DoModal();
}
//暂停
void CElsGameDlg::OnPause() 
{
	if(!m_bPlaying)
		return;
	if(m_bPause)//active
	{
		m_nArray[m_nCurIndexY][m_nCurIndexX]=0;
		for(int i=0;i<3;i++)
		{

⌨️ 快捷键说明

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