Qt 迷宫自动寻路

 
  
/*头文件*/
#ifndef WIDGET_H
#define WIDGET_H
 
   
#include 
#include
#include
#include
#include
#include
#include
#include
#include 
#include
using namespace std;
 
   
struct mypoint
{
    QPoint a;
    mypoint* head;
};
 
   
 
   
class Widget : public QWidget
{
    Q_OBJECT
 
   
public:
    explicit Widget(QWidget *parent = 0);
 
   
    ~Widget();
    void tian();
    void go();
    void goo();
protected:
    void mousePressEvent(QMouseEvent *e);
    void mouseMoveEvent(QMouseEvent *e);
    void mouseReleaseEvent(QMouseEvent *e);
    void paintEvent(QPaintEvent *);
 
   
 
   
private:
    queue<mypoint*> v;
    bool a[800][600];
    mypoint *c;
    QPushButton ren;
    QImage pix;
    QPoint lpt,ept,tpt,xy[8000];
    QColor tcolor,color;
    int m,ts,tt,i;
 
   
 
   
 
   
};
 
   
 
   
#endif // WIDGET_H
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
  
/*定义文件*/


#include "widget.h"
#include "ui_widget.h"
void sleep(unsigned int msec)
{
    QTime dieTime = QTime::currentTime().addMSecs(msec);
    while( QTime::currentTime() < dieTime )
        QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
Widget::Widget(QWidget *parent) :
    QWidget(parent)
 
  
{
    ren.setParent(this);
    ren.setGeometry(3,3,10,10);
   // ren.move(40,40);
    ren.setStyleSheet("background-color: rgb(170, 0, 255);");
    m=0;ts=0;a[0][0]=0;tt=0;i=0;
    //tool=1;m=0;t=0;fill=0;w=1;s=Qt::SolidLine;st=Qt::SolidPattern;ts=0;q=0;qs=0;
    pix=QImage(800,600,QImage::Format_ARGB32);
    pix.fill(Qt::white);
    update();
 
  
 
  
}
 
  
void Widget::mousePressEvent(QMouseEvent *e)
{
 
  
    if(e->button()==Qt::LeftButton)
    {
        lpt=e->pos();
        m=1;
    }
    if(e->button()==Qt::RightButton)
    {
        tpt=e->pos();
        ts=1;
        for(int i=0;i<800;i++)
            for(int j=0;j<600;j++)
                if(pix.pixelColor(QPoint(i,j))==Qt::white)
                       a[i][j]=true;
                else
                        a[i][j]=false;
        update();
    }
    if(e->button()==Qt::MidButton)
    {
        tt=1;
 
  
            for(int j=0;j<i;j++)
            {
                ren.move(xy[j]);
                sleep(5);
            }
        tt=0;
    }
 
  
}
void Widget::mouseMoveEvent(QMouseEvent *e)
{
    update();
    if(m==0)return;
        ept=e->pos();
        m=2;
        update();
 
  
}
void Widget::mouseReleaseEvent(QMouseEvent *e)
{
    if(e->button()==Qt::LeftButton)
    {
        ept=e->pos();
        m=3;
        update();
    }
}
void Widget::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    if(ts==1)
    {
        go();
        ts=0;
        p.drawImage(0,0,pix);
        tt=1;
    }
    if(m==0)return ;
 
  
    if(tt==1){p.drawImage(0,0,pix);return;}
    QPainter p2(&pix);
    QPen pe;
    pe.setColor(Qt::black);
    pe.setWidth(7);
    pe.setCapStyle(Qt::RoundCap);
    p2.setPen(pe);
    p2.drawLine(lpt,ept);
    lpt=ept;
    if(m==3)
       m=0;
     p.drawImage(0,0,pix);
}
 
  
 
  
Widget::~Widget()
{
 
  
}
 
  
 
  
 
  
void Widget::go()
{
    mypoint *m=new mypoint;
    m->a=tpt;m->head=NULL;
    v.push(m);
    while(!v.empty())
    {
        c=v.front();
        a[c->a.x()][c->a.y()]=false;
        v.pop();
        if(c->a==QPoint(0,0))
        {
            //setWindowTitle("1231321");
            mypoint *p=c;
            do
            { xy[i++]=p->a;
                pix.setPixelColor(p->a,Qt::blue);
                p=p->head;
 
  
            }while(p->a!=tpt);
 
  
            break;
        }
 
  
 
  
        int der[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
        for(int i=0;i<4;i++)
        {
 
  
           if((c->a.x()+der[i][0]>=0&&c->a.x()+der[i][0]<800)&&(c->a.y()+der[i][1]>=0&&c->a.y()+der[i][1]<600)&&a[c->a.x()+der[i][0]][c->a.y()+der[i][1]]==true)
           {
               a[c->a.x()+der[i][0]][c->a.y()+der[i][1]]=false;
               mypoint *ccc=new mypoint;
               ccc->a=QPoint(c->a.x()+der[i][0],c->a.y()+der[i][1]);
               ccc->head=c;
               v.push(ccc);
           }
        }
 
  
    }
}
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  

/*主要思想:通过广度搜索遍历能走的点,每一个点用指针fore指向其源头。
当遍历到终点时,跳出循环,此时最后一个出容器的点的fore指向起点的路径为最短路径*/

 
  


你可能感兴趣的:(Qt 迷宫自动寻路)