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

📄 gameview.cpp

📁 这是一个连连看的游戏源程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// GameView.cpp : implementation of the CGameView class
//

#include "stdafx.h"
#include "Game.h"

#include "GameDoc.h"
#include "GameView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CGameView

IMPLEMENT_DYNCREATE(CGameView, CView)

BEGIN_MESSAGE_MAP(CGameView, CView)
	//{{AFX_MSG_MAP(CGameView)
	ON_COMMAND(ID_EASY, OnEasy)
	ON_COMMAND(ID_NORMAL, OnNormal)
	ON_COMMAND(ID_HARD, OnHard)
	ON_WM_LBUTTONDOWN()
	ON_COMMAND(ID_PROMPT, OnPrompt)
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(ID_TEST, OnTest)
	ON_COMMAND(ID_GAME, OnGame)
	ON_COMMAND(ID_MODE, OnMode)
	ON_COMMAND(ID_NO, OnNo)
	ON_COMMAND(ID_UPDOWN, OnUpdown)
	ON_COMMAND(ID_UPDOWN1, OnUpdown1)
	ON_COMMAND(ID_UPDOWN2, OnUpdown2)
	ON_COMMAND(ID_LEFT, OnLeft)
	ON_COMMAND(ID_LEFTRIGHT, OnLeftright)
	ON_COMMAND(ID_LEFTRIGHT1, OnLeftright1)
	ON_COMMAND(ID_LEFTRIGHT2, OnLeftright2)
	ON_COMMAND(ID_DOWN, OnDown)
	ON_COMMAND(ID_PREV_LAYER, OnPrevLayer)
	ON_COMMAND(ID_NEXT_LAYER, OnNextLayer)
	ON_COMMAND(ID_RESTART, OnRestart)
	ON_COMMAND(ID_PAUSE, OnPause)
	ON_COMMAND(ID_QUIT, OnQuit)
	ON_UPDATE_COMMAND_UI(ID_QUIT, OnUpdateQuit)
	ON_UPDATE_COMMAND_UI(ID_PROMPT, OnUpdatePrompt)
	ON_UPDATE_COMMAND_UI(ID_RESTART, OnUpdateRestart)
	ON_UPDATE_COMMAND_UI(ID_PAUSE, OnUpdatePause)
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_WM_TIMER()
	ON_UPDATE_COMMAND_UI(ID_NO, OnUpdateNo)
	ON_UPDATE_COMMAND_UI(ID_LEFTRIGHT, OnUpdateLeftright)
	ON_UPDATE_COMMAND_UI(ID_LEFTRIGHT1, OnUpdateLeftright1)
	ON_UPDATE_COMMAND_UI(ID_LEFTRIGHT2, OnUpdateLeftright2)
	ON_UPDATE_COMMAND_UI(ID_MODE, OnUpdateMode)
	ON_UPDATE_COMMAND_UI(ID_NEXT_LAYER, OnUpdateNextLayer)
	ON_UPDATE_COMMAND_UI(ID_PREV_LAYER, OnUpdatePrevLayer)
	ON_UPDATE_COMMAND_UI(ID_TEST, OnUpdateTest)
	ON_UPDATE_COMMAND_UI(ID_UPDOWN, OnUpdateUpdown)
	ON_UPDATE_COMMAND_UI(ID_UPDOWN1, OnUpdateUpdown1)
	ON_UPDATE_COMMAND_UI(ID_UPDOWN2, OnUpdateUpdown2)
	ON_UPDATE_COMMAND_UI(ID_LEFT, OnUpdateLeft)
	ON_UPDATE_COMMAND_UI(ID_GAME, OnUpdateGame)
	ON_UPDATE_COMMAND_UI(ID_DOWN, OnUpdateDown)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGameView construction/destruction

CGameView::CGameView()
{
	// TODO: add construction code here
	MyGame = new CMyGame;
	GameMode = DRAW ;
	TestGame = GAME ;
	GameColor[DRAW] = RGB(255,255,255) ;
	GameColor[EDIT] = RGB(255,0,0) ;
	GameColor[BACK] = RGB(0,0,0) ;
	GameColor[LINE] = RGB(0,255,0) ;
	for(int i = 0 ; i < 36 ; i++)
	{
		GameBmp[i].LoadBitmap(IDB_BITMAP1+i) ;
	}
}

CGameView::~CGameView()
{
}

BOOL CGameView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CGameView drawing

void CGameView::OnDraw(CDC* pDC)
{
	CGameDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	if ( MyGame->m_Class != EMPTY )
	{	InitScreen(pDC) ;
		DispPrompt() ;
		DrawGameBlock(pDC, MyGame); }
	else
		DrawBackground(pDC, IDB_BACKGROUND) ;
}

/////////////////////////////////////////////////////////////////////////////
// CGameView printing

BOOL CGameView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CGameView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CGameView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CGameView diagnostics

#ifdef _DEBUG
void CGameView::AssertValid() const
{
	CView::AssertValid();
}

void CGameView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CGameDoc* CGameView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGameDoc)));
	return (CGameDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CGameView message handlers

void CGameView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default

	if ((!MyGame->m_Pause)&&(MyGame->m_Class!=EMPTY))
	{
	if (MyGame->GetPoint(point.x, point.y))
	{
		if (GameMode == AUTO )
		{
			DrawFrame(DRAW, MyGame->m_xw[0], MyGame->m_yw[0]) ;
			DrawFrame(DRAW, MyGame->m_xw[1], MyGame->m_yw[1]) ;
			GameMode = DRAW ;
		}
		DrawFrame(EDIT, MyGame->m_xw[MyGame->m_num], MyGame->m_yw[MyGame->m_num]) ;
		if (MyGame->m_num==1)
		{
			if ((MyGame->m_xw[0]!=MyGame->m_xw[1])||(MyGame->m_yw[0]!=MyGame->m_yw[1]))
										//判断是否与前一点是一样的
			{
				if (!MyGame->CheckLine(false, 0,1))
				{
					GameMode = DRAW ;
					DrawFrame(GameMode, MyGame->m_xw[0], MyGame->m_yw[0]) ;
					DrawFrame(GameMode, MyGame->m_xw[1], MyGame->m_yw[1]) ;}
				else//成功消去
				{	GameLine(GameColor[LINE]) ;
				    _sleep(100) ;
					GameLine(GameColor[BACK]) ;
				    GameMode = BACK ;
					MyGame->m_Score += (MyGame->m_Layer+1)*10 ;
					MyGame->m_Count-- ;
					MyGame->m_Time+=2 ;
					GameMode = AUTO ;
					MyGame->MoveGraph() ;
					DrawGraph() ;
					if (MyGame->m_Count!=0)//判断是否已过关
						if (!MyGame->TestAll())
						{	
							if ( MyGame->m_Look != 0 ) 
							{	MyGame->m_Look-- ;
								MyGame->ReInitData() ;
							}
							else
							{
								AfxMessageBox("无牌可消!游戏结束!") ;
								MyGame->m_GameOver = true ;
								MyGame->m_Class = EMPTY ;
							}
							Invalidate() ;
						}
					DispPrompt() ;
				}
			}
			else
				DrawFrame(DRAW, MyGame->m_xw[0], MyGame->m_yw[0]) ;
			MyGame->m_num = -1 ;
			if (MyGame->m_Count==0)//判断是否过关
			{	
				MyGame->ProcessNext() ;
				Invalidate() ; }
		}
	}
 	}	
	CView::OnLButtonDown(nFlags, point);
}

void CGameView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if ((!MyGame->m_Pause)&&(MyGame->m_Class!=EMPTY))
	{
	while(MyGame->m_num>-1)
	{
		DrawFrame(DRAW, MyGame->m_xw[MyGame->m_num], MyGame->m_yw[MyGame->m_num]) ;
		MyGame->m_num-- ;
	}
	}
	CView::OnRButtonDown(nFlags, point);
}

/***************图像输出设计***************/

void CGameView::DrawGameBlock(CDC *pDC, CMyGame *MyGame)
{
	int x,y ;

	for(x=0;x<MyGame->m_Xsize;x++)
		for(y=0;y<MyGame->m_Ysize;y++)
			if ( TestGame )
				DrawFrame(DRAW, x, y) ;
			else
				DrawBmp(pDC, x, y) ;
}

void CGameView::InitScreen(CDC *pDC)
{
	char *Class[3]={"Easy","Normal","Hard"} ;
	if (MyGame->m_Class==EMPTY) return ;
	CBrush BackBrush(RGB(0,0,0)), *OldBrush ;
	OldBrush = pDC->SelectObject(&BackBrush) ;
	CRect WinRect(0,0,MyGame->m_ScreenWidth,MyGame->m_ScreenHeight) ;
	pDC->Rectangle(&WinRect) ;
	pDC->SelectObject(OldBrush) ;
	DispProgress(pDC) ;

	pDC->SetBkColor(RGB(0,0,0)) ;
	pDC->SetTextColor(RGB(255,255,0)) ;
	pDC->TextOut(18,30,"洗") ;
	pDC->TextOut(18,45,"牌") ;
	pDC->TextOut(160,5,"关卡") ;
	pDC->TextOut(160,35,"提示") ;
	CFont GameFont, *OldFont ;
	LOGFONT Font={30,10,0,0,FW_HEAVY,0,0,0,ANSI_CHARSET,
		OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"黑体"} ;
	GameFont.CreateFontIndirect(&Font);
	OldFont = pDC->SelectObject(&GameFont) ;
	pDC->SetTextColor(RGB(200,200,255)) ;
	pDC->TextOut(0,0,"Class") ;
	pDC->SelectObject(&OldFont) ;
	LOGFONT Font1={30,10,0,0,FW_HEAVY,0,0,0,ANSI_CHARSET,
		OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"Blackadder ITC"} ;
	CFont GameFont1 ;
	GameFont1.CreateFontIndirect(&Font1);
	OldFont = pDC->SelectObject(&GameFont1) ;
	pDC->TextOut(60,0,Class[MyGame->m_Class-1]) ;
	pDC->SelectObject(&OldFont) ;
}

void CGameView::DispPrompt()
{
	CClientDC dc(this) ;
	char *Title[13]={"不变化 ","向下  ","向左  ","上下分离","左右分离","上下集中",
		"左右集中","上左下右","左下右上","向外扩散","向内集中","向上  ","向右  "} ;
	CString str ;

	if (MyGame->m_Class==EMPTY) return ;
	CFont GameFont, *OldFont ;
	LOGFONT Font={30,10,0,0,FW_HEAVY,0,0,0,ANSI_CHARSET,
		OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"黑体"} ;
	GameFont.CreateFontIndirect(&Font);
	OldFont = dc.SelectObject(&GameFont) ;

	dc.SetBkColor(RGB(0,0,0)) ;
	dc.SetTextColor(RGB(200,200,255)) ;
	str.Format("%#2d",MyGame->m_Look) ;
	dc.TextOut(38,30,str) ;
	str.Format("%#2d",MyGame->m_Layer) ;
	dc.TextOut(210,0,str) ;
	Font.lfWidth = 20 ;
	dc.SelectObject(&GameFont) ;
	dc.TextOut(260,0,Title[MyGame->m_Layer]) ;
	str.Format("%#2d",MyGame->m_Prompt) ;
	dc.TextOut(210,30,str) ;
	str.Format("%#5d",MyGame->m_Score) ;
	dc.TextOut(680,25,str) ;
	dc.SelectObject(&OldFont) ;
}

void CGameView::DrawFrame(int Mode, int xw, int yw)
{
	CClientDC dc(this) ;
	if ( TestGame )
	{
		switch( Mode )
		{
		case DRAW :
			if ( MyGame->m_Data[xw][yw] != 0 )
			{
				DrawBack(&dc, DRAW, xw, yw) ;
				DrawBlock(&dc, BACK, xw, yw) ;
				DrawData(&dc, xw, yw) ;
			}
			else
				DrawBack(&dc, BACK, xw, yw) ;
			break ;
		case EDIT :
			DrawBlock(&dc, EDIT, xw, yw) ;
			break ;
		case BACK :
			DrawBack(&dc, BACK, xw, yw) ;
			break ;
		}
	}
	else
	{
		switch( Mode )
		{
		case DRAW :
			DrawBmp(&dc, xw, yw) ;
			break ;
		case EDIT :
			DrawBlock(&dc, EDIT, xw, yw) ;
			break ;
		case BACK :
			DrawBack(&dc, BACK, xw, yw) ;
			break ;
		}
	}
}

void CGameView::GameLine(COLORREF color)
{
	CClientDC dc(this) ;
	int x, y, x0, y0 ;
	CPen LinePen(0,2,color), *OldPen ;

	MyGame->TranToXYCenter(&x0, &y0, 0) ;
	OldPen = dc.SelectObject(&LinePen) ;
	dc.MoveTo(x0, y0) ;
	for(int i=2; i<=MyGame->m_num; i++)
	{
		MyGame->TranToXYCenter(&x, &y, i) ;
		dc.LineTo(x,y) ;
	}
	MyGame->TranToXYCenter(&x, &y, 1) ;
	dc.LineTo(x,y) ;
	dc.SelectObject(&OldPen) ;
}

void CGameView::DispProgress(CDC *pDC)
{
	CRect Rect(258,30,560,50);
	CBrush MyBrush(RGB(255,0,0)), *OldBrush ; ;
	pDC->Rectangle(&Rect) ;
	OldBrush = pDC->SelectObject(&MyBrush) ;
	pDC->Rectangle(Rect.left+2,Rect.top+2,Rect.left+MyGame->m_Time,Rect.bottom-2) ;
	pDC->SelectObject(&OldBrush) ;
}

void CGameView::DrawBmp(CDC *pDC, int xw, int yw)
{
	if ( MyGame->m_Data[xw][yw]==0 ) 
	{
		DrawBack(pDC, BACK, xw, yw) ;
		return ;
	}
	CDC dcMemory;
	dcMemory.CreateCompatibleDC(pDC);
		
	CBitmap* pOldBitmap = dcMemory.SelectObject(&GameBmp[MyGame->m_Data[xw][yw]-1]);
	int x, y ;

	MyGame->TranToXY(&x, &y, xw, yw) ;
	pDC->BitBlt(x, y, MyGame->m_dx, MyGame->m_dy, &dcMemory, 
			0, 0, SRCCOPY);	
	dcMemory.SelectObject(pOldBitmap);
}

void CGameView::DrawBack(CDC *pDC, int Mode, int xw, int yw)
{
	int x, y ;
	MyGame->TranToXY(&x, &y, xw, yw) ;
	DrawBack0(pDC, Mode, x, y, x+MyGame->m_dx, y+MyGame->m_dy) ;
}

void CGameView::DrawBack0(CDC *pDC, int Mode, int x, int y, int x1, int y1)
{
	CPen MyPen(0,1,GameColor[Mode]), *OldPen ;
	CBrush MyBrush(GameColor[Mode]), *OldBrush ;
	OldPen = pDC->SelectObject(&MyPen) ;
	OldBrush = pDC->SelectObject(&MyBrush) ;
	pDC->Rectangle(x,y,x1, y1) ;
	pDC->SelectObject(&OldBrush) ;
	pDC->SelectObject(&OldPen) ; 
}

void CGameView::DrawBlock(CDC *pDC, int Mode, int xw, int yw)
{
	int x, y ;
	
	CPen MyPen(0,2,GameColor[Mode]), *OldPen ;
	OldPen = pDC->SelectObject(&MyPen) ;
	MyGame->TranToXY(&x, &y, xw, yw) ;
	pDC->MoveTo(x+1,y+1) ;
	pDC->LineTo(x+1, y+MyGame->m_dy-1) ;
	pDC->LineTo(x+MyGame->m_dx-1, y+MyGame->m_dy-1) ;
	pDC->LineTo(x+MyGame->m_dx-1, y) ;
	pDC->LineTo(x+1,y+1) ;

⌨️ 快捷键说明

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