zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    Android用户界面UI组件--AdapterView及其子类(五) Spinner和SpinnerAdapter
    Android用户界面UI组件--AdapterView及其子类(四) GridView
    Android用户界面UI组件--AdapterView及其子类(三) ExpandableListView
    Android用户界面 UI组件--AdapterView及其子类(二) AdapterViewAnimator及其子类
    Navigation Drawer介绍
    Android用户界面 UI组件--AdapterView及其子类(一) ListView及各种Adapter详解
    draw9patch超详细教程
    主线程中有多个handler的情况
    Python服务器开发二:Python网络基础
    shell脚本实现无密码交互的SSH自动登陆
  • 原文地址:https://www.cnblogs.com/lanaiwanqi/p/10445739.html
Copyright © 2011-2022 走看看