這篇文章加上顯示分數功能
由於要騰出一塊地方顯示分數,如圖:
所以又定義了連個變量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。添加程序界面菜單,可以開始遊戲或者查看幫助還是設置。還可以增加暫停功能。