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

📄 gameframe.cpp

📁 一个用VC开发的完整的俄罗斯方块游戏源程序代码。
💻 CPP
字号:
// GameFrame.cpp : implementation file
//

#include "stdafx.h"
#include "gameres.h"
#include "GameFrame.h"
#include "diamond.h"
#include "board.h"

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

/////////////////////////////////////////////////////////////////////////////
// CGameFrame
IMPLEMENT_DYNCREATE(CGameFrame, CFrameWnd)
#define MODEL_NUMBER 19
#define MODEL_TYPE_NUMBER 7
CBitmap backpic;
CBitmap backgroundpic;
CBitmap diamondpic;
CBitmap boardpic;
CDC backDC;
CDC backgroundDC;
CDC diamondDC;
CDC boardDC;
CBoard board;
CDiamond DiaModel[MODEL_NUMBER];
CDiamond *oldDiamond=NULL;
int m_Total=0,m_Marks=0,m_Level=0;
char newdata[MODEL_NUMBER][16]={0,0,0,0, 1,1,1,0, 0,1,0,0, 0,0,0,0,//T1(0)
					0,1,0,0, 0,1,1,0, 0,1,0,0, 0,0,0,0,//T2(1)
					0,1,0,0, 1,1,1,0, 0,0,0,0, 0,0,0,0,//T3(2)
					0,1,0,0, 1,1,0,0, 0,1,0,0, 0,0,0,0,//T4(3)
					0,0,0,0, 1,1,1,1, 0,0,0,0, 0,0,0,0,//|1(4)
					0,1,0,0, 0,1,0,0, 0,1,0,0, 0,1,0,0,//|2(5)
					1,1,0,0, 0,1,1,0, 0,0,0,0, 0,0,0,0,//Z1(6)
					0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0,//Z2(7)
					1,1,0,0, 1,1,0,0, 0,0,0,0, 0,0,0,0,//O1(8)
					0,1,1,0, 0,1,1,0, 0,0,0,0, 0,0,0,0,//BZ1(9)
					1,0,0,0, 1,1,0,0, 0,1,0,0, 0,0,0,0,//BZ2(10)
					0,1,0,0, 0,1,0,0, 0,1,1,0, 0,0,0,0,//L1(11)
					0,0,0,0, 0,0,1,0, 1,1,1,0, 0,0,0,0,//L2(12)
					1,1,0,0, 0,1,0,0, 0,1,0,0, 0,0,0,0,//L3(13)
					0,0,0,0, 1,1,1,0, 1,0,0,0, 0,0,0,0,//L4(14)
					0,1,0,0, 0,1,0,0, 1,1,0,0, 0,0,0,0,//BL(15)
					0,0,0,0, 1,1,1,0, 0,0,1,0, 0,0,0,0,//BL(16)
					1,1,0,0, 1,0,0,0, 1,0,0,0, 0,0,0,0,//BL(17)
					0,1,0,0, 0,1,1,1, 0,0,0,0, 0,0,0,0,//BL(18)
};
char newlimit[MODEL_NUMBER][16]={0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//T1
					0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//T2
					0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//T3
					0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//T4
					0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//|1
					0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//|2
					0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//Z1
					0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//Z2
					0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//O1
					0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//BZ1
					0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//BZ2
					0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//L1
					0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//L2
					0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//L3
					0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//L4
};

CGameFrame::CGameFrame()
{
	CRect rect;
	Create(NULL,"Game");
	rect.bottom=435;rect.right=310;
	rect.top=0;rect.left=0;
	MoveWindow(rect,true);
}

CGameFrame::~CGameFrame()
{
}


BEGIN_MESSAGE_MAP(CGameFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CGameFrame)
	ON_WM_KEYDOWN()
	ON_WM_CREATE()
	ON_WM_TIMER()
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGameFrame message handlers

void CGameFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	char temp[16][10];
	CString s;
	int x,y;
	board.GetDiamond()->GetPoint(x,y);
	board.GetBoard(temp);
	if(nChar==VK_DOWN) SetTimer(1,20,NULL);
	if(nChar==VK_RIGHT) board.GetDiamond()->MoveR(temp);
	if(nChar==VK_LEFT) board.GetDiamond()->MoveL(temp);
	if(nChar==VK_UP) board.TransFram(temp);
	Show();
	CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}

int CGameFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	CClientDC dc(this);
	
	backpic.m_hObject=(HBITMAP)::LoadImage(NULL,"background8.bmp",
		IMAGE_BITMAP,300,400,LR_LOADFROMFILE);
//	backpic.LoadBitmap(IDB_BOARD);
	backgroundpic.m_hObject=(HBITMAP)::LoadImage(NULL,"background8.bmp",
		IMAGE_BITMAP,300,400,LR_LOADFROMFILE);
//	backgroundpic.LoadBitmap(IDB_BOARD);
	diamondpic.m_hObject=(HBITMAP)::LoadImage(NULL,"diamond8.bmp",
		IMAGE_BITMAP,20,20,LR_LOADFROMFILE);
//	diamondpic.LoadBitmap(IDB_B2);
	boardpic.m_hObject=(HBITMAP)::LoadImage(NULL,"board8.bmp",
		IMAGE_BITMAP,20,20,LR_LOADFROMFILE);
//	boardpic.LoadBitmap(IDB_B1);
	backDC.CreateCompatibleDC(&dc);
	backgroundDC.CreateCompatibleDC(&dc);
	diamondDC.CreateCompatibleDC(&dc);
	boardDC.CreateCompatibleDC(&dc);
	backDC.SelectObject(backpic);
	backgroundDC.SelectObject(backgroundpic);
	diamondDC.SelectObject(diamondpic);
	boardDC.SelectObject(boardpic);
	LoadDiamond();
	SetTimer(1,400,NULL);
	Sent();
	return 0;
}
void CGameFrame::LoadDiamond(void)
{
	for(int i=0;i<MODEL_NUMBER;i++)
	{
		DiaModel[i].SetData(newdata,i);
		DiaModel[i].SetLimit(newlimit,i);
	}
	DiaModel[0].Link(&DiaModel[1]);//t
	DiaModel[1].Link(&DiaModel[2]);//t
	DiaModel[2].Link(&DiaModel[3]);//t
	DiaModel[3].Link(&DiaModel[0]);//t

	DiaModel[4].Link(&DiaModel[5]);//|
	DiaModel[5].Link(&DiaModel[4]);//|

	DiaModel[6].Link(&DiaModel[7]);//Z
	DiaModel[7].Link(&DiaModel[6]);//Z

	DiaModel[8].Link(&DiaModel[8]);//O

	DiaModel[9].Link(&DiaModel[10]);//BZ
	DiaModel[10].Link(&DiaModel[9]);//BZ

	DiaModel[11].Link(&DiaModel[12]);//L
	DiaModel[12].Link(&DiaModel[13]);//L
	DiaModel[13].Link(&DiaModel[14]);//L
	DiaModel[14].Link(&DiaModel[11]);//L

	DiaModel[15].Link(&DiaModel[16]);//BL
	DiaModel[16].Link(&DiaModel[17]);//BL
	DiaModel[17].Link(&DiaModel[18]);//BL
	DiaModel[18].Link(&DiaModel[15]);//BL

}
void CGameFrame::Sent(void)
{
	int n;
	bool IsNull=0;
	if(oldDiamond!=NULL) 
		board.NewDiamond(oldDiamond);
	else IsNull=1;
	n=rand()%MODEL_TYPE_NUMBER;
	switch(n)
	{
		case 0:
			oldDiamond=&DiaModel[0];
			break;
		case 1:
			oldDiamond=&DiaModel[4];
			break;
		case 2:
			oldDiamond=&DiaModel[7];
			break;
		case 3:
			oldDiamond=&DiaModel[8];
			break;
		case 4:
			oldDiamond=&DiaModel[9];
			break;
		case 5:
			oldDiamond=&DiaModel[11];
			break;
		case 6:
			oldDiamond=&DiaModel[15];
			break;
	}
	if(IsNull)
		board.NewDiamond(oldDiamond);
}

void CGameFrame::Show(void)
{
	CClientDC ShowDC(this);
	char ShowData[16][10],ShowDia[4][4],ShowOldDia[4][4];
	int DiaX,DiaY,i,j;
	int x=5,y=75;
	CString SLevel,STotal,SMarks;
	board.GetDiamond()->GetData(ShowDia);
	backDC.BitBlt(0,0,300,400,&backgroundDC,0,0,SRCCOPY);
	if(oldDiamond!=NULL) oldDiamond->GetData(ShowOldDia);
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{
			board.GetDiamond()->GetPoint(DiaX,DiaY);
			if(ShowDia[i][j]!=0) backDC.BitBlt(x+j*20+DiaX*20,y+i*20+20*DiaY,20,20,&diamondDC,0,0,SRCCOPY);
		
		}
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{
			if(ShowOldDia[i][j]!=0) backDC.BitBlt(j*20+212,i*20+80,20,20,&diamondDC,0,0,SRCCOPY);
	
		}
	board.GetBoard(ShowData);

	for(i=0;i<16;i++)
		for(j=0;j<10;j++)
			if(ShowData[i][j]!=0) backDC.BitBlt(x+j*20,y+i*20,20,20,&boardDC,0,0,SRCCOPY);
	SLevel.Format("%-7d",m_Level);
	STotal.Format("%-7d",m_Total);
	SMarks.Format("%-7d",m_Marks);
	backDC.TextOut(225,212,SLevel);
	backDC.TextOut(225,286,STotal);
	backDC.TextOut(225,361,SMarks);
	ShowDC.BitBlt(0,0,300,400,&backDC,0,0,SRCCOPY);

}

void CGameFrame::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	char temp[16][10];
	board.GetBoard(temp);
	board.GetDiamond()->Floor(temp);
	Show();
	if(board.Touch(temp)) 
	{
		board.AddDiamond();
		m_Marks=board.Judge();
		m_Marks=m_Marks*m_Marks*100;
		m_Total+=m_Marks;
		m_Level=m_Total/3000;
		if(m_Level==9) 
		{
			SetTimer(1,100000,NULL);
			MessageBox("你真NB!");
			exit(1);
		}
		Sent();
		if(board.Die()) 
		{
			SetTimer(1,100000,NULL);
			MessageBox("      游戏结束!\n欢迎玩Agent俄罗斯方块");
			exit(1);
		}
		SetTimer(1,600-m_Level*50,NULL);
	}
	CFrameWnd::OnTimer(nIDEvent);
}

void CGameFrame::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	MessageBox("欢迎玩Agent俄罗斯方块");
	
	CFrameWnd::OnClose();
}

⌨️ 快捷键说明

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