使用QT实现贪吃蛇小游戏

话不多说,咱们先来看看效果图

使用QT实现贪吃蛇小游戏_第1张图片使用QT实现贪吃蛇小游戏_第2张图片使用QT实现贪吃蛇小游戏_第3张图片

以下是第一关的代码,不过基本没什么注释,将就着看吧

#include "chidialog.h"
#include "ui_chidialog.h"
#include "guodialog.h"
#include "stopdialog.h"
#include "kadialog.h"
#include "goudai1dialog.h"
ChiDialog::ChiDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ChiDialog)
{
    ui->setupUi(this);
    //定时器
    timer=new QTimer();
    connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));
    timer->start(time);
    setFixedSize(800,600);
    setWindowTitle(tr("第1关"));
    QRect rect(300,200,nodeWidth,nodeHeight);
    snake.append(rect);
    addTop();
    addTop();
    addNewReword();
    label1=new QLabel(this);
    label1->setStyleSheet("color:green;font:75 12pt '方正舒体'");
    label1->setText("分数:");
    label1->setGeometry(this->width()-80,10,50,30);

    label2=new QLabel(this);
    label2->setStyleSheet("color:green;font:75 12pt '方正舒体'");
    label2->setText("0");
    label2->setGeometry(this->width()-30,10,30,30);

    label3=new QLabel(this);
    label3->setStyleSheet("color:green;font:75 12pt '方正舒体'");
    label3->setText("难度:");
    label3->setGeometry(this->width()-80,40,50,30);

    label4=new QLabel(this);
    label4->setStyleSheet("color:green;font:75 12pt '方正舒体'");
    label4->setText("1");
    label4->setGeometry(this->width()-30,40,30,30);

    startsound=new QSound("../bgm.wav", this);
    eat=new QSound("../chi.wav", this);
    die=new QSound("../die.wav", this);
    startsound->play();
    startsound->setLoops(-1);


}

ChiDialog::~ChiDialog()
{
    delete ui;
}
void ChiDialog::keyPressEvent(QKeyEvent *event)
{
        switch (event->key())
        {
            //向上
            case Qt::Key_Up:
            if(!checkContact())
            {
                if(moveFlag !=DIR_DOWN)
                {
                    moveFlag=DIR_UP;
                }
             }
                break;
            //向下
            case Qt::Key_Down:
            if(!checkContact())
            {
                if(moveFlag!=DIR_UP)
                {
                    moveFlag=DIR_DOWN;
                }
            }
              break;
            //向右
            case Qt::Key_Right:
            if(!checkContact())
            {
                if(moveFlag!=DIR_LEFT)
                {
                    moveFlag=DIR_RIGHT;
                }
            }
              break;
            //向左
            case Qt::Key_Left:
            if(!checkContact())
            {
                if(moveFlag!=DIR_RIGHT)
                {
                    moveFlag=DIR_LEFT;
                }
            }
              break;
            //空格——暂停/开始
            case Qt::Key_Space:
            if(!checkContact())
            {
                if(kaishi==false)
                {
                    if(gameStart==false)
                    {
                       gameStart=true;
                       timer->stop();
                       startsound->stop();
                    }
                    else
                    {
                        gameStart=false;
                        timer->start(time);
                        startsound->play();
                        startsound->setLoops(-1);
                    }
                }
            }
              break;
            case Qt::Key_Alt:
              { close();
                startsound->stop();
                KaDialog kd;
                kd.exec();

               }break;
        default:
            break;

        }
}
void ChiDialog::timeout()
{
    int count=1;
    if(snake[0].intersects(rewardNode))
    {
        count++;
        eat->play();
        addNewReword();
    }
    while(count--)
    {
        switch(moveFlag)
        {
            case DIR_UP:
            addTop();
                break;
            case DIR_DOWN:
            addDown();
                break;
            case DIR_RIGHT:
            addRight();
                break;
            case DIR_LEFT:
            addLeft();
                break;
            default:
                break;
        }
    }
    deleteLast();
    update();
    int fshu=snake.length()-3;
    if(fshu==10)
    {
        timer->stop();
        startsound->stop();
        close();
        GuoDialog gd;
        gd.exec();
    }
    label2->setText(QString::number(fshu));
}
void ChiDialog::addTop()
{
    QPointF leftTop;
    QPointF rightBotom;
    if(snake[0].y()-nodeHeight<0)
    {
        leftTop=QPointF(snake[0].x(),this->height()-nodeHeight);
        rightBotom=QPointF(snake[0].x()+nodeWidth,this->height());
    }
    else
    {
        leftTop=QPointF(snake[0].x(),snake[0].y()-nodeHeight);
        rightBotom=snake[0].topRight();
    }
    snake.insert(0,QRectF(leftTop,rightBotom));
}
void ChiDialog::addDown()
{
    QPointF leftTop;
    QPointF rightBotom;
    if(snake[0].y()+nodeHeight*2>this->height())
    {
        leftTop=QPointF(snake[0].x(),0);
        rightBotom=QPointF(snake[0].x()+nodeWidth,nodeHeight);
    }
    else
    {
        rightBotom=snake[0].bottomRight()+QPointF(0,nodeHeight);
        leftTop=snake[0].bottomLeft();
    }
    snake.insert(0,QRectF(leftTop,rightBotom));
}
void ChiDialog::addLeft()
{
    QPointF leftTop;
    QPointF rightBotom;
    if(snake[0].x()-nodeWidth<0)
    {
        leftTop=QPointF(this->width()-nodeWidth,snake[0].y());
    }
    else
    {
        leftTop=snake[0].topLeft()-QPointF(nodeWidth,0);
    }
    rightBotom=leftTop+QPointF(nodeWidth,nodeHeight);
    snake.insert(0,QRectF(leftTop,rightBotom));
}
void ChiDialog::addRight()
{
    QPointF leftTop;
    QPointF rightBotom;
    if(snake[0].x()+nodeWidth*2>this->width())
    {
        leftTop=QPointF(0,snake[0].y());
    }
    else
    {
        leftTop=snake[0].topRight();
    }
    rightBotom=leftTop+QPointF(nodeWidth,nodeHeight);
    snake.insert(0,QRectF(leftTop,rightBotom));
}
void ChiDialog::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QPen pen;//画笔
    QBrush brush;//画刷
    QPixmap pix;
    pix.load("../test33.jpg");
    painter.drawPixmap(0,0,800,600,pix);
    pen.setColor(Qt::blue);
    brush.setColor(Qt::darkMagenta);
    brush.setStyle(Qt::SolidPattern);
    painter.setPen(pen);
    painter.setBrush(brush);
    for (int i=0;i     {
        painter.drawRect(snake[i]);
    }

    pen.setColor(Qt::red);
    brush.setColor(Qt::red);
    brush.setStyle(Qt::SolidPattern);
    painter.setPen(pen);
    painter.setBrush(brush);
    painter.drawEllipse(rewardNode);

    if(checkContact())
    {
        timer->stop();
        startsound->stop();
        if(!siwang)
        {
            die->play();
            siwang=true;
        }
        QFont font("方正舒体",30,QFont::ExtraLight,false);
        painter.setFont(font);
        painter.drawText((this->width())/3,
                         (this->height())/5,
                         QString("GAME OVER !"));
        painter.drawText(((this->width())/3)+50,
                         (this->height())*2/5,
                         QString("分数:"));
        painter.drawText(((this->width())/3)+200,
                         (this->height())*2/5,
                         QString::number(snake.length()-3));

        close();
        Goudai1Dialog gd;
        gd.exec();
    }
    QWidget::paintEvent(event);
}
void ChiDialog::deleteLast()
{
    snake.removeLast();
}
void ChiDialog::addNewReword()
{
    rewardNode=QRectF(
                qrand()%(this->width()/20)*20,
                qrand()%(this->height()/20)*20,
                nodeWidth,
                nodeHeight);
}
bool ChiDialog::checkContact()
{
    for(int j=0;j     {
        for(int i=j+1;i         {
            if(snake[j]==snake[i])
            {
                return true;
            }
        }
    }
    return false;
}

 

具体代码可以到下载

https://download.csdn.net/download/liang13654/12602219

你可能感兴趣的:(QT,Qt5,类)