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