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。添加程序界面菜單,可以開始遊戲或者查看幫助還是設置。還可以增加暫停功能。

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