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

📄 snakegame.cpp

📁 MFC下的贪食蛇
💻 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 + -