windows程序设计2017考试题03 MazeMe And mouseEvent 迷宫和鼠标移动事件

本文介绍了一个使用Qt框架实现的迷宫寻路程序。该程序通过C++编写,利用了Qt的绘图功能和定时器来更新界面,并实现了简单的鼠标事件处理。核心功能包括寻找从起点到终点的最短路径并进行可视化展示。
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;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值