这篇文章加上显示分数功能
由于要腾出一块地方显示分数,如图:
所以又定义了连个变量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。添加程序界面菜单,可以开始游戏或者查看帮助还是设置。还可以增加暂停功能。