博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QT环境下实现UI界面的“拼图游戏”
阅读量:6299 次
发布时间:2019-06-22

本文共 5945 字,大约阅读时间需要 19 分钟。

main.cpp

#include "mainwindow.h"#include 
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 
#include
#include
#include
#include
#include
//随意数头文件#include
#include
#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()
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 
#include
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

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

你可能感兴趣的文章
Android.mk 文件语法详解
查看>>
QT liunx 工具下载
查看>>
内核源码树
查看>>
AppScan使用
查看>>
Java NIO框架Netty教程(三) 字符串消息收发(转)
查看>>
Ucenter 会员同步登录通讯原理
查看>>
php--------获取当前时间、时间戳
查看>>
Spring MVC中文文档翻译发布
查看>>
docker centos环境部署tomcat
查看>>
JavaScript 基础(九): 条件 语句
查看>>
Linux系统固定IP配置
查看>>
配置Quartz
查看>>
Linux 线程实现机制分析
查看>>
继承自ActionBarActivity的activity的activity theme问题
查看>>
设计模式01:简单工厂模式
查看>>
项目经理笔记一
查看>>
Hibernate一对一外键双向关联
查看>>
mac pro 入手,php环境配置总结
查看>>
MyBatis-Plus | 最简单的查询操作教程(Lambda)
查看>>
rpmfusion 的国内大学 NEU 源配置
查看>>