Qt制作贪吃蛇(三)

这篇文章加上显示分数功能

 

由于要腾出一块地方显示分数,如图:

所以又定义了连个变量gameWidth 和 gameHeight表示游戏部分的宽和高,而不再是整个窗体都用来显示游戏界面

mainwindow.h

省略了一些代码,和本章内容无关的代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    void paintEvent(QPaintEvent *event);
    void keyPressEvent(QKeyEvent *event);

public:
    void createFood();
    bool hasEatFood();       //是否吃到食物

public:
    int gameWidth;      //贪吃蛇游戏界面的宽度和高度
    int gameHeight;
    int score=0;
};

#endif // MAINWINDOW_H

mainwindow.cpp

其构造函数如下所示,所以我们要把之前的this->width()和this->height()都要改成gameWidth,gameHeight。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    resize(700, 500);
    gameWidth = 500;
    gameHeight = this->height();


    snake.initBody();

    snake.move(gameWidth,gameHeight);   //程序一启动就要走一步,然后每隔固定时间走一步
    createFood();   //程序一启动就创建一个food

    initTimer();
}

绘图函数增加如下代码

void MainWindow::paintEvent(QPaintEvent *event)
{
    ...

//划游戏界面和显示界面的分界线
    painter.drawLine(QPointF(gameWidth,0),QPointF(gameWidth,gameHeight));

    QFont font("方正舒体",18,QFont::ExtraLight,false);
    pen.setColor(Qt::black);
    painter.setPen(pen);
    painter.setFont(font);

    painter.drawText(gameWidth+20,40,QString("当前得分: %1").arg(score));


    update();
}

hasEatFood函数修改如下

bool MainWindow::hasEatFood()
{
    for(int i=0;i<food.size();i++){
        if(food.at(i).contains(snake.body.at(0).topLeft()+QPointF(snake.width/2,snake.height/2))){
            if(food.at(i).width()>snake.width) {    //吃到了大的食物
                score+=2;
            }
            score+=1;
            food.removeAt(i);
            snake.addNode(gameWidth,gameHeight);

            qDebug()<<"eat food";
            return true;
        }
    }
    return false;
}

改进

可以添加蛇的死亡事件,用于判断游戏是否gameover。添加程序界面菜单,可以开始游戏或者查看帮助还是设置。还可以增加暂停功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章