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

📄 mfc_snakeview.cpp

📁 MFC的贪吃蛇
💻 CPP
字号:
// MFC_SNAKEView.cpp : implementation of the CMFC_SNAKEView class
//

#include "stdafx.h"
#include "MFC_SNAKE.h"

#include "MFC_SNAKEDoc.h"
#include "MFC_SNAKEView.h"

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

struct snake
{
	int x,y;
	int l;
	int r;
}snake[50];
struct food
{
	int x;
	int y;
	int isfood;
}food;
int isage=0;
int s=0;

/////////////////////////////////////////////////////////////////////////////
// CMFC_SNAKEView

IMPLEMENT_DYNCREATE(CMFC_SNAKEView, CView)

BEGIN_MESSAGE_MAP(CMFC_SNAKEView, CView)
	//{{AFX_MSG_MAP(CMFC_SNAKEView)
	ON_WM_TIMER()
	ON_WM_KEYDOWN()
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(IDM_START, OnStart)
	ON_COMMAND(IDM_PAUSE, OnPause)
	ON_COMMAND(IDM_CONTINUE, OnContinue)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CMFC_SNAKEView construction/destruction

CMFC_SNAKEView::CMFC_SNAKEView()
{
	// TODO: add construction code here

}

CMFC_SNAKEView::~CMFC_SNAKEView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMFC_SNAKEView drawing

void CMFC_SNAKEView::OnDraw(CDC* pDC)
{
	CBrush backBrush(RGB(100,100,0)); 
	CBrush* pOldBrush = pDC->SelectObject(&backBrush); 
	CRect rect; 
	pDC->GetClipBox(&rect);// 获取需要用背景刷子涂抹的区域 
	pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(),PATCOPY); 
	pDC->SelectObject(pOldBrush);

	CMFC_SNAKEDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);	
	pDC->Rectangle(19,19,501,501);
	pDC->Rectangle(29,29,491,491);
	pDC->Rectangle(39,39,481,481);
	oninit();
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CMFC_SNAKEView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CMFC_SNAKEView diagnostics

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

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

CMFC_SNAKEDoc* CMFC_SNAKEView::GetDocument() // non-debug version is insnake[0].l
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFC_SNAKEDoc)));
	return (CMFC_SNAKEDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMFC_SNAKEView message handlers

void CMFC_SNAKEView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	snake[0].x=10;
	snake[0].y=10;
	snake[1].x=11;
	snake[1].y=10;
	snake[2].x=12;
	snake[2].y=10;
	snake[0].r=3;
	snake[0].l=3;
	food.isfood=1;
	
}

void CMFC_SNAKEView::OnTimer(UINT nIDEvent) 
{
	CDC *pDC=GetDC();
	CString soure;
/*//////////////////////////加速////////////////////////////*/
/*////////*/if(snake[0].l==2)SetTimer(1,370,NULL);/*////////*/
/*////////*/if(snake[0].l==3)SetTimer(1,270,NULL);/*////////*/
/*////////*/if(snake[0].l==6)SetTimer(1,200,NULL);/*////////*/
/*////////*/if(snake[0].l==9)SetTimer(1,100,NULL);/*////////*/
/*/////////////////////////加速/////////////////////////////*/
	soure.Format("你得到了:%d!",(snake[0].l-3)*10);	
	///////////////////////判断是否撞边界/////////////////////////////////////
	if(snake[0].x*20<=37||snake[0].y*20<=37||snake[0].x*20>=462||snake[0].y*20>=462)
	{
		KillTimer(1);
		AfxMessageBox(soure);
		s=0;
	}
	////////////////////////////判断撞蛇身////////////////////////////////////
	if(snake[0].l>3)
		for(int sn=snake[0].l-1;sn>0;sn--)
		{
			if(snake[0].x*20==snake[sn].x*20&&snake[0].y*20==snake[sn].y*20)
			{
				KillTimer(1);
				AfxMessageBox(soure);
				s=0;
			}
		}
	///////////////////////////////////////////////////////////////////////////
	pDC->SelectStockObject(WHITE_PEN);
	pDC->Rectangle(snake[snake[0].l-1].x*20,snake[snake[0].l-1].y*20,(snake[snake[0].l-1].x+1)*20,(snake[snake[0].l-1].y+1)*20);
	for(int i=snake[0].l-1;i>0;i--)
	{
		snake[i].x=snake[i-1].x;
		snake[i].y=snake[i-1].y;
	}
	//////////得到行走方向/////////////////
	if(snake[0].r==1)snake[0].y--;
	if(snake[0].r==2)snake[0].y++;
	if(snake[0].r==3)snake[0].x--;
	if(snake[0].r==4)snake[0].x++;
	pDC->SelectStockObject(BLACK_PEN);

	CBrush DrawBrush=(RGB(100,100,100));
	CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);
	pDC->Rectangle(snake[0].x*20,snake[0].y*20,(snake[0].x+1)*20,(snake[0].y+1)*20);
	pDC->SelectObject(DrawBrush);
	////////////判断吃豆,如果碰撞则吃豆///////////////////
	if(snake[0].x*20==food.x*20&&snake[0].y*20==food.y*20)
	{
		snake[0].l++;
		food.isfood=1;
		snake[snake[0].l-1].x=snake[snake[0].l-2].x;
		snake[snake[0].l-1].y=snake[snake[0].l-2].y;
	}
	///////////////如果"豆"被吃掉则重新生成///////////////////
	if(food.isfood==1)
	{
		srand((unsigned)time(NULL));
		do
		{
			for(int isfo=snake[0].l-1;isfo>=0;isfo--)
				if(snake[0].x*20==snake[isfo].x*20&&snake[0].y*20==snake[isfo].y*20)
				{
					food.x=rand()%25;
					food.y=rand()%25;
				}
		}while(food.x*20<70||food.y*20<70||food.x*20>430||food.y*20>430);
		pDC->Rectangle(food.x*20,food.y*20,(food.x+1)*20,(food.y+1)*20);
		food.isfood=0;
	}
	///////////////////升级////////////////////////
	if(snake[0].l==5)
	{		
		s+=snake[0].l*10;
		KillTimer(1);
		AfxMessageBox("升级!");
		snake[0].x=10;
		snake[0].y=10;
		snake[1].x=11;
		snake[1].y=10;
		snake[2].x=12;
		snake[2].y=10;
		snake[0].r=1;
		snake[0].l=3;
		food.isfood=1;
		CBrush DrawBrush=(RGB(255,255,255));
		CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);
		pDC->Rectangle(39,39,481,481);
		pDC->SelectObject(DrawBrush);
		
		
		soure.Format("当前得分:%d",s);
		AfxMessageBox(soure);
		
		SetTimer(1,3000,NULL);
		oninit();
	}

	CView::OnTimer(nIDEvent);
}

void CMFC_SNAKEView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	///////////////获取按键方向//////////////////////
	switch(nChar)
	{
	case VK_UP:if(snake[0].r!=2)snake[0].r=1;break;
	case VK_DOWN:if(snake[0].r!=1)snake[0].r=2;break;
	case VK_LEFT:if(snake[0].r!=4)snake[0].r=3;break;
	case VK_RIGHT:if(snake[0].r!=3)snake[0].r=4;break;
	}
	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}



void CMFC_SNAKEView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CString str;
	str.Format("%d,%d",point.x,point.y);
	AfxMessageBox(str);
	CView::OnRButtonDown(nFlags, point);
}

void CMFC_SNAKEView::oninit()
{
	CDC *pDC=GetDC();
	CBrush DrawBrush=(RGB(100,100,100));
	CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);
	for(int i=0;i<=snake[0].l-1;i++)
		pDC->Rectangle(snake[i].x*20,snake[i].y*20,(snake[i].x+1)*20,(snake[i].y+1)*20);
	pDC->SelectObject(DrawBrush);

}

void CMFC_SNAKEView::OnStart() 
{
	// TODO: Add your command handler code here
	SetTimer(1,3000,NULL);
	AfxMessageBox("3秒后开始游戏!");
}

void CMFC_SNAKEView::OnPause() 
{
	// TODO: Add your command handler code here
	KillTimer(1);
	AfxMessageBox("游戏暂停...");
}

void CMFC_SNAKEView::OnContinue() 
{
	// TODO: Add your command handler code here
	SetTimer(1,10,NULL);
}

⌨️ 快捷键说明

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