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

📄 fangkuaidlg.cpp

📁 EVC下的方块游戏程序源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// fangkuaiDlg.cpp : implementation file
//

#include "stdafx.h"
#include "fangkuai.h"
#include "fangkuaiDlg.h"


UINT nChar;
int Angle=0;
int n=0;
int Number[2];

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CFangkuaiDlg dialog

CFangkuaiDlg::CFangkuaiDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CFangkuaiDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CFangkuaiDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CFangkuaiDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CFangkuaiDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CFangkuaiDlg, CDialog)
	//{{AFX_MSG_MAP(CFangkuaiDlg)
	ON_BN_CLICKED(IDC_GameOver, OnGameOver)
	ON_BN_CLICKED(IDC_GameStart, OnGameStart)
	ON_BN_CLICKED(IDC_PAUSE, OnPause)
	ON_BN_CLICKED(IDC_UP, OnUp)
	ON_BN_CLICKED(IDC_LEFT, OnLeft)
	ON_BN_CLICKED(IDC_DOWN, OnDown)
	ON_BN_CLICKED(IDC_RIGHT, OnRight)
	ON_BN_CLICKED(IDC_STATIC_NUM, OnStaticNum)
	ON_WM_CREATE()
	ON_WM_PAINT()
	ON_WM_TIMER()
	ON_WM_CTLCOLOR()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFangkuaiDlg message handlers



BOOL CFangkuaiDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	CenterWindow(GetDesktopWindow());	// center to the hpc screen

	// TODO: Add extra initialization here
	Number[0]=rand()%7;
	Number[1]=rand()%7;
	SetDlgItemText(IDC_PAUSE,TEXT("暂停"));
	CRect rt;
	GetClientRect(&rt);
	WIDTHOFBRICKS=((rt.right -rt.left )-LEFTMARGIN)/10;
	HEIGHTOFBRICKS=((rt.bottom -rt.top )-TOPMARGIN*2-::GetSystemMetrics(SM_CYCAPTION))/20;
	WIDTHOFBRICKS=HEIGHTOFBRICKS=min(WIDTHOFBRICKS,HEIGHTOFBRICKS);
	TRACE(L"HEIGHTOFBRICKS:%d\n",HEIGHTOFBRICKS);
	BrickAtBottom=FALSE;
	EraseAline=FALSE;
	Level=0;
	TimerInterval=10000/20;
	GameState=STOP;
	InitBricks();
	RefreshAll();

	return TRUE;  // return TRUE  unless you set the focus to a control
}


void CFangkuaiDlg::InitBricks(void)
{
	for(int i=0;i<20;i++)
		for(int j=0;j<10;j++)
			MatrixOfBricks[i][j]=0;
	RefreshAll();
}

void CFangkuaiDlg::OnKey(UINT nChar)
{
	{
		switch(nChar)
		{
		case VK_NUMPAD1:
			if(!(IsOutOfRect(1)==2))
			{
				RefreshBricks();
				for(int a=0;a<4;a++)
					CurrentBrick[a].y--;
			}
			break;

		case VK_NUMPAD3:
			if(!(IsOutOfRect(2)==1))
			{
				RefreshBricks();
				for(int a=0;a<4;a++)
					CurrentBrick[a].y++;
			
			}
			break;
		case VK_NUMPAD7:
			OnTimer(1);
			break;
		case VK_NUMPAD9:
			RefreshBricks();
			RotateBrick();
			break;
		}
		myDraw();
	}

}


void CFangkuaiDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	switch(nIDEvent)
	{
	case 1:
		if(GameState==RUNNING)
		{
			if(Isbottom())
			{
				RefreshBricks();
				for(int i=0;i<4;i++)
					CurrentBrick[i].x++;
			}
			else
			{
				IsGameOver();
				CanEraseAline();
				DrawNextBrick();
				GenerateABrick();
				Number[0]=Number[1];
				CreateNumber();
			}
			myDraw();
		}
		break;
	}

	CDialog::OnTimer(nIDEvent);
}


void CFangkuaiDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	dc.FillSolidRect(120,30,70,40,RGB(0,0,160));
	EraseAline=TRUE;
	myDraw();

	// Do not call CDialog::OnPaint() for painting messages
}



void CFangkuaiDlg::RefreshBricks(void)
{
	int i;
	for(i=0;i<4;i++)
	{
		MatrixOfBricks[CurrentBrick[i].x][CurrentBrick[i].y]=0;
		LastPositionOfBrick[i].x=CurrentBrick[i].x;
		LastPositionOfBrick[i].y=CurrentBrick[i].y;
	}

}


int CFangkuaiDlg::IsOutOfRect(int w) 
{
	if(w==2)
	{
		for(int a=0;a<4;a++)
		{
			if((CurrentBrick[a].y>=9)||(MatrixOfBricks[CurrentBrick[a].x][CurrentBrick[a].y+1]==2))
			{
				return 1;
			}
		}
	}
	if(w==1)
	{
		for(int a=0;a<4;a++)
			if((CurrentBrick[a].y<=0)||MatrixOfBricks[CurrentBrick[a].x][CurrentBrick[a].y-1]==2)
				return 2;
	}
	return 3;
}

int CFangkuaiDlg::Isbottom() 
{
	BrickAtBottom=TRUE;
	for(int a=0;a<4;a++)
	{
		if(CurrentBrick[a].x==19)
		{
			for(int c=0;c<4;c++)
				MatrixOfBricks[CurrentBrick[c].x][CurrentBrick[c].y]=2;
			return 0;//到底了
		}
		if(MatrixOfBricks[CurrentBrick[a].x +1][CurrentBrick[a].y]==2)
		{
			for(int c=0;c<4;c++)
				MatrixOfBricks[CurrentBrick[c].x][CurrentBrick[c].y]=2;
			return 0;
		}
	}
	BrickAtBottom=FALSE;
	return 1;
}


void CFangkuaiDlg::CanEraseAline() 
{
	int flagover=0;
	int y=0;
	//int n=1;
	TCHAR m_strValue[200];
	for(int a=19;a>=0;a--)
	{
		flagover=0;
		for(int b=0;b<10;b++)
		{
			if(MatrixOfBricks[a][b]==2)
				flagover++;
		}

		if(flagover==10)
		{
			EraseAline=TRUE;
			for(int t=a;t>0;t--)
			{
				for(b=0;b<10;b++)
				{
					MatrixOfBricks[t][b]=MatrixOfBricks[t-1][b];
					MatrixOfBricks[t-1][b]=0;
				}
			}
			y++;			
			a=a+1;
		}
	}

	switch(y)
	{
	case 1:
		n=n+1;
		break;
	case 2:
		n=n+3;
		break;
	case 3:
		n=n+5;
		break;
	case 4:
		n=n+8;
		break;
	}

	switch(n-(n%10))
	{
	case 10:
		Level=1;
		break;
	case 20:
		Level=2;
		break;
	case 30:
		Level=3;
		break;
	case 40:
		Level=4;
		break;
	case 50:
		Level=5;
		break;
	case 60:
		Level=6;
		break;
	case 70:
		Level=7;
		break;
	case 80:
		Level=8;
		break;
	case 90:
		Level=9;
		break;
	case 100:
		Level=10;
		break;
	}
if(Level>=8)
	TimerInterval=180-(Level-6)*30;
else
	TimerInterval=10000/20-Level*50;
	SetTimer(1,TimerInterval,NULL);
	_itow(n*100,m_strValue,10);
	SetDlgItemText(IDC_STATIC_NUM,m_strValue);
	_itow(CFangkuaiDlg::Level,m_strValue,10);
	SetDlgItemText(IDC_LEVEL_NUM,m_strValue);
	if(n>=100)
	{
		GameState=STOP;
		KillTimer(1);
		MessageBox(_T("哇噻!你太厉害啦!通关啦!"),_T("通关提示!!"));
		InitBricks();
		myDraw();
		return;
	}

}


void CFangkuaiDlg::IsGameOver() 
{

	int a;
	for(a=0;a<9;a++)
	{
		if(MatrixOfBricks[0][a]==2)
		{
			CDC*dc=GetDC();
			dc->FillSolidRect(120,30,70,40,RGB(0,0,160));

			GameState=STOP;
			KillTimer(1);

			MessageBox(_T("游戏结束!"),_T("俄罗斯方块游戏"));

			InitBricks();
			myDraw();
			return;
		}
	}

}



void CFangkuaiDlg::CreateNumber() 
{
	Number[1]=rand()%7;	
}

void CFangkuaiDlg::myDraw() 
{
	int i;
	CDC*dc=GetDC();
	if(GameState!=RUNNING)
	{
		RefreshAll();
		return;
	}
	else
	{
		for(i=0;i<4;i++)
		{
			MatrixOfBricks[CurrentBrick[i].x][CurrentBrick[i].y]=1;
		}
		if(!EraseAline)
		{
			if(!BrickAtBottom)
				for(i=0;i<4;i++)
				{
//					dc->FillSolidRect(LEFTMARGIN+LastPositionOfBrick[i].y*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+LastPositionOfBrick[i].x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,HIGHLIGHTCOLOR);
					dc->FillSolidRect(LEFTMARGIN+LastPositionOfBrick[i].y*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+LastPositionOfBrick[i].x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,RGB(0,0,0));
				}
				for(i=0;i<4;i++)
				{
					dc->FillSolidRect(LEFTMARGIN+CurrentBrick[i].y*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+CurrentBrick[i].x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,ColorOfCurrentBrick);
				}
		}
		else
		{
			RefreshAll();
			EraseAline=FALSE;
		}
	}
	ReleaseDC(dc);
}


void CFangkuaiDlg::RefreshAll()
{
	CDC*dc=GetDC();
	TRACE(L"GETDC:%x\n",dc);
	TRACE(L"CYCAPTION:%x\n",::GetSystemMetrics(SM_CYCAPTION));
	for(int x=0;x<20;x++)
	{
		for(int j=0;j<10;j++)
		{
			if((MatrixOfBricks[x][j]==1)||(MatrixOfBricks[x][j]==2))
			{
//				dc->FillSolidRect(LEFTMARGIN+j*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,ColorOfCurrentBrick);
				dc->FillSolidRect(LEFTMARGIN+j*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,ColorOfCurrentBrick);
			}
			else
			{
//				dc->FillSolidRect(LEFTMARGIN+j*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,HIGHLIGHTCOLOR);
				dc->FillSolidRect(LEFTMARGIN+j*WIDTHOFBRICKS,TOPMARGIN+::GetSystemMetrics(SM_CYCAPTION)+x*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,RGB(0,0,0));
			}
		}
	}
	ReleaseDC(dc);
}


void CFangkuaiDlg::Start() 
{
	// TODO: Add your control notification handler code here
	Level=0;
	n=0;
	TimerInterval=10000/20;
	SetTimer(1,TimerInterval,NULL);
	GameState=RUNNING;
	InitBricks();
		
	SetDlgItemText(IDC_STATIC_NUM,L"0");
	SetDlgItemText(IDC_LEVEL_NUM,L"0");
	CDC*dc=GetDC();
	dc->FillSolidRect(120,30,70,40,RGB(0,0,160));
	DrawNextBrick();
	GenerateABrick();
	Number[0]=Number[1];
	CreateNumber();
}


void CFangkuaiDlg::Stop() 
{
	// TODO: Add your control notification handler code here
	GameState=STOP;
	KillTimer(1);
	InitBricks();
}

void CFangkuaiDlg::Exit() 
{
	// TODO: Add your control notification handler code here
	EndDialog(0);
}


HBRUSH CFangkuaiDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
	// TODO: Change any attributes of the DC here
	if(nCtlColor==CTLCOLOR_STATIC)
	{
		pDC->SelectObject(&StaticFont);
//		pDC->SetTextColor(RGB(255,100,0));
		pDC->SetTextColor(RGB(0,0,255));
	}
	// TODO: Return a different brush if the default is not desired
	return hbr;
}

BOOL CFangkuaiDlg::PreTranslateMessage(MSG*pMsg)
{
	if(pMsg->message==WM_KEYDOWN)
	{
		switch(pMsg->wParam)
		{
//		case VK_RETURN:
//			return true;
//		case VK_SPACE:
//			return true;
		case VK_LEFT:
		case VK_NUMPAD4:
			nChar=VK_NUMPAD1;
			OnKey(nChar);
			return true;
		case VK_RIGHT:
		case VK_NUMPAD6:
			nChar=VK_NUMPAD3;
			OnKey(nChar);
			return true;
		case VK_DOWN:
		case VK_NUMPAD2:
			nChar=VK_NUMPAD7;
			OnKey(nChar);
			return true;
		case VK_UP:
		case VK_NUMPAD8:
		case VK_NUMPAD5:
			nChar=VK_NUMPAD9;
			OnKey(nChar);
			return true;
		}
	}
	return CDialog::PreTranslateMessage(pMsg);
}



void CFangkuaiDlg::OnGameStart() 
{
	// TODO: Add your control notification handler code here
	SetDlgItemText(IDC_PAUSE,TEXT("暂停"));
	Start();
	return;
}

void CFangkuaiDlg::OnUp() 
{
	// TODO: Add your control notification handler code here
	if(GameState==RUNNING)
	{
		nChar=VK_NUMPAD9;
		OnKey(nChar);
	}
}

void CFangkuaiDlg::OnDown() 
{
	// TODO: Add your control notification handler code here
	if(GameState==RUNNING)
	{
		nChar=VK_NUMPAD7;
		OnKey(nChar);
	}
}

void CFangkuaiDlg::OnLeft() 
{
	// TODO: Add your control notification handler code here
	if(GameState==RUNNING)
	{
		nChar=VK_NUMPAD1;
		OnKey(nChar);
	}
}

void CFangkuaiDlg::OnRight() 
{
	// TODO: Add your control notification handler code here
	if(GameState==RUNNING)
	{
		nChar=VK_NUMPAD3;
		OnKey(nChar);
	}	
}

void CFangkuaiDlg::OnPause() 
{
	// TODO: Add your control notification handler code here
	if(GameState==RUNNING)
	{

⌨️ 快捷键说明

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