本项目的下载地址:戳此访问

这一篇实现数码管的显示,鼠标的图标的改变和一种新的设计模式--单例模式.

这个终极篇拖了好久,着实惭愧.今夜是中秋佳节,所以今夜我就对这个打地鼠的小游戏做一个了断吧.

先介绍到单例模式.

所为单例模式就是C++编程的一个小技巧,它是全局变量的替代品.即我们定义一个类,使得这个类只能获得一个对象,

#ifndef HANDLER_H
#define HANDLER_H

#include <QObject>

class handler : public QObject
{
    Q_OBJECT
public:
    //静态不用实例化就可以之间调用
    static handler* getInstance();//只能获得一个对象实现单例模式
    void addScore();
private://改成private的目的是在类外不能新建对象实现数据的封闭
    explicit handler(QObject *parent = nullptr);

signals:
    void beatMouse();//人为发送信号,函数声明
private:
    static handler* hand;

public slots:
};

#endif // HANDLER_H

handler.cpp为:

#include "handler.h"



handler::handler(QObject *parent) : QObject(parent)
{

}

handler* handler::hand = new handler;//静态成员变量的初始化方式

handler *handler::getInstance()
{
    return hand;//具有全局变量的特性
}

void handler::addScore()
{
    emit beatMouse();
}

有了handler类我们在mainwindow.cpp中添加进handler的头文件,然后在构造函数中初始化,进入添加信号与槽,定义分数变量用来显示在数码管中,具体如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QMessageBox>
#include<handler.h>//通过handler发射信号包含进来头文件

#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    scene = new myScene(this);
    this->ui->graphicsView->setScene(scene);//在容器内设置场景

    //开始按钮的设置
    connect(ui->btn_start,&QPushButton::clicked,this->scene,&myScene::startGame);
    connect(ui->btn_pause,&QPushButton::clicked,this->scene,&myScene::pauseGame);
    connect(ui->btn_end,&QPushButton::clicked,this->scene,&myScene::stopGame);
    this->score = 0;//初始化为0
    handler* hand = handler::getInstance(); //这一行代码是获取实例的意思,就是通过getInstance()函数获取hand对象
    connect(hand,&handler::beatMouse,this,&MainWindow::updateScore);
}

显示分数的函数如下:

void MainWindow::updateScore()
{
    this->score+=10;//每打一次加10分
    this->ui->lcdNumber->display(this->score);//将打老鼠的次数显示在数码管上
}

至此数码管可以正常显示分数了.

随后更改鼠标点击的样式和打击老鼠时背景图的切换.

对于鼠标的样式,只要重写事件函数即可,分别在鼠标按下事件和鼠标抬起事件中添加语句:

this->setCursor(QCursor(QPixmap(":/mouse/picturedown.png")));

至此,打地鼠的项目就写完了,这个例子不是很简单,设计的东西很多,自己还需要多消化.