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

📄 hungersnakeview.cpp

📁 一个小游戏
💻 CPP
字号:
// HungerSnakeView.cpp : implementation of the CHungerSnakeView class
//

#include "stdafx.h"
#include "HungerSnake.h"

#include "HungerSnakeDoc.h"
#include "HungerSnakeView.h"
#include <conio.h>

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

/////////////////////////////////////////////////////////////////////////////
// CHungerSnakeView

IMPLEMENT_DYNCREATE(CHungerSnakeView, CView)

BEGIN_MESSAGE_MAP(CHungerSnakeView, CView)
	//{{AFX_MSG_MAP(CHungerSnakeView)
	ON_WM_CREATE()
	ON_WM_TIMER()
	ON_WM_KEYDOWN()
	ON_WM_DESTROY()
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CHungerSnakeView construction/destruction

CHungerSnakeView::CHungerSnakeView()
{
	SnakeBody aSnakeBody;
	aSnakeBody.x = 200;
	aSnakeBody.y = 200;
	aSnakeBody.speed = 0;
	strcpy(aSnakeBody.str,"⊙");

	SnakeBody aSnakeBody1;
	aSnakeBody1.x = 200;
	aSnakeBody1.y = 200 + 12;
	aSnakeBody1.speed = 0;
	strcpy(aSnakeBody1.str,"o");

	aSnake.Add(aSnakeBody);
	aSnake.Add(aSnakeBody1);


	SPEED = STOP;

	IsKeyDown = false;

	AddBody = false;


	
	aFruit.x = 0;
	aFruit.y = 0;
	aFruit.IsHave = false;
}

CHungerSnakeView::~CHungerSnakeView()
{
}

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

	
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CHungerSnakeView drawing

void CHungerSnakeView::OnDraw(CDC* pDC)
{
	CHungerSnakeDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	
}

/////////////////////////////////////////////////////////////////////////////
// CHungerSnakeView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CHungerSnakeView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CHungerSnakeView message handlers

int CHungerSnakeView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	/////////////改变窗口的属性(背景色改为黑色)/////////////////////////////////
	::SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));
	////////////////////////////////////////////////////////////////////////////
	
	this->SetTimer(1,100,NULL);
	srand( time( 0 ) );  
	return 0;
}

void CHungerSnakeView::OnTimer(UINT nIDEvent) 
{
	
	static UINT nT = 0;
	nT++;
	CString str;
	str.Format("%d",nT);
	CDC* pDC = this->GetDC();


	/////绘制一个游戏外围的矩形框///////////////////////////
	CRect GameRect(50,50,400,400);
	CPen pen(PS_SOLID,2,RGB(255,0,0));
	CPen* oldpen = pDC->SelectObject(&pen);
	CBrush aBrush(RGB(0,0,0));
	CBrush* oldBrush = pDC->SelectObject(&aBrush);
	pDC->Rectangle(&GameRect);
	pDC->SelectObject(oldpen);
	pDC->SelectObject(oldBrush);
	::DeleteObject(pen);
	::DeleteObject(aBrush);
	////////////////////////////////////////////////////////

	/////////////时钟////////////////////////////
	pDC->SetBkColor(RGB(0,0,0));
	pDC->SetTextColor(RGB(0,255,0));
	pDC->TextOut(100,0,str);
	////////////////////////////////////////////

	//////测试用的打印了蛇的每个部分坐标///////////
	int nQ = aSnake.GetSize();
	CString str1;
	str1.Format("%d",nQ);
	pDC->TextOut(0,0,str1);
	for(int k = 0; k < nQ; k++)
	{
		CString str2;

		str2.Format("%d,%d",aSnake[k].x, aSnake[k].y);
		pDC->TextOut(0,k*20,str2);
	}
	//////////////////////////////////////////////////


	//把蛇头的坐标保存在一个点里面
	CPoint pt;
	pt.x = aSnake[0].x;
	pt.y = aSnake[0].y;
	//判断死亡
	for(int m = 1; m < aSnake.GetSize(); m++)
	{
		/////给蛇的身体每个部分做一个范围
		CRect anyRect;
		anyRect.left = aSnake[m].x - 5;
		anyRect.right = aSnake[m].x + 5;
		anyRect.top = aSnake[m].y - 5;
		anyRect.bottom = aSnake[m].y + 5;

		if(anyRect.PtInRect(pt) || !GameRect.PtInRect(pt))
		{
			pDC->TextOut(200,200,"Lost Game");
			this->KillTimer(1);
			Sleep(3000);
			::DestroyWindow(::AfxGetMainWnd()->m_hWnd);
			return;
		}
	}


	//做一个范围,当作吃到果实的判定范围
	CRect aRect;
	aRect.left = aFruit.x-10;
	aRect.right = aFruit.x + 10;
	aRect.top = aFruit.y - 10;
	aRect.bottom = aFruit.y + 10;

	

	//////////判断吃到果子/////////
	if(aRect.PtInRect(pt))
	{
		int i = aSnake.GetSize();
		SnakeBody aSnakeBody;
		aSnakeBody.x = aSnake[i-1].x;
		aSnakeBody.y = aSnake[i-1].y;
		aSnakeBody.speed = 0;
		strcpy(aSnakeBody.str,"o");
		aSnake.Add(aSnakeBody);

		aFruit.IsHave = false;
		AddBody = true;
	}
	////////////////////////////////////////////////
	

	//果实
	if(IsKeyDown)
	{
		if(aFruit.IsHave)
		{
			pDC->TextOut(aFruit.x, aFruit.y, "※");
		}else
		{
			aFruit.x = rand()%(370-50) +55;
			aFruit.y = rand()%(370-50) +55;
			pDC->TextOut(aFruit.x, aFruit.y, "※");
			aFruit.IsHave = true;
		}
	}


	

	//蛇
	for(int nI = 0; nI < aSnake.GetSize(); nI++)
	{
		pDC->TextOut(aSnake[nI].x, aSnake[nI].y,aSnake[nI].str);
	}
	

	
	if(IsKeyDown)
	{
		//蛇身坐标传递
		if(AddBody == false)
		{
			for(int nI = aSnake.GetSize() - 1; nI > 0; nI--)
			{	
				aSnake[nI].x = aSnake[nI - 1].x;
				aSnake[nI].y = aSnake[nI - 1].y;
			}
		}else//增加长度
		{
			for(int nI = aSnake.GetSize() - 2; nI > 0; nI--)
			{	
				aSnake[nI].x = aSnake[nI - 1].x;
				aSnake[nI].y = aSnake[nI - 1].y;
			}
			AddBody = false;
		}
	}		

	//蛇头坐标移动
	switch(SPEED)
	{
		case STOP: break;
		case UP:   aSnake[0].y = aSnake[0].y - 12;  break;
		case DOWN: aSnake[0].y = aSnake[0].y + 12;  break;
		case LEFT: aSnake[0].x = aSnake[0].x - 12;  break;
		case RIGHT:aSnake[0].x = aSnake[0].x + 12;  break;
	}


	CView::OnTimer(nIDEvent);
}

void CHungerSnakeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	
	static UINT SAVEPRE = 0;
	if((SAVEPRE == VK_UP && nChar == VK_DOWN)
		||(SAVEPRE == VK_DOWN && nChar == VK_UP)
		||(SAVEPRE == VK_LEFT && nChar == VK_RIGHT)
		||(SAVEPRE == VK_RIGHT && nChar == VK_LEFT))
	{
		return;
	}

	switch(nChar)
	{
		case VK_UP:   SPEED = UP;    IsKeyDown = true;  break;
		case VK_DOWN: SPEED = DOWN;  IsKeyDown = true;  break;
		case VK_LEFT: SPEED = LEFT;  IsKeyDown = true;  break;
		case VK_RIGHT:SPEED = RIGHT; IsKeyDown = true;  break;
	}

	SAVEPRE = nChar;
	
	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CHungerSnakeView::OnDestroy() 
{
	CView::OnDestroy();
	
	this->KillTimer(1);	
}

⌨️ 快捷键说明

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