原项目百度网盘下载提取码在文章末尾:
链接:https://pan.baidu.com/s/1RkhyjXSSUtXqHX6bNyGj4A







部分源代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include"qtimer.h"
#include<qevent.h>
#include<iostream>
#include<vector>
#include <algorithm>
#include <random>
#include<time.h>
#include<qimage.h>
#include<map>
#include<QList>
#include<qmessagebox.h>
#include <QtCore>
#include<QPushButton>
#include<dialog.h>
using namespace std;QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTQPixmap pixmap;QPixmap pixmap1;QImage  imags;QPixmap beijing;QVector<QPixmap> pixmaps;// QVector<QImage> image;
//QVector<int> buf2;//SelectImage *selet;QTimer *timer;static int M_height;static int M_weight;static int o_x;static int o_y;int n;int m;int dushu;int *buf;//图片位置int *buf2;//图片旋转int *buf3;//图片水平int *buf4;//图片垂直int *buf5;//图片水平垂直static int child_w;static  int child_h;int tag;int x1;int x2;int y1;int y2;int position;int step;int count;//90度旋转块树int num;bool is;int select=1;int isr=1;bool  startif=false;int num1;int num2;int num3;bool hangchang=false;QString path=":/img/新一小兰.png";public:MainWindow(QWidget *parent = nullptr);~MainWindow();
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);private slots:void on_pushButton_clicked();void divide();void check();void change();
void random(int*, int);void on_spinBox_valueChanged(int arg1);void xytimerUpDate();void on_pushButton_2_clicked();void on_pushButton_3_clicked();void on_MainWindow_customContextMenuRequested(const QPoint &pos);
void onTaskBoxContextMenuEvent();
//void on_spinBox_2_valueChanged(int arg1);void on_pushButton_5_clicked();void on_pushButton_4_clicked();void on_spinBox_3_valueChanged(int arg1);void on_spinBox_4_valueChanged(int arg1);void on_spinBox_5_valueChanged(int arg1);void on_spinBox_2_valueChanged(int arg1);void on_radioButton_clicked();void on_radioButton_2_clicked();void on_radioButton_3_clicked();private:Ui::MainWindow *ui;
public:QPushButton *button_skip;public slots:void login();signals:void sendStr(QString);
private:Dialog *newDialog;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"dialog.h"#include<QPainter>
#include<QPixmap>
#include<QImage>
#include<QPainter>
#include<QMessageBox>
#include<QFileDialog>
#include<QTimer>
#include<QDebug>
#include <QtCore>
#include<QPushButton>
#include<dialog.h>
int MainWindow::M_height = 540;
int MainWindow::M_weight = 540;
int MainWindow::o_x = 50;
int MainWindow::o_y = 50;
int MainWindow::child_h = 50;
int MainWindow::child_w = 50;
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);button_skip = new QPushButton("查看原图",this);button_skip->setGeometry(860,467,83,28);connect(button_skip,SIGNAL(clicked(bool)),this,SLOT(login()));count=0;pixmap1.load(":/kbimage/kongbai.png");pixmap.load(":/img/xinyi.jpg");pixmap.load(":/img/新一小兰.png");beijing.load(":/imgs/a.jpg");QImage image(":/img/xinyi.jpg");imags.load(":/img/xinyi.jpg");beijing.load(":imgs/fenqu.jpg");//   ui->radioButton->setCheckable(true);ui->radioButton_3->setChecked(1);ui->label->setText(QString::number(0));ui->label_11->setText(QString::number(0));dushu=0;step=0;QMatrix matrix;matrix.rotate(180);pixmap.transformed(matrix);n = 3;m=3;buf = new int[n*n];buf2=new int[n*n];buf3=new int[n*n];buf4=new int[n*n];buf5=new int[n*n];ui->spinBox->setValue(3);ui->spinBox_2->setValue(3);//connect(pic,SIGNAL(is_ok()),this,SLOT(change()));timer=new QTimer(this);connect(timer,SIGNAL(timeout()),this,SLOT(xytimerUpDate()));pixmaps.append(pixmap);//image.load();pixmaps.append(pixmap1);}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::login()
{//跳转到另一个窗口Dialog *win = new Dialog(this);QObject::connect(this,SIGNAL(sendStr(QString)),win,SLOT(getStr(QString)));QString oldStr=path;emit sendStr(oldStr);win->show();}void MainWindow::on_pushButton_clicked()
{QString name = QFileDialog::getOpenFileName(this,tr("打开新图片"),"./",tr("(*.png *.jpg *.bmp)"));path=name;if(name.isEmpty())return;pixmap.load(name);step=0;divide();}
void MainWindow::mousePressEvent(QMouseEvent *event)
{ui->label->setText(QString::number(step));if(event->button() == Qt::LeftButton){int x = event->x();int y = event->y();if(x<=800&&x>=50&&y<=800&&y>=50){tag = (x-50)/child_w + ((y-50)/child_h)*n;is = true;select=1;}}}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{//    if(hangchang){//        timer->stop();
//    }ui->label->setText(QString::number(step));if(event->button() == Qt::LeftButton){int x = event->x();int y = event->y();if(x<=540&&x>=50&&y<=540&&y>=50&&is){int tag1 = (x-50)/child_w + ((y-50)/child_h)*n;x1=tag/n;x2=tag1/n;y1=tag%n;y2=tag1%n;if(ui->radioButton->isChecked()==true){if(startif){std::swap(buf[tag],buf[tag1]);step++;}else{QMessageBox::information(this,"通知","请点击开始!","确定");}}elseif(ui->radioButton_2->isChecked()==true){if(buf[tag]==n*m-1||buf[tag1]==n*m-1){if(startif){std::swap(buf[tag],buf[tag1]);step++;}else{QMessageBox::information(this,"通知","请点击开始!","确定");}}else{QMessageBox::information(this,"通知","只能与空白格进行交换!","确定");}}elseif(ui->radioButton_3->isChecked()==true){if(startif){if(buf[tag]==n*m-1||buf[tag1]==n*m-1){if(x1==x2){if(y1-y2==1||y2-y1==1){if(startif){std::swap(buf[tag],buf[tag1]);step++;}else{QMessageBox::information(this,"通知","请点击开始!","确定");}}}elseif(y1==y2){if(x1-x2==1||x2-x1==1){if(startif){std::swap(buf[tag],buf[tag1]);step++;}else{QMessageBox::information(this,"通知","请点击开始!","确定");}}}}else{QMessageBox::information(this,"通知","只能与空白格相邻的图片进行交换!","确定");}
}else{QMessageBox::information(this,"通知","请点击开始!","确定");
}}//std::swap(buf[tag],buf[tag1]);update();is = false;select=1;if(tag!=tag1){//step++;//ui->label_show->setText(QString::number(step));
ui->label->setText(QString::number(step));}}
update();}}void MainWindow::paintEvent(QPaintEvent *) //绘图
{QPainter p(this);//p.rotate(180);QMatrix matrix;p.drawPixmap(0, 0, 1081, 644,beijing);QImage image;if(select==2){matrix.rotate(90);//image=pixmap[buf[tag]];pixmaps[buf[position]]=pixmaps[buf[position]].transformed(matrix, Qt::SmoothTransformation);
//p.drawPixmap(470, 60, child_w, child_h,pixmaps[buf[position]]);buf2[buf[position]]=buf2[buf[position]]+1;if(buf2[buf[position]]>3){buf2[buf[position]]=buf2[buf[position]]-4;}//buf2[buf[position]]=buf2[buf[position]];}else if(select==3){matrix.rotate(180);//image=pixmap[buf[tag]];pixmaps[buf[position]]=pixmaps[buf[position]].transformed(matrix, Qt::SmoothTransformation);//p.drawPixmap(470, 60, child_w, child_h,pixmaps[buf[position]]);buf2[buf[position]]=buf2[buf[position]]+2;if(buf2[buf[position]]>3){buf2[buf[position]]=buf2[buf[position]]-4;}}else if(select==4){matrix.rotate(270);//image=pixmap[buf[tag]];pixmaps[buf[position]]=pixmaps[buf[position]].transformed(matrix, Qt::SmoothTransformation);//p.drawPixmap(470, 60, child_w, child_h,pixmaps[buf[position]]);buf2[buf[position]]=buf2[buf[position]]+3;if(buf2[buf[position]]>3){buf2[buf[position]]=buf2[buf[position]]-4;}}else if(select==5){image=pixmaps[buf[position]].toImage();QImage mirroredImage = image.mirrored(true, false);pixmaps[buf[position]]=QPixmap::fromImage(mirroredImage);//p.drawPixmap(470, 60, child_w, child_h,pixmaps[buf[position]]);buf3[buf[position]]=buf3[buf[position]]+1;if(buf3[buf[position]]==2){buf3[buf[position]]=0;}}else if(select==6){image=pixmaps[buf[position]].toImage();QImage mirroredImage = image.mirrored(false, true);pixmaps[buf[position]]=QPixmap::fromImage(mirroredImage);//p.drawPixmap(470, 60, child_w, child_h,pixmaps[buf[position]]);buf4[buf[position]]=buf4[buf[position]]+1;if(buf4[buf[position]]==2){buf4[buf[position]]=0;}}else if(select==7){image=pixmaps[buf[position]].toImage();QImage mirroredImage = image.mirrored(true, true);pixmaps[buf[position]]=QPixmap::fromImage(mirroredImage);// p.drawPixmap(470, 60, child_w, child_h,pixmaps[buf[position]]);buf3[buf[position]]=buf3[buf[position]]+1;if(buf3[buf[position]]==2){buf3[buf[position]]=0;}buf4[buf[position]]=buf4[buf[position]]+1;if(buf4[buf[position]]==2){buf4[buf[position]]=0;}buf5[buf[position]]=buf5[buf[position]]+2;if(buf5[buf[position]]>3){buf5[buf[position]]=buf5[buf[position]];}}//p.rotate(-180);int i=0;for(int y=0;y<m;y++){for(int x=0;x<n;x++){p.drawPixmap(o_x+x*child_w, o_y+y*child_h, child_w, child_h,pixmaps[buf[i++]]);}}
//    for(int y=0;y<m;y++){//        for(int x=0;x<n;x++){//            p.drawPixmap(470+x*child_w, o_y+y*child_h, child_w, child_h,pixmap1);//        }
//    }select=1;}
void MainWindow::change()
{//pixmap.load(":/img/xinyi.jpg");ui->spinBox->setValue(3);ui->spinBox_2->setValue(3);on_spinBox_valueChanged(3);on_spinBox_2_valueChanged(3);
}
void MainWindow::divide()   //分割图片
{step=0;QPixmap pix;QImage img;pixmaps.clear();// image.clear();int h = pixmap.height()/m;int w = pixmap.width()/n;for(int y=0;y<m;y++)for(int x=0;x<n;x++){pix=pixmap.copy(x*w,y*h,w,h);//img=imags.copy(x*w,y*h,w,h);if(y==(m-1)&&x==(n-1)){pixmaps.append(pixmap1);}else{pixmaps.append(pix);}}//旋转if((ui->checkBox->isChecked()==true)){num1=ui->spinBox_3->value();int ro[10];for(int i=0;i<num1;i++){ro[i]=rand()%num1+1;//生成随机数for(int x=0;x<i;x++){if(ro[x]==ro[i]){ro[i]=rand()%num1+1;x=0;}}QMatrix matrix;int angle=(rand() % (3-1))+ 1;matrix.rotate(90*angle);pixmaps[buf[ro[i]]]=pixmaps[buf[ro[i]]].transformed((matrix));buf2[buf[ro[i]]]+=angle;if(buf2[buf[ro[i]]]>3){buf2[buf[ro[i]]]=buf2[buf[ro[i]]]-4;}}}//水平翻转if((ui->checkBox_2->isChecked()==true)){num2=ui->spinBox_4->value();int ro[10];for(int i=0;i<num2;i++){ro[i]=rand()%num2+1;//生成随机数for(int x=0;x<i;x++){if(ro[x]==ro[i]){ro[i]=rand()%num2+1;x=0;}}QImage img=pixmaps[buf[ro[i]]].toImage();img= img.mirrored(true, false);pixmaps[buf[ro[i]]]=QPixmap::fromImage(img);buf3[buf[ro[i]]]+=1;if(buf3[buf[ro[i]]]==2){buf3[buf[ro[i]]]=0;}}}//垂直翻转if((ui->checkBox_3->isChecked()==true)){num3=ui->spinBox_5->value();int ro[10];for(int i=0;i<num3;i++){ro[i]=rand()%num3+1;//生成随机数for(int x=0;x<i;x++){if(ro[x]==ro[i]){ro[i]=rand()%num3+1;x=0;}}QImage img=pixmaps[buf[ro[i]]].toImage();img= img.mirrored(false, true);pixmaps[buf[ro[i]]]=QPixmap::fromImage(img);buf4[buf[ro[i]]]+=1;if(buf4[buf[ro[i]]]==2){buf4[buf[ro[i]]]=0;}}}
}
void MainWindow::check()    //检查是否成功
{for(int i=0;i<n*m-1;i++){if(buf[i]!=i||buf2[i]!=0||buf3[i]!=0||buf4[i]!=0){if(!((buf3[i]+buf4[i]==2)&&(buf2[i]==2))){QMessageBox::information(this,"通知","你失败了!","确定");return;}}}//timer->stop();QMessageBox::information(this,"通知","恭喜!你成功了!","确定");}void MainWindow::on_spinBox_valueChanged(int arg1)//竖
{step=0;dushu=0;//   timer->stop();// hangchang=true;ui->label->setText(QString::number(step));ui->label_11->setText(QString::number(dushu));n = arg1;child_w = M_weight/n;child_h = M_height/m;delete [] buf;buf = new int[n*m];for(int i=0;i<n*m;i++){buf[i] = i;}delete [] buf2;buf2 = new int[n*m];for(int i=0;i<n*m;i++){buf2[i] = 0;}delete [] buf3;buf3 = new int[n*m];for(int i=0;i<n*m;i++){buf3[i] = 0;}delete [] buf4;buf4 = new int[n*m];for(int i=0;i<n*m;i++){buf4[i] = 0;}delete [] buf5;buf5 = new int[n*m];for(int i=0;i<n*m;i++){buf5[i] = 0;}random(buf,n*m);divide();update();
}
void MainWindow::random(int *buf, int len)  //图片随机化
{int suiji=0;//srand(time(NULL));for(int i=0; i<len; i++){std::swap(buf[i], buf[rand()%len]);}for(int i=0;i<n*m-1;i++){for(int j=i+1;j<n*m;j++){if(buf[i]>buf[j]&&buf[i]!=(n*m-1)&&buf[j]!=(n*m-1))suiji=suiji+1;}}if((suiji%2)!=0){if(buf[0]!=(n*m-1)&&buf[1]!=(n*m-1)){std::swap(buf[0], buf[1]);}else{std::swap(buf[2], buf[3]);}}// std::swap(buf[i], buf[rand()%len]);
}void MainWindow::on_pushButton_2_clicked()//完成
{timer->stop();check();timer->stop();startif=false;
}
void MainWindow::xytimerUpDate(){dushu++;
ui->label_11->setText(QString::number(dushu));
}
void MainWindow::on_pushButton_3_clicked()//重置
{QDateTime time = QDateTime::currentDateTime();//获取系统现在的时间QString strTime = time.toString("yyyy-MM-dd hh:mm:ss");timer->stop();dushu=0;startif=false;ui->label_11->setText(QString::number(dushu));//ui->label_11->setText(strTime);// paintEventmouse(QPaintEvent *);step=0;ui->label->setText(QString::number(step));delete [] buf;buf = new int[n*m];for(int i=0;i<n*m;i++){buf[i] = i;}delete [] buf2;buf2 = new int[n*m];for(int i=0;i<n*m;i++){buf2[i] = 0;}delete [] buf3;buf3 = new int[n*m];for(int i=0;i<n*m;i++){buf3[i] = 0;}delete [] buf4;buf4 = new int[n*m];for(int i=0;i<n*m;i++){buf4[i] = 0;}delete [] buf5;buf5 = new int[n*m];for(int i=0;i<n*m;i++){buf5[i] = 0;}//ui->spinBox_2->setValue(0);random(buf,n*m);
divide();
update();
}void MainWindow::on_MainWindow_customContextMenuRequested(const QPoint &/*pos*/)
{//创建菜单对象QMenu *pMenu = new QMenu(this);QAction *pNewTask = new QAction(tr("顺时针旋转90度"), this);QAction *pEditTask = new QAction(tr("顺时针旋转180度"), this);QAction *pDeleteTask = new QAction(tr("逆时针旋转90度"), this);QAction *pToolRenName = new QAction(tr("水平翻转"), this);QAction *pToolEdot = new QAction(tr("垂直翻转"), this);QAction *pToolDelete = new QAction(tr("垂直水平翻转"), this);//1:新建任务 2:设置任务 3:删除任务 4:改名工具 5:设置工具 6:删除工具pNewTask->setData(1);pEditTask->setData(2);pDeleteTask ->setData(3);pToolRenName->setData(4);pToolEdot->setData(5);pToolDelete ->setData(6);//把QAction对象添加到菜单上pMenu->addAction(pNewTask);pMenu->addAction(pEditTask);pMenu->addAction(pDeleteTask);pMenu->addAction(pToolRenName);pMenu->addAction(pToolEdot);pMenu->addAction(pToolDelete);//连接鼠标右键点击信号connect(pNewTask, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));connect(pEditTask, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));connect(pDeleteTask, SIGNAL(triggered()), SLOT(onTaskBoxContextMenuEvent()));connect(pToolRenName, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));connect(pToolEdot, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));connect(pToolDelete, SIGNAL(triggered()), SLOT(onTaskBoxContextMenuEvent()));//在鼠标右键点击的地方显示菜单for(int i=0;i<n*m;i++){if(buf[i]==n*m-1){position=i;}}int x,y;x = cursor().pos().x();// int x=QCursor::pos().x();//int y=QCursor::pos().y();y = cursor().pos().y();pMenu->exec(cursor().pos());if(x<=800&&x>=50&&y<=800&&y>=50){position =(x-150)/child_w + ((y-150)/child_h)*n; //((x-50)/child_w + ((y-50)/child_h)*(n))-n-1;//select=2;}else{QMessageBox::about(this, "tip", "请点击图片进行操作!");}//释放内存QList<QAction*> list = pMenu->actions();foreach (QAction* pAction, list) delete pAction;delete pMenu;
}
void MainWindow::onTaskBoxContextMenuEvent()
{QAction *pEven = qobject_cast<QAction *>(this->sender()); //this->sender()就是发信号者 QAction//获取发送信息类型 1:新建任务 2:设置任务 3:删除任务 4:改名工具 5:设置工具 6:删除工具int iType = pEven->data().toInt();switch (iType){case 1:select=2;update();//QMessageBox::about(this, "tip", pEven->text());break;case 2:select=3;update();break;case 3:select=4;update();break;case 4:select=5;update();break;case 5:select=6;update();break;case 6:select=7;update();break;default:break;}
}void MainWindow::on_pushButton_5_clicked()//开始
{timer->start(1000);startif=true;//dushu=0;
}void MainWindow::on_pushButton_4_clicked()//暂停
{timer->stop();startif=false;//dushu=0;
}void MainWindow::on_spinBox_3_valueChanged(int arg1)
{isr=1;if((ui->checkBox->isChecked()==true)){num1=arg1;num1=ui->spinBox_3->value();int ro[10];// srand(time(nullptr));for(int i=0;i<num1;i++){ro[i]=rand()%num1+1;//生成随机数for(int x=0;x<i;x++){if(ro[x]==ro[i]){ro[i]=rand()%num1+1;x=0;}}QMatrix matrix;int angle=(rand() % (3-1))+ 1;matrix.rotate(90*angle);pixmaps[buf[ro[i]]]=pixmaps[buf[ro[i]]].transformed((matrix));buf2[buf[ro[i]]]+=angle;if(buf2[buf[ro[i]]]>3){buf2[buf[ro[i]]]=buf2[buf[ro[i]]]-4;}}}
}void MainWindow::on_spinBox_4_valueChanged(int arg1)
{if((ui->checkBox_2->isChecked()==true)){num2=arg1;num2=ui->spinBox_4->value();int ro[10];for(int i=0;i<num2;i++){ro[i]=rand()%num2+1;//生成随机数for(int x=0;x<i;x++){if(ro[x]==ro[i]){ro[i]=rand()%num2+1;x=0;}}QImage img=pixmaps[buf[ro[i]]].toImage();img= img.mirrored(true, false);pixmaps[buf[ro[i]]]=QPixmap::fromImage(img);buf3[buf[ro[i]]]+=1;if(buf3[buf[ro[i]]]==2){buf3[buf[ro[i]]]=0;}}}
}void MainWindow::on_spinBox_5_valueChanged(int arg1)
{if((ui->checkBox_3->isChecked()==true)){num3=arg1;num3=ui->spinBox_5->value();int ro[10];for(int i=0;i<num3;i++){ro[i]=rand()%num3+1;//生成随机数for(int x=0;x<i;x++){if(ro[x]==ro[i]){ro[i]=rand()%num3+1;x=0;}}QImage img=pixmaps[buf[ro[i]]].toImage();img= img.mirrored(false, true);pixmaps[buf[ro[i]]]=QPixmap::fromImage(img);buf4[buf[ro[i]]]+=1;if(buf4[buf[ro[i]]]==2){buf4[buf[ro[i]]]=0;}}}
}void MainWindow::on_spinBox_2_valueChanged(int arg1)//行数
{m=arg1;step=0;dushu=0;
//    timer->stop();ui->label->setText(QString::number(step));ui->label_11->setText(QString::number(dushu));child_w = M_weight/n;child_h = M_height/m;delete [] buf;buf = new int[n*m];for(int i=0;i<n*m;i++){buf[i] = i;}delete [] buf2;buf2 = new int[n*m];for(int i=0;i<n*m;i++){buf2[i] = 0;}delete [] buf3;buf3 = new int[n*m];for(int i=0;i<n*m;i++){buf3[i] = 0;}delete [] buf4;buf4 = new int[n*m];for(int i=0;i<n*m;i++){buf4[i] = 0;}delete [] buf5;buf5 = new int[n*m];for(int i=0;i<n*m;i++){buf5[i] = 0;}random(buf,n*m);divide();update();//timer->stop();
}void MainWindow::on_radioButton_clicked()
{timer->stop();dushu=0;startif=false;ui->label_11->setText(QString::number(dushu));//ui->label_11->setText(strTime);
// paintEventmouse(QPaintEvent *);
step=0;
ui->label->setText(QString::number(step));
delete [] buf;
buf = new int[n*m];
for(int i=0;i<n*m;i++)
{buf[i] = i;}
delete [] buf2;
buf2 = new int[n*m];
for(int i=0;i<n*m;i++)
{buf2[i] = 0;}
delete [] buf3;
buf3 = new int[n*m];
for(int i=0;i<n*m;i++)
{buf3[i] = 0;}
delete [] buf4;
buf4 = new int[n*m];
for(int i=0;i<n*m;i++)
{buf4[i] = 0;}
delete [] buf5;
buf5 = new int[n*m];
for(int i=0;i<n*m;i++)
{buf5[i] = 0;}
//ui->spinBox_2->setValue(0);
random(buf,n*m);
divide();
update();
}void MainWindow::on_radioButton_2_clicked()
{timer->stop();dushu=0;startif=false;ui->label_11->setText(QString::number(dushu));//ui->label_11->setText(strTime);
// paintEventmouse(QPaintEvent *);
step=0;
ui->label->setText(QString::number(step));
delete [] buf;
buf = new int[n*m];
for(int i=0;i<n*m;i++)
{buf[i] = i;}
delete [] buf2;
buf2 = new int[n*m];
for(int i=0;i<n*m;i++)
{buf2[i] = 0;}
delete [] buf3;
buf3 = new int[n*m];
for(int i=0;i<n*m;i++)
{buf3[i] = 0;}
delete [] buf4;
buf4 = new int[n*m];
for(int i=0;i<n*m;i++)
{buf4[i] = 0;}
delete [] buf5;
buf5 = new int[n*m];
for(int i=0;i<n*m;i++)
{buf5[i] = 0;}
//ui->spinBox_2->setValue(0);
random(buf,n*m);
divide();
update();
}void MainWindow::on_radioButton_3_clicked()
{timer->stop();dushu=0;startif=false;ui->label_11->setText(QString::number(dushu));//ui->label_11->setText(strTime);
// paintEventmouse(QPaintEvent *);
step=0;
ui->label->setText(QString::number(step));
delete [] buf;
buf = new int[n*m];
for(int i=0;i<n*m;i++)
{buf[i] = i;}
delete [] buf2;
buf2 = new int[n*m];
for(int i=0;i<n*m;i++)
{buf2[i] = 0;}
delete [] buf3;
buf3 = new int[n*m];
for(int i=0;i<n*m;i++)
{buf3[i] = 0;}
delete [] buf4;
buf4 = new int[n*m];
for(int i=0;i<n*m;i++)
{buf4[i] = 0;}
delete [] buf5;
buf5 = new int[n*m];
for(int i=0;i<n*m;i++)
{buf5[i] = 0;}
//ui->spinBox_2->setValue(0);
random(buf,n*m);
divide();
update();
}


1.切割(m*n)
获取用户选择切割的行数、列数以及原图的长和宽,计算切割之后的小碎片的长和宽以及每块小碎片的左上角相对原图的坐标,从原图的左上角开始,从左到右,从上到下获取一个小碎片,并且将小碎片依次放入到存放图片的容器中,如果获取的小碎片是原图右下角部分,则将空白碎片添加到存放图片的容器中。
2.绘图
计算每块小碎片在界面上的位置,将切割后的小碎片从左到右,从上往下依次画出
3.随机打乱
用一维数组buf存放每个小碎片的索引,循环调用swap()函数交换一维数组buf的两个数值,其中有个数值由循环产生,另外一个数值调用rand()函数随机产生。
4.用户自定义水平、垂直、旋转以及需要的个数
水平:判断用户是否选择了“水平”,若是用户选择了“水平”操作,获取用户选择的数值,调用rand()函数随机产生一个数值,对与该数值相关的图片调用image接口进行水平翻转,相应图片的水平标志位加一,若标志位为2,则将标志位置为0;否则退出该函数。
垂直:判断用户是否选择了“垂直”,若是用户选择了“垂直”操作,获取用户选择的数值,调用rand()函数随机产生一个数值,对与该数值相关的图片调用image接口进行垂直翻转,相应图片的垂直标志位加一,若标志位为2,则将标志位置为0;否则退出该函数。
旋转(顺时针):判断用户是否选择了“旋转”,若是用户选择了“旋转”操作,获取用户选择的数值,调用rand()函数随机产生一个数值,对与该数值相关的图片进行旋转操作,图片旋转的度数由另外一个rand()函数随机产生决定,若随机旋转90度,相应图片旋转标志位加一,若随机旋转180度,相应图片旋转标志位加二,若随机旋转270度,相应图片旋转标志位加三,若标志位大于3,则将旋转标志位减四;否则退出该函数。
5.用户鼠标左键移动(三种移动模式)
获取用户鼠标左键点击时和释放时的坐标位置,分别计算点击时和释放时的位置对应的碎片索引在一维数组buf的索引。
简单:调用swap()函数交换两块碎片,刷新界面,绘制出交换后的碎片界面。
一般:判断用户点击时对应的图片或者是用户释放时对应的图片是否有空白碎片,若有空白碎片,调用swap()函数交换两块碎片,刷新界面,绘制出交换后的碎片界面。
困难:将一维数组buf的索引转换为与二维数组对应的坐标,判断用户点击时对应的图片或者是用户释放时对应的图片是否有空白碎片,判断两块碎片是否相邻,若同时满足上面两个条件,调用swap()函数交换两块碎片,刷新界面,绘制出交换后的碎片界面。
判断空白碎片的方法:获取一维数组buf对应的数值,若该数值为空白碎片的索引,则对应空白碎片。
判断图片相邻的方法:分别获取鼠标点击位置和释放位置的二维数组的横坐标与纵坐标,若横坐标相同,且纵坐标数值相差为1,或者纵坐标相同,横坐标数值相差为1,两块图片相邻。
6.判断拼图是否完成
①判断一维数组buf对应的数值是否是图片存放的索引
②判断水平标志位,垂直标志位与旋转标志位是否为0
若满足上面两个条件,拼图完成,否则失败
7.鼠标右键水平翻转、垂直翻转或旋转图片
判断用户选中的图片以及相应的操作,对选中图片进行相应操作,刷新界面,重新绘图。(判断选中图片以及进行相应操作的方法同 5用户鼠标左键移动(三种移动模式)、4用户自定义水平、垂直、旋转以及需要的个数,此处不再赘述)
8.查看原图
新建一个dialog窗口,利用QT中的Signal&Slot机制进行传值,定义一个全局变量path记录当前图片的路径(有默认图片路径),打开新图片path被重新赋值,该值传递到dialog中,dialog根据此路径打开图片。
9.计时与记步
用户进行一次不同图片之间的交换,步数加一。
使用qt中的计时器类QTimer设置一个计时器;设置定时器的定时周期为 1000 毫秒,每 1000 毫秒就会发射定时器的 timeout() 信号,在信号关联的槽函数里做相应的处理。
10.重置(重新打乱)
①调用随机打乱函数
②判断用户是否选择了水平、垂直与旋转操作,若是用户选择了相应操作,获取相应操作的数值,执行。(执行方法类同于 4用户自定义水平、垂直、旋转以及需要的个数,此处不再赘述)
③刷新界面重新绘图
11.选择图片进行切割
调用getOpenFileName()方法选择一张新图片,将用户选择的图片加载为原图,调用切割函数对原图进行切割。刷新界面,重新绘图。
12.开始、暂停、继续与完成
若用户点“开始”按钮,打开计时器,将标志“移动”的变量置为真,此时开始计时,用户可以进行移动操作;若用户点击“暂停”按钮,关闭计时器,将标志“移动”的变量置为假,此时停止计时,用户不可以进行移动操作;若用户点击“完成”按钮,关闭计时器,将标志“移动”的变量置为假,调用判断函数,并且将步数以及时间置为0,便于下次游戏开始计时与计步。

提取码:v8bx

Linux系统下QT九宫格拼图小游戏相关推荐

  1. android实现九宫格拼图小游戏

    贴一下效果图 接下来随便用一张图片就好 以下是全代码 自定义View GameView类 import android.content.Context; import android.graphics ...

  2. Linux系统下Qt项目实战(原神模拟器)

    原神模拟器 <原神>是由上海米哈游网络科技股份有限公司制作发行的一款开放世界冒险游戏.         <原神>整体的玩法架构可圈可点,基于行业成熟设计经验打造的内容十分惊艳, ...

  3. linux系统下qt中文输入法,Ubuntu系统下Qt使用中文输入法(示例代码)

    近几个月一直在搞QML框架下的UI控件,没有更新博客.今天记录下Ubuntu系统下Qt开发工具使用中文输入法的流程. (题外话,Linux系统下的开发,离线是没法搞的(夸张手法),不联网简直就是事倍功 ...

  4. linux系统下Qt应用程序重启,嵌入式Linux重启QT应用程序的简单办法(基于QT4.8 qws)...

    嵌入式Linux重启QT应用程序的简单办法(基于QT4.8 qws) 应用软件一般都有这样的业务需求: 当有新版本的APP,则程序就需要执行更新,更新完毕后(所谓的更新大多就是以覆盖的方式),不需要关 ...

  5. (转)介绍Linux操作系统下的几个小游戏模拟器

    Linux下有个N64的模拟器,叫做mupen64,我没有尝试,嘿,配置太低.不过据说这个模拟器不太好用,运行忒卡. 前言:我们都是从那个游戏机时代过来的.蹲在地上,拿着手柄,玩着魂斗罗,超级玛丽. ...

  6. qt调节linux系统音量,QT语音声音小怎么办?QT语音各种声音调节教程

    有时我们在用QT语音时声音小怎么办?我们可以通过声卡调试还有软件设置来解决,下面就带来QT语音声音小解决教程,供大家参考. 软件名称:腾讯QT语音 (原QQTalk) 语音聊天工具 V4.6.22(1 ...

  7. 九宫格拼图小游戏开发笔记-随机网格生成

    辞职了忙着找工作,不想遇上了什么鬼互联网寒冬,一时半会也没有着落闲暇之余打算复习一下Android(我的天,全忘了),决定从这个最简单的小拼图游戏开始,并简单记录一下. 首先呢是界面,就不说了,刷刷的 ...

  8. linux系统qt中make安装,Linux系统下Qt的基本安装和配置

    Qt Creator支持中文,启动速度比Eclipse.Netbeans更快,界面也更美观,跟输入法Fcitx协作良好(光标跟随). 你既可以把Qt Creator当代码编辑器作为vim辅助,好处在于 ...

  9. linux系统下用到的小知识点积累

    preface:在ubuntu下做事情,在终端下执行一些命令.或者在vim里面做一些操作.自然而然须要用到一些小知识点,没有怎么系统地看<鸟哥的菜>,基本上是遇到了什么问题想要实现什么功能 ...

  10. 7. Linux系统下在桌面设置添加安装软件启动图标快捷方式

    1. 说明 在Linux系统下安装了对应的软件之后,一般启动时需要在命令行终端中进行启动,可以在终端里设置快速启动的命令,相关设置可参考博客:Linux系统下在终端设置快速启动已安装软件. 另一种快捷 ...

最新文章

  1. 形态分类法的迭代次数与成键的稳定性
  2. Linux基础练习题(三)
  3. node-sass 下载失败 解决方案
  4. MATLAB-2:基础与提高
  5. boost::boost::maximum_adjacency_search用法的测试程序
  6. 5.3 递归最小二乘法
  7. 之全能忙内_全能水适能指导员流行到山西,你是否跟上?
  8. Java多线程(6)--Callable接口创建线程
  9. linux 学习操作小计
  10. 杯水车薪!昔日手机巨头今拍卖外观设计专利抵债 起拍价仅2.11万元
  11. Spring+springmvc+hibernate+redis整合配置文件
  12. python中 n是换几行_如何在Python中用`\ n`替换通用换行符?
  13. python可以用vs编辑吗_在VS2017中编写Python程序
  14. 一个果农儿子的心声,你倾听一下吧?
  15. 23种设计模式及其应用场景
  16. 苏宁易购:苏宁小店将获4.5亿美元增资
  17. margin 百分比是按参照物来计算滴 不知道吧?
  18. Halcon|通过旋转前后3维坐标点求旋转轴及旋转角度
  19. vue实现tagsview多页签导航功能
  20. Matlab网页交互

热门文章

  1. 如何恢复cuteftp pro 7.0的站点数据?
  2. 自己动手写2D物理引擎-初级篇(1)
  3. iOS开发-Xcode8兼容iOS7手记
  4. 开源软件安全检查工具
  5. JS判断不同的浏览器和版本,提示浏览器版本过低,兼容IE8到IE11
  6. npp++常用的匹配正则表达式
  7. C++银行管理系统设计分析及程序设计介绍
  8. BaiduPan百度网盘不限速教程
  9. 【题解】「NOIP2016」蚯蚓
  10. win10没有realtek高清晰音频管理器_史上最稳定的win10版本,四大更新内容强势来袭,你敢升级吗?...