最近用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