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

📄 snakegame.cpp

📁 在c语言环境下的贪吃蛇源代码
💻 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_xSize(15), m_ySize(15),
      m_xPos(m_xSize/2), m_yPos(m_ySize/2),
      m_xPosBody(m_xPos+1), m_yPosBody(m_yPos),
      m_curDir(left),
      m_score(12345),
      m_timerCount(0),
      m_mouseOpen(false),
      m_speed(5),
      m_xFood(-1), m_yFood(-1)
{
    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)
                {
                    m_xPos--;
                    m_xPosBody = m_xPos+1;
                    m_yPosBody = m_yPos;
                }
                break;
            case up:
                if (m_yPos<m_ySize-1) 
                {
                    m_yPos++;
                    m_yPosBody = m_yPos-1;
                    m_xPosBody = m_xPos;
                }
                break;
            case right:
                if (m_xPos<m_xSize-1) 
                {
                    m_xPos++;
                    m_xPosBody = m_xPos-1;
                    m_yPosBody = m_yPos;
                }
                break;
            case down:
                if (m_yPos>0) 
                {
                    m_yPos--;
                    m_yPosBody = m_yPos+1;
                    m_xPosBody = m_xPos;
                }
                break;
        }
        if ((m_xPos==m_xFood)&&
            (m_yPos==m_yFood))
        {
            m_score += 100;
            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. John Snake\t\t12345678\n"
                      "2. Rob Epson\t\t98765\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);
    m_pGO->drawBody(m_xPosBody, m_yPosBody);
    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;
}

int CSnakeGame::getSpeed()
{
    return m_speed;
}

⌨️ 快捷键说明

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