1.Mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <pathfinder.h>
#include <QtWidgets>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
statusBar()->addPermanentWidget(ui->label_2);
statusBar()->addPermanentWidget(ui->label);
this->setMouseTracking(true);
QTimer *t=new QTimer(this);
connect(t,SIGNAL(timeout()),this,SLOT(update()));
t->start(100);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::paintEvent(QPaintEvent *e)
{
static QPoint start(1,1);
static QPoint end(8,8);
static int maze[10][10] = {{0,0,0,0,0,0,0,0,0,0},/*0*/
{0,1,1,0,1,1,1,0,1,0},/*1*/
{0,1,1,0,1,1,1,0,1,0},/*2*/
{0,1,1,1,1,0,0,1,1,0},/*3*/
{0,1,0,0,0,1,1,1,1,0},/*4*/
{0,1,1,1,0,1,1,1,1,0},/*5*/
{0,1,0,1,1,1,0,1,1,0},/*6*/
{0,1,0,0,0,1,0,0,1,0},/*7*/
{0,0,1,1,1,1,1,1,1,0},/*8*/
{0,0,0,0,0,0,0,0,0,0}/*9*/
};
static bool isok=false;
if(!isok)
isok=SeekShortestPath(maze, start,end);
PrintPath(maze, start, end);
Q_UNUSED(e);
QPainter painter(this);
QPoint lefttop(-300,-250);
QSize size(50,50);
QRect rect(lefttop,size);
painter.translate(width() / 2, height() / 2);
int side = qMin(width(), height());
painter.scale(side / 600.0, side / 600.0);
int i,j;
for(i=0; i < 10; i++)
{
for(j=0; j < 10; j++)
{
lefttop.setX(lefttop.x()+50);
rect.moveTo(lefttop);
if(maze[i][j]==1)
{
//painter.fillRect(rect,Qt::green);
painter.setBrush(Qt::green);
painter.drawRect(rect);
}
else if(maze[i][j]==2)
{
painter.fillRect(rect,Qt::darkBlue);
}
else if(maze[i][j]==-1)
{
painter.fillRect(rect,Qt::cyan);
}
else if(maze[i][j]==0)
{
painter.fillRect(rect,Qt::magenta);
}
else if(maze[i][j]==3)
{
painter.fillRect(rect,Qt::blue);
}
else if(maze[i][j]==4)
{
painter.fillRect(rect,Qt::red);
}
}
lefttop.setX(-300);
lefttop.setY(lefttop.y()+50);
}
if(isok)
{
disconnect(this);
}
// for(int i=0;i<10;i++)
// {
// for(int j=0;j<10;j++)
// {
// leftTop.setX(leftTop.x()+50);
// rect.moveTo(leftTop);
// painter.drawRect(rect);
// }
// leftTop.setX(0);
// leftTop.setY(leftTop.y()+50);
// }
}
void MainWindow::mousePressEvent(QMouseEvent *e)
{
QString str="("+QString::number(e->x())+","+QString::number(e->y())+")";
if(e->button()==Qt::LeftButton) {
statusBar()->showMessage(tr("左键:")+str);
}
else if(e->button()==Qt::RightButton) {
statusBar()->showMessage(tr("右键:")+str);
} else if(e->button()==Qt::MidButton) {
statusBar()->showMessage(tr("中键:")+str);
}
}
void MainWindow::mouseMoveEvent(QMouseEvent *e)
{
QString str="("+QString::number(e->x())+","+QString::number(e->y())+")";
ui->label->setText(str);
this->setMouseTracking(true);
}
void MainWindow::mouseReleaseEvent(QMouseEvent *e)
{
QString str="("+QString::number(e->x())+","+QString::number(e->y())+")";
statusBar()->showMessage(tr("释放在:")+str,3000);
}
2.MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QMouseEvent>
#include<qpainter.h>
#include<QTimer>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
void mousePressEvent(QMouseEvent *e);
void mouseMoveEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);
void paintEvent(QPaintEvent *e);
};
#endif // MAINWINDOW_H
3.pathfinder.h
#ifndef PATHFINDER_H
#define PATHFINDER_H
#include <QString>
#include<QPoint>
#include<QQueue>
struct OffsetInfo
{
int dx;
int dy;
QString dir;
OffsetInfo(int x=0,int y=1, QString d=""):dx(x),dy(y),dir(d) {}
};
static OffsetInfo guide[8]= {{1,0,"S"},{0,-1,"W"},{-1,0,"N"},{0,1,"E"},{1,-1,"SW"},{1,1,"SE"},{-1,-1,"NW"},{-1,1,"NE"}};
int SeekShortestPath(int maze[][10],QPoint start,QPoint end);
void PrintPath(int maze[][10],QPoint start,QPoint end);
#endif // PATHFINDER_H
4.pathfinder.cpp
#include<pathfinder.h>
int SeekShortestPath(int maze[][10],QPoint start,QPoint end)
{
if(start.x()==end.x()&&start.y()==end.y())
{
return 1;
}
static QQueue<QPoint> q;
static QPoint info(start);
static int nx, ny;
q.enqueue(info);
maze[start.x()][start.y()]=2;
while(!q.empty())
{
info=q.front();
q.dequeue();
for(int i=0; i<8; i++)
{
nx=info.x()+guide[i].dx;
ny=info.y()+guide[i].dy;
if(nx<0||ny<0)
continue;
if(maze[nx][ny]!=1)
continue;
q.enqueue(QPoint(nx,ny));
maze[nx][ny]=maze[info.x()][info.y()]+1;
if(nx==end.x()&&ny==end.y())
return 1;
}
}
return 0;
}
void PrintPath(int maze[][10],QPoint start,QPoint end)
{
int x=end.x();
int y=end.y();
int nx,ny;
while(x!=start.x()&&y!=start.y())
{
// cout<<"("<<x<<","<<y<<")"<<endl;
for(int i=0; i<8; i++)
{
nx=x+guide[i].dx;
ny=y+guide[i].dy;
if(maze[nx][ny]==maze[x][y]-1)
{
x=nx;
y=ny;
break;
}
}
}
// cout<<"("<<x<<","<<y<<")"<<endl;
}