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

来源:互联网 发布:windows route 命令 编辑:程序博客网 时间:2024/05/29 02:05

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 110MainWindow::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_OBJECTpublic:    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
原创粉丝点击