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
阅读全文
3 0
- QT环境下实现UI界面的“拼图游戏”
- QT环境下实现UI界面的拼图
- 基于QT实现的简易3*3拼图游戏
- QT在VS环境下双击*.ui打不开Qt designer(Qt设计师)的解决方法
- QT在VS环境下双击*.ui打不开Qt designer(Qt设计师)的解决方法
- QT环境下的多线程下载实现
- as3实现的拼图游戏
- qt 与ros 实现UI界面下主线程与子线程双向通信
- Qt ui界面文件的调用--quiloader
- vs2013打开Qt的UI界面时打不开
- 单元测试UI界面的实现
- 实现自适应的UI界面
- qt拼图游戏
- Qt5实现简单的拼图游戏
- QT控件——ui界面简单实现一些功能
- 搭建Qt界面的OpenCV开发环境
- 搭建Qt界面的OpenCV开发环境
- 搭建Qt界面的OpenCV开发环境
- XML教程05_元素
- 【POJ2154】Color-Polya定理+欧拉函数
- HTTP 状态码
- JEESZ分布式架构1--CentOs下安装jdk7(环境准备)
- 关于 spring aop (aspectj) 你该知晓的一切
- QT环境下实现UI界面的“拼图游戏”
- 业界难题-“跨库分页”的四种方案
- windows php安装redis扩展
- 使用SfntTool制作字体剪辑工具3
- java进阶(一) java 自动装箱与拆箱
- MyBatis快速入门
- bootstrap-输入框/导航
- dell pcserver修改idrac密码
- css hack合集