实验三迷宫

本文介绍了使用QT Creator 5.14.2开发的一个迷宫游戏项目,包括随机生成迷宫、玩家移动及留下足迹、A*算法寻路等功能。难点在于迷宫生成和路径搜索,项目评价中提到A*算法的实现有一定难度。通过键盘控制游戏,以图形化方式展示迷宫和路径。
摘要由CSDN通过智能技术生成

 1、 项目概述

1.1   项目目标和主要内容

本项目实现的主要内容和目标为设计一个迷宫游戏。

使用的开发平台,采用的主要工具为:qt creator5.14.2

本项目实现的主要内容和目标为设计一个迷宫游戏。

1.2   项目的主要功能

1、迷宫随机生成

2、玩家走迷宫,留下足迹;

3、系统用A*算法寻路,输出路径

2、 项目设计

2.1   项目总体框架

创建随机迷宫,制作自动寻路功能,用键盘控制移动,判断游戏结束

2.2   系统详细设计

定义迷宫,打通迷宫,寻路

2.3   关键算法分析

算法1:设置迷宫

 //迷宫围墙,nn*2+2是规划的迷宫地图大小, 比实际地图要大3*3

    for(int i=0; i<=nn*2+2; ++i)

        for(int j=0; j<=nn*2+2; ++j)

            maze[i][j] = 1;

    //在迷宫之外的的轮廓默认为过道

    for(int i=0, j=2*nn+2; i<=2*nn+2; ++i)

    {

        maze[i][0] = 0;

        maze[i][j] = 0;

    }

    for(int i=0, j=2*nn+2; i<=2*nn+2; ++i)

    {

        maze[0][i] = 0;

        maze[j][i] = 0;

    }

    //默认迷宫坐标第三行第一例为起点

    maze[2][1] = 2;

    //默认2*nn   2*nn+1列为终点

    maze[2*nn][2*nn+1] = 3;

    //生成无符号随机数

    srand((unsigned)time(NULL));

    //生成的随机数在 [0, nn+1]之间,生成路径

    searchPath(rand()%nn+1, rand()%nn+1);

    //将地图整体向左上方平移一个单位

    for(int i = 0; i < n; i++)

    {

        for(int j = 0; j < n; j++)

        {

            maze[i][j] = maze[i+1][j+1];

        }

    }

    len_path = 0;

}

算法2: 设置迷宫

int MAZE::searchPath(int x, int y)

{

    //往四个方向挖

    static int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};

    int zx = x*2;

    int zy = y*2;

    int next, turn, i;

    maze[zx][zy] = 0;

    //设置turn为[0, 4]之间的任意一个奇数

    turn = rand()%2 ? 1 : 3;

    //next=rand()%4 取值范围[0, 4),

    //next=(next+turn)%4 每个循环在奇数和偶数之间切换,[0, 4)遍历一遍

    //在迷宫地图里,随机选一个地方,开始挖路,4次循环,往4个方向挖

    for(i=0, next=rand()%4; i<4; ++i, next=(next+turn)%4)

        //搜索当前位置的第二步,如果是围墙,这将但前位置的沿着指定方向的下一步设置为路

        //这样做的原因: 防止打穿最外层的围墙, 防止造成回环

        if(maze[zx+2*dir[next][0]][zy+2*dir[next][1]] == 1)

        {

            maze[zx+dir[next][0]][zy+dir[next][1]] = 0;

            searchPath(x+dir[next][0], y+dir[next][1]);

        }

    return 0;

}

算法3:绘制图片

void MainWindow::paintEvent(QPaintEvent *)

{

    QPainter painter(this);

int n = m->get_n();

    for(int i = 0; i < n; i++)

    {

        for(int j = 0; j < n; j++)

        {

            //绘制迷宫围墙

            if(m->maze[i][j] ==1){

                painter.setPen(Qt::darkCyan);

                painter.setBrush(QBrush(Qt::darkCyan,Qt::SolidPattern));

                painter.drawRect(QRect(j*size,i*size,size,size));

            }

            //绘制你当前的位置,用门的图片表示

            else if(m->maze[i][j] == 2){

                painter.drawPixmap(j*20,i*20,20,20,QPixmap(":/new/prefix1/img/door.jpg").scaled(20,20));

            }

            //绘制迷宫终点,用奶酪图片表示

            else if(m->maze[i][j] == 3){

                painter.setPen(Qt::red);

                painter.setBrush(QBrush(Qt::red,Qt::SolidPattern));

                painter.drawRect(QRect(j*size,i*size,size,size));

                painter.drawPixmap(j*20,i*20,20,20,QPixmap(":/new/prefix1/img/nailao.jpg").scaled(20,20));

            }

            //绘制迷宫过道

            else if(m->maze[i][j] == 0){

                painter.setPen(Qt::white);

                painter.setBrush(QBrush(Qt::white,Qt::SolidPattern));

                painter.drawRect(QRect(j*size,i*size,size,size));

            }

            //绘制最短路径提示,用老鼠图片表示

            else if(m->maze[i][j] == 6){

                painter.drawPixmap(j*20,i*20,20,20,QPixmap(":/new/prefix1/img/timg.jpg").scaled(20,20));

            }

        }

    }

}

算法4:寻找路径

void MainWindow::startBFS()//开始找寻最短路径

{

    m->printPath();

    QString str;

    ql_bushuOut->setText(str.setNum(m->get_len_path()));

    bfs_fg = true;

    this->setFocus(Qt::MouseFocusReason);

    update();

}

3、 程序运行结果分析

4、 总结

4.1   项目的难点和关键点

难点在于随机构建迷宫以及自动寻路的实现。

4.2   项目的评价

这个项目的难度大,可以用深度遍历还有Prime创建迷宫,寻路也可以深度遍历和广度遍历以及A*算法A*算法不熟悉用了最简单的寻路

4.3   心得体会 

这次项目的难度很高想要我一直找不同的视频跟着做,百度了解A*和深度优先,虽然最后还是没用到A*

实验博客

https://mp.csdn.net/mp_blog/creation/editor/122204019

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值