Qt模仿九宫格游戏

最近用Qt简单制作了一个九宫格游戏(当然支持16宫格等)。
游戏制作比较简略,忘记添加原图提供原图参考了。
效果图
在这里插入图片描述
十六宫格图片
在这里插入图片描述
头文件

#ifndef QWHPUZZLEGAME_H
#define QWHPUZZLEGAME_H

#include <QWidget>
#include <QPixmap>
#include <QLabel>
#include <QPainter>
#include <QMouseEvent>
#include <QResizeEvent>
#include <QGridLayout>

#define N 4

class QWHPuzzleGame : public QWidget
{
    Q_OBJECT
public:
    struct GameInfo
    {
        int i;
        int j;
        QRectF rect;
        bool hasPixmap;
        QLabel *label;

        GameInfo()
        {
            i = -1;
            j = -1;
            rect = QRectF(0, 0, 0, 0);
            hasPixmap = false;
            label = nullptr;
        }

        void operator=(GameInfo info)
        {
            this->i = info.i;
            this->j = info.j;
            this->rect = info.rect;
            this->hasPixmap = info.hasPixmap;
            this->label = info.label;
        }
    };

    explicit QWHPuzzleGame(QWidget *parent = nullptr);

public:
    //设置图片
    void setPixmap(const QPixmap &pixmap);
    //重新开始(打乱图片)
    void restart();

protected:
    //eventFilter函数控制Label移动
    bool eventFilter(QObject *watched, QEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void resizeEvent(QResizeEvent *event);
    void paintEvent(QPaintEvent *event);

private:
    //判断该图片是否可以移动(只允许相邻上下左右移动)
    bool canMove(int order);
    //打乱图片
    void randomPixmap();

signals:
    void successful();

private:
    QColor m_color;             //可移动图片区域可移动颜色
    QColor m_forbiddenColor;    //不可移动区域颜色
    int m_spacing;              //网格布局空隙
    QGridLayout *m_gLayout;     //网格布局
    GameInfo m_curGameInfo;     //当前点击区域信息
    GameInfo m_targetGameInfo;  //目标区域信息
    //鼠标事件变量
    QPoint m_lastPoint;         //最后按下的坐标
    bool m_pressed;             //鼠标是否按下
    bool m_leftButton;          //限定鼠标左键按下
    bool m_inParentArea;        //限定控件在父窗口内移动
    //区域信息
    QPixmap m_pixmap;           //保存原始图片
    QLabel *m_labs[N * N - 1];      //保存分割后的图片
    GameInfo m_gameInfo[N][N];  //保存区域信息
};

#endif // QWHPUZZLEGAME_H
发布了228 篇原创文章 · 获赞 44 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_40945965/article/details/104374167