#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QFileDialog>
#include<QMessageBox>
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
MainScene=new QGraphicsScene();
ReferenceScene =new QGraphicsScene();
ui->graphicsView->setScene(MainScene);
ui->graphicsView_2->setScene(ReferenceScene);
ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->graphicsView_2->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->graphicsView_2->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_action_triggered()//导入图片
{
MainScene->clear();
ReferenceScene->clear();
QString Path=QFileDialog::getOpenFileName(this,tr("Open File..."),".",
tr("Picture Files(*.png *.bnp *.jpg )"));
QPixmap MainPixMap;
MainPixMap.load(Path);
PuzzleItem *ReferenceItem=new PuzzleItem(MainPixMap,ui->graphicsView_2->width(),ui->graphicsView_2->height());
ReferenceScene->addItem(ReferenceItem);
Width=ui->graphicsView->width();
Height=ui->graphicsView->height();
int Type=ui->comboBox->currentIndex();
if(Type==0)
{
Row=3;
Column=3;
SplitPixMap(MainPixMap.scaled(Width,Height));
}
else if(Type==1)
{
Row=4;
Column=4;
SplitPixMap(MainPixMap.scaled(Width,Height));
}
}
void MainWindow::SplitPixMap(QPixmap pixmap)//切割图片
{
ItemS=new PuzzleItem**[Row];
int Count=0;
for(int i=0;i<Row;i++)
{
ItemS[i]=new PuzzleItem*[Column];
for(int j=0;j<Column;j++)
{
QPixmap Part;
Part=pixmap.copy(i*Width/Row,j*Height/Column,Width/Row,Height/Column);
ItemS[i][j]=new PuzzleItem(Part,Width/Row,Height/Column,Count);
Count++;
}
}
Disorganize();
}
void MainWindow::Disorganize()//打乱
{
//int InverseNumber=0;
int *Queue=new int[Row*Column];
for(int i=0;i<Row*Column;i++)
{
Queue[i]=i;
}
int **Matrix=GetPuzzle(Queue);
int Exchange=0;
int ExchangeTimes=Row*Column*10;
int CurrentRow=Row-1;
int CurrentColumn=Column-1;
int From=0;
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
int CurrentDerection=qrand()%(4);
while(ExchangeTimes>0)
{
Exchange=Matrix[CurrentRow][CurrentColumn];
if(CurrentRow+1<=Row-1 &&CurrentDerection==0&&From!=1)//下移
{
Matrix[CurrentRow][CurrentColumn]=Matrix[CurrentRow+1][CurrentColumn];
Matrix[CurrentRow+1][CurrentColumn]=Exchange;
CurrentRow+=1;
From=2;//下
ExchangeTimes--;
}
else if(CurrentRow-1>=0 &&CurrentDerection==1&&From!=2)//上移
{
Matrix[CurrentRow][CurrentColumn]=Matrix[CurrentRow-1][CurrentColumn];
Matrix[CurrentRow-1][CurrentColumn]=Exchange;
CurrentRow-=1;
From=1;//上
ExchangeTimes--;
}
else if(CurrentColumn+1<=Column-1&&CurrentDerection==2&&From!=3)//右移
{
Matrix[CurrentRow][CurrentColumn]=Matrix[CurrentRow][CurrentColumn+1];
Matrix[CurrentRow][CurrentColumn+1]=Exchange;
CurrentColumn+=1;
From=4;
ExchangeTimes--;
}
else if(CurrentColumn-1>=0&&CurrentDerection==3&&From!=4)//左移
{
Matrix[CurrentRow][CurrentColumn]=Matrix[CurrentRow][CurrentColumn-1];
Matrix[CurrentRow][CurrentColumn-1]=Exchange;
CurrentColumn-=1;
From=3;
ExchangeTimes--;
}
CurrentDerection=qrand()%(4);
}
/*
if(Row*Column==9)
{
do
{
InverseNumber=0;
Queue=RandomSequence(9);
for(int i=0;i<8;i++)
{
for(int j=i+1;j<8;j++)
{
if(Queue[i]>Queue[j])
{
InverseNumber++;
}
}
}
}while(InverseNumber%2!=0);
}
else if(Row*Column==16)
{
int iii[16]={15,0,1,2,4,5,6,3,8,9,10,7,12,13,14,11};
int jjj[16]={0,1,2,3,4,5,6,7,8,9,10,11,15,12,13,14};
for(int i=0;i<16;i++)
{
Queue[i]=iii[i];
}
//Queue[15]=14;
//Queue[14]=15;
Queue=RandomSequence(16);
}
Begin=Queue;
int **Matrix=GetPuzzle(Queue);
*/
ui->graphicsView->setMatrix(Matrix,Row,Column,ItemS[Row-1][Column-1],MainScene);
for(int i=0;i<Row;i++)
{
for(int j=0;j<Column;j++)
{
if(Matrix[i][j]==Row*Column-1)
{
BeginX=i;
BeginY=j;
}
MainScene->addItem(ItemS[i][j]);
if(Row==3&&j==Column-1)
{
ItemS[Matrix[i][j]/Row][Matrix[i][j]%Column]->setOffset(i*Width/Row,j*Height/Column-1);
}
else
{
ItemS[Matrix[i][j]/Row][Matrix[i][j]%Column]->setOffset(i*Width/Row,j*Height/Column);
}
}
}
MainScene->removeItem(ItemS[Row-1][Column-1]);
int Count=0;
Begin=new int[Row*Column];
for(int i=0;i<Row;i++)
{
for(int j=0;j<Column;j++)
{
Begin[Count]=Matrix[i][j];
Count++;
}
}
/*for(int i=0;i<Row;i++)
{
for(int j=0;j<Column;j++)
{
MainScene->addItem(ItemS[i][j]);
if(Row==3&&j==Column-1)
{
ItemS[Queue[Count]/Row][Queue[Count]%Column]->setOffset(i*Width/Row,j*Height/Column-1);
}
else
{
ItemS[Queue[Count]/Row][Queue[Count]%Column]->setOffset(i*Width/Row,j*Height/Column);
}
Count++;
}
}
MainScene->removeItem(ItemS[Row-1][Column-1]);*/
}
void MainWindow::Move(int **puzzzle)
{
for(int i=0;i<Row;i++)
{
for(int j=0;j<Column;j++)
{
MainScene->addItem(ItemS[i][j]);
if(Row==3&&j==Column-1)
{
ItemS[puzzzle[i][j]/Row][puzzzle[i][j]%Column]->setOffset(i*Width/Row,j*Height/Column-1);
}
else
{
ItemS[puzzzle[i][j]/Row][puzzzle[i][j]%Column]->setOffset(i*Width/Row,j*Height/Column);
}
}
}
MainScene->removeItem(ItemS[Row-1][Column-1]);
}
int** MainWindow::GetPuzzle(int *Queue)
{
int **Matrix=new int*[Row];
int count=0;
for(int i=0;i<Row;i++)
{
Matrix[i]=new int[Column];
for(int j=0;j<Column;j++)
{
Matrix[i][j]=Queue[count];
count++;
}
}
return Matrix;
}
int* MainWindow::RandomSequence(int N)//生成随机数列
{
int *Number = new int[N];
bool Result;
int CurrentNumber;
for(int i=0;i<N-1;i++)
{
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
do
{
Result=1;
CurrentNumber=qrand()%(N-1);
for(int j=0;j<i;j++)
{
if(CurrentNumber==Number[j])
{
Result=0;
break;
}
}
}while(Result==0);
Number[i]=CurrentNumber;
}
Number[N-1]=N-1;
/*for(int i=0;i<N;i++)
{
qDebug()<<Number[i];
}*/
return Number;
}
void MainWindow::sleep(unsigned int msec)
{
QTime reachTime=QTime::currentTime().addMSecs(msec);
while(QTime::currentTime()<reachTime)
{
QCoreApplication::processEvents(QEventLoop::AllEvents,100);
}
}
void MainWindow::on_pushButton_clicked()
{
if(MainScene->items().count()!=0)
{
AStar astar(Row,Column,GetPuzzle(Begin),BeginX,BeginY);
Step* Last=astar.BFS();
QStack<Step*> StepS;
Step*Current=Last;
while(Curre
没有合适的资源?快使用搜索试试~ 我知道了~
数据结构课程设计基于C++实现的拼图游戏源代码,带自动寻路功能
共34个文件
dll:13个
h:8个
cpp:4个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 113 浏览量
2024-09-22
13:37:46
上传
评论
收藏 7.89MB ZIP 举报
温馨提示
数据结构课程设计基于C++实现的拼图游戏源代码,带自动寻路功能
资源推荐
资源详情
资源评论
收起资源包目录
第四题:拼图游戏软件.zip (34个子文件)
第四题:拼图游戏软件
build-ThePuzzle-Desktop_Qt_5_9_0_MSVC2015_64bit-Debug
2.jpg 49KB
ui_mainwindow.h 6KB
ui_cover.h 3KB
release
2.jpg 49KB
Qt5Gui.dll 5.76MB
imageformats
qjpeg.dll 232KB
qsvg.dll 25KB
qtga.dll 25KB
qtiff.dll 307KB
qwebp.dll 471KB
qgif.dll 32KB
qicns.dll 39KB
qwbmp.dll 24KB
qico.dll 34KB
Qt5Core.dll 5.44MB
Qt5Widgets.dll 5.27MB
platforms
qwindows.dll 1.27MB
ThePuzzle.exe 88KB
3.jpg 34KB
ThePuzzle
graphitem.h 1KB
mainwindow.h 930B
view.cpp 2KB
cover.cpp 285B
mainwindow.cpp 8KB
main.cpp 162B
mainwindow.ui 3KB
cover.h 353B
heap.h 3KB
view.h 2KB
cover.ui 2KB
ThePuzzle.pro.user.192662c 23KB
ThePuzzle.pro 1KB
astar.h 6KB
ThePuzzle.pro.user 23KB
共 34 条
- 1
资源评论
yanglamei1962
- 粉丝: 2518
- 资源: 838
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 实验报告五六代码.zip
- hdw-dubbo-ui基于vue、element-ui构建开发,实现后台管理前端功能.zip
- (Grafana + Zabbix + ASP.NET Core 2.1 + ECharts + Dapper + Swagger + layuiAdmin)基于角色授权的权限体系.zip
- xposed环境.zip
- Awesome The Front End Develop Guide:这份指南汇集了前端开发所使用语言的主流学习资源,并以开发者的视角进行整理编排而成.zip
- 嵌入式开发基础常见10道问题以及答案demo
- 基于Java和Lua的分布式微服务网约车项目设计源码
- 基于Java语言的尚庭公寓2设计源码学习与实践
- 基于C语言为主的opensbi开源设计源码分析与优化
- JavaScript常用函数库,提升前端开发效率.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功