📄 snakegame.cpp
字号:
// SnakeGame.cpp: implementation of the CSnakeGame class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Snake.h"
#include "SnakeGame.h"
#include "IGraphicOut.h"
#include "time.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSnakeGame::CSnakeGame(IGraphicOut * const pGO)
: IActionHandler(pGO),
//m_pCSnakeGame(0),
m_xSize(26), m_ySize(18), m_bodynum(1),
m_xPos(m_xSize/2), m_yPos(m_ySize/2),
//m_xPosBody(m_xPos+1), m_yPosBody(m_yPos),
m_curDir(left),
m_score(0),
m_timerCount(0),
m_mouseOpen(false),
m_speed(7),
m_xFood(-1), m_yFood(-1)
{
m_xPosBody[0] = m_xPos+1 ; m_yPosBody[0] = m_yPos;
for(int i = 1 ; i < 100 ; i++)
{
m_xPosBody[i]=0;
m_yPosBody[i]=0;
}
srand(time(0L));
pGO->setDisplaySize(m_xSize, m_ySize);
m_xFood = rand() % m_xSize;
m_yFood = rand() % m_ySize;
}
CSnakeGame::~CSnakeGame()
{
}
void CSnakeGame::leftMove()
{
if (m_curDir != right)
if (m_xPos>0)
m_curDir = left;
}
void CSnakeGame::rightMove()
{
if (m_curDir != left)
if (m_xPos<m_xSize-1)
m_curDir = right;
}
void CSnakeGame::upMove()
{
if (m_curDir != down)
if (m_yPos<m_ySize-1)
m_curDir = up;
}
void CSnakeGame::downMove()
{
if (m_curDir != up)
if (m_yPos>0)
m_curDir = down;
}
void CSnakeGame::timeUp()
{
if (++m_timerCount >= 10*m_speed) // 10*m_speed*5ms
{
// In the following, no wall collision tested
switch (m_curDir)
{
case left:
if (m_xPos>0 && cango(m_xPos - 1 , m_yPos))
{
m_xPos--;
for(int i = m_bodynum ; i >= 2 ; i--)
{
m_xPosBody[i - 1] = m_xPosBody[i - 2];
m_yPosBody[i - 1] = m_yPosBody[i - 2];
}
m_xPosBody[0] = m_xPos+1;
m_yPosBody[0] = m_yPos;
}
break;
case up:
if (m_yPos<m_ySize-1 && cango(m_xPos , m_yPos + 1))
{
m_yPos++;
for(int i = m_bodynum ; i >= 2 ; i--)
{
m_xPosBody[i - 1] = m_xPosBody[i - 2];
m_yPosBody[i - 1] = m_yPosBody[i - 2];
}
m_yPosBody[0] = m_yPos-1;
m_xPosBody[0] = m_xPos;
}
break;
case right:
if (m_xPos<m_xSize-1 && cango(m_xPos + 1, m_yPos))
{
m_xPos++;
for(int i = m_bodynum ; i >= 2 ; i--)
{
m_xPosBody[i - 1] = m_xPosBody[i - 2];
m_yPosBody[i - 1] = m_yPosBody[i - 2];
}
m_xPosBody[0] = m_xPos-1;
m_yPosBody[0] = m_yPos;
}
break;
case down:
if (m_yPos>0 && cango(m_xPos , m_yPos - 1))
{
m_yPos--;
for(int i = m_bodynum ; i >= 2 ; i--)
{
m_xPosBody[i - 1] = m_xPosBody[i - 2];
m_yPosBody[i - 1] = m_yPosBody[i - 2];
}
m_yPosBody[0] = m_yPos+1;
m_xPosBody[0] = m_xPos;
}
break;
}
if ((m_xPos==m_xFood)&&
(m_yPos==m_yFood))
{
m_bodynum ++;
m_score += 100;
int i = m_score / 1000;
int speed = 7 - i;
if(speed < 1)
speed = 1;
changeSpeed(speed);
m_xFood = rand() % m_xSize;
m_yFood = rand() % m_ySize;
// no collision tested
}
m_mouseOpen = false;
m_pGO->redraw();
m_timerCount = 0;
}
else if (m_timerCount == 10/2*m_speed) // blinking
{
m_mouseOpen = true;
m_pGO->redraw();
}
}
void CSnakeGame::exit()
{
m_pGO->scoreBoard("\t\tHighest Scores\n"
"1. Gavin Snake\t\t1000000000000\n"
"\tHei,Guy.Cheer up and try again!\n"
"\n\t\tGood bye!!");//写计分板,有待改进,变成真正能够记录最高分的……
}
void CSnakeGame::draw()
{
if ((m_xFood>=0)&&(m_yFood>=0))
m_pGO->drawFood(IGraphicOut::flower, m_xFood, m_yFood);
if (m_mouseOpen)
m_pGO->drawHead(m_curDir+10, m_xPos, m_yPos);
else
m_pGO->drawHead(m_curDir, m_xPos, m_yPos);
for(int i = m_bodynum - 1 ; i >= 0 ; i --)
{
m_pGO->drawBody(m_xPosBody[i], m_yPosBody[i]);
}
m_pGO->drawScore(m_score);
// demo only, no collision detetion
m_pGO->drawHorzWall(3, 5, 2);
m_pGO->drawVertWall(8, 0, 5);
}
void CSnakeGame::changeSpeed(int speed)
{
m_speed = speed;
}
bool CSnakeGame::cango(int x, int y)
{
for(int i = 0 ; i < m_bodynum ; i ++)
{
if ( x == m_xPosBody[i] && y == m_yPosBody[i])
return false;
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -