天天看點

使用QT實作貪吃蛇小遊戲

話不多說,咱們先來看看效果圖

使用QT實作貪吃蛇小遊戲
使用QT實作貪吃蛇小遊戲
使用QT實作貪吃蛇小遊戲

以下是第一關的代碼,不過基本沒什麼注釋,将就着看吧

#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<snake.length();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<snake.length();j++)

    {

        for(int i=j+1;i<snake.length();i++)

        {

            if(snake[j]==snake[i])

            {

                return true;

            }

        }

    }

    return false;

}

具體代碼可以到下載下傳

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

繼續閱讀