QT环境下实现UI界面的“拼图游戏”

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    w.setFixedSize(760,500);

    w.setWindowFlags(Qt::WindowCloseButtonHint);

    w.show();

    return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDebug>
#include <QFileDialog>
#include <QPushButton>
#include <QMouseEvent>
#include <QMessageBox>
#include <QtGlobal>//随意数头文件
#include <QTimer>
#include <QTime>

#define SMALL_W 130
#define SMALL_H 100
#define PHOTO_X 20
#define PHOTO_Y 110


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    timer=new QTimer(this);
    connect(timer,SIGNAL(timeout()),
            SLOT(onTimerOut()));

    ui->label_3->setText((QString::number(bushusum)));//步数写入
    ui->time_label->setText((QString::number(tim)));//时间
    this->setStyleSheet(
                "MainWindow{border-image: url(:/beijing.jpg);}");//增加背景图片;

//    QPixmap tep(":/beijing.jpg");
//    MainWindow->setPixmap(QPixmap::fromImage(tep));
//    ui->btn->setText("nicai");//最按钮进行命名;

    pSourceImage=NULL;//制空
//    if(pSourceImage==NULL)
//    {
//        return ;
//    }
    for(int i=0;i<3;i++){       //将图片划分区域;
        for(int j=0;j<3;j++){
            pLbImage[i*3+j] = new QLabel(this);
            pLbImage[i*3+j]->setGeometry(0,0,SMALL_W,SMALL_H);
            pLbImage[i*3+j]->move(PHOTO_X+SMALL_W*i,
                                 PHOTO_Y+SMALL_H*j);
            pLbImage[i*3+j]->setFrameShape(QFrame::Box);
        }

    }
    connect(ui->btn,SIGNAL(clicked()),this,SLOT(test()));  //按键 信号(有按键按下) 链接 槽函数
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_btn_clicked()
{
    //打开对话窗
    strFileName =
        QFileDialog::getOpenFileName(this,
                                     "select pictures",
                                     "/home/newcapec",
                                     "Images(*.png *.jpg)");
    if(strFileName==NULL) return ;
    if(NULL!=pSourceImage)      //把原来的原来的空间释放掉
    {
        delete pSourceImage;
        pSourceImage = NULL;
    }
    pSourceImage =new QImage(strFileName);
    if(pSourceImage == NULL) return ;

    QImage tep=pSourceImage ->scaled(ui->label->width(),
                                     ui->label->height());
    ui->label->setPixmap(QPixmap::fromImage(tep));

    cutimage();

}

void MainWindow::onTimerOut()
{
    tim++;
    ui->time_label->setText((QString::number(tim)));
}

void MainWindow::cutimage()//九宫格分割
{
    QImage temp = pSourceImage->scaled(SMALL_W*3,
                                       SMALL_H*3);//缩放图片
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            pImage[i][j]=temp.copy(i*SMALL_W,  //复制图片开始的坐标;
                                   j*SMALL_H,
                                            SMALL_W,
                                            SMALL_H);//复制图片的大小

            pLbImage[i*3+j]->setPixmap(QPixmap::fromImage(pImage[i][j])); //加载图片
            pCompare[i][j]=i*3+j;
        }
    }
    QPixmap tep(":/blank.jpg");//挖空
    pLbImage[8]->setPixmap(tep);
    Random();

}

void MainWindow::Random()//打乱
{
    bushusum=0;
    ui->label_3->setText((QString::number(bushusum)));
    tim=0;
    ui->time_label->setText((QString::number(tim)));;
    int x=-1;
    int y=-1;
    for(int w=0;w<3;w++){//找到空白格
        for(int j=0;j<3;j++){
            if(pCompare[w][j]==8){
                x=w;
                y=j;
                break;
            }
        }
        if(x!=-1)
            break;
    }

    if(x==-1||y==-1)
         return ;
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));//产生一个随机数
    for(int i=0;i<1000;i++){

        //随机空白格的四个方向
        int direction = qrand()%4;

        switch (direction) {
        case 0://上
            if(x<2){
                pCompare[x][y]=pCompare[x+1][y];
                pCompare[x+1][y]=8;
                x++;
            }
            break;
        case 1://下
            if(x>0){
                pCompare[x][y]=pCompare[x-1][y];
                pCompare[x-1][y]=8;
                x--;
            }
            break;
        case 2://左
            if(y<2){
                pCompare[x][y]=pCompare[x][y+1];
                pCompare[x][y+1]=8;
                y++;
            }

            break;
        case 3://右
            if(y>0){
                pCompare[x][y]=pCompare[x][y-1];
                pCompare[x][y-1]=8;
                y--;
            }
            break;
        default:
            break;
        }
    }
    moveImage();
    if(timer->isActive())
    {
        timer->stop();
    }
    timer->start(1000);
}

void MainWindow::moveImage()//图片移动
{
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            int index = pCompare[i][j];
            pLbImage[index]->move(PHOTO_X+i*SMALL_W,
                                  PHOTO_Y+j*SMALL_H);
        }
    }
}

int MainWindow::panduanwancheng ()
{
    int y=1;
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            if(pCompare[i][j]!=i*3+j)
            {
                y=0;
                break;
            }
        }
        if(!y) break;
    }
    return y;
}


void MainWindow::mousePressEvent(QMouseEvent *event)
{
    int num=0;
    if(pSourceImage==NULL) return ;
    if(panduanwancheng()) return ;
    if(event->button() == Qt::LeftButton
            ||event->button() == Qt::RightButton)
    {
        QPoint pressPoint = event->pos();
        if(pressPoint.x()>PHOTO_X&&pressPoint.y()>PHOTO_Y
                &&pressPoint.x()<PHOTO_X+SMALL_W*3&&pressPoint.y()<PHOTO_Y+SMALL_H*3)
        {
            int x = (pressPoint.x()-PHOTO_X)/SMALL_W;
            int y = (pressPoint.y()-PHOTO_Y)/SMALL_H;

            //判断向上移
            if(x>0&&pCompare[x-1][y]==8)
            {
                pCompare[x-1][y]=pCompare[x][y];
                pCompare[x][y]=8;
                num++;
            }else if(x<2&&pCompare[x+1][y]==8)//判断向下移
            {
                pCompare[x+1][y]=pCompare[x][y];
                pCompare[x][y]=8;
                num++;

            }else if(y>0&&pCompare[x][y-1]==8)//判断向左移
            {
                pCompare[x][y-1]=pCompare[x][y];
                pCompare[x][y]=8;
                num++;
            }else if(y<2 && pCompare[x][y+1] == 8)//判断向右移动
            {
                pCompare[x][y+1] = pCompare[x][y];
                pCompare[x][y] = 8;
                num++;
            }
        }
    }
    bushusum+=num;
    ui->label_3->setText((QString::number(bushusum)));
    moveImage();//图片移动
    if(panduanwancheng()){
        timer->stop();
        huifu();
    }

}



void MainWindow::huifu ()
{
    pLbImage[8]->setPixmap(QPixmap::fromImage(pImage[2][2])); //加载图片
    QMessageBox::about(this,"successful","***************************************");
}

void MainWindow::on_btn2_clicked()
{
    if(pSourceImage==NULL) return ;
    QPixmap tep(":/blank.jpg");//挖空
    pLbImage[8]->setPixmap(tep);
    Random();
}

void MainWindow::on_btn2_2_clicked()
{
    if (!(QMessageBox::information(this,tr("CT Control View"),tr("Do you really want to quit the game?"),tr("Yes"),tr("No"))))
    {
       this->close();
    }
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QLabel>
#include <QMainWindow>


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    void cutimage();//九宫格分割

    void Random();//打乱

    void moveImage();//图片移动

    void mousePressEvent(QMouseEvent *event);//鼠标点击事件

    int panduanwancheng();//判断完成

    void huifu();//在判填充原来挖空的地方

    int bushusum;//这个变量储存总步数;

    QTimer *timer;
    int tim;

private slots:      //在槽函数中 只能包含函数

    void on_btn_clicked();
    void on_btn2_clicked();
    void on_btn2_2_clicked();
    void onTimerOut();

private:
    Ui::MainWindow *ui;
    QString strFileName;//文件名称

    QImage* pSourceImage;//原图

    QLabel* pLbImage[9];//九宫格label

    QImage pImage[3][3];

    int pCompare[3][3];  //标记数组;

    //QImage QFrame;
};

#endif // MAINWINDOW_H

转载于:https://www.cnblogs.com/lanaiwanqi/p/10445739.html

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值