📄 hungersnakeview.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 + -