【Qt编程】3D迷宫游戏
说起迷宫想必大家都很熟悉,个人感觉迷宫对人的方向感是很大的考验,至少我的方向感是不好的,尤其是在三维空间中。由于这段时间帮导师做项目用到了三维作图,便心血来潮想做个三维迷宫玩玩。要想画出三维的迷宫游戏,我们需要先从二维开始。
二维迷宫:
1.最开始时,只有初始点处的墙被拆掉
2、随机数randnum=2,开始向左边拆墙,由于(4,2)为0(有墙),可以拆,于是拆掉(4,2)、(4,3)位置的墙,则结果如下:
3、接着产生随机数randnum=1,开始向下拆墙,由于(6,2)为0(有墙),可以拆,于是拆掉(5,2)、(6,2)位置的墙,结果如下:
4、继续产生随机数randnum=0,开始向上拆墙,由于(4,2)为1没有墙,不可以拆,于是重新产生随机数,结果与上一张图一样:
5、继续产生随机数randnum=3,开始向右拆墙,由于(6,4)为0有墙,可以拆,于是拆掉(6,3)、(6,4)位置的墙,结果如下:
按照上述步骤重复下去,最终得到一个可能的迷宫矩阵如下:
#include<iostream> #include<ctime> #include<vector> #define M 9//迷宫的行 #define N 9//迷宫的列 //构造迷宫类型// using namespace std; class MazeStack;//申明该类 class Maze//定义迷宫节点信息。 { public: int i; int j; int state; }; class MazeMat { Maze matrix[M][N];//迷宫矩阵 vector<Maze> EntryPath;//从初始点到入口的路径 vector<Maze> ExitPath;//从初始点到出口的路径 vector<Maze> FinalPath;//从入口到出口的路径 MazeStack *mazeStack;//定义栈 public: void initMaze();//初始化迷宫矩阵 void createMaze();//产生迷宫矩阵 void displayMaze();//显示迷宫矩阵 void FindWay();//寻找入口到出口的路径 }; //////////////////
2、Maze.cpp
#include"MazeStack.h" using namespace std; void MazeMat::initMaze()//初始化迷宫矩阵 { for(int i=0;i<M;i++) for(int j=0;j<N;j++) { matrix[i][j].i=i; matrix[i][j].j=j; matrix[i][j].state=0;//初始化迷宫矩阵元素为0,即全为墙 } mazeStack=new MazeStack(); EntryPath.clear();//初始化各个路径 ExitPath.clear(); FinalPath.clear(); } void MazeMat::createMaze()//产生迷宫矩阵,中间也记录了从初始点到入口、出口的路径 { int i=4;//初始点设定,注意i,j必须为偶数 int j=4; bool Left=false;//初始化四个方向,false代表可以朝这个方向搜索 bool Right=false; bool Up=false; bool Down=false; matrix[i][j].state=1;//设置初始点是空的,即不是墙 srand((int)time(0));//产生随机数种子,使得每次运行情况不同 Maze temp; temp.i=i; temp.j=j; temp.state=0; int count1=0; int num1=0; mazeStack->Push(temp);//将初始点进栈 while(1)//不断循环搜索可行方向,形成迷宫 { temp.i=i; temp.j=j; int randNum=0; randNum=rand()%4;//0,1,2,3 //我们假设迷宫矩阵的第一个元素(0,0)为入口,最后一个元素(M-1,N-2)为出口 if(temp.i==0&&temp.j==0) { EntryPath.clear(); while(mazeStack->isEmpty() == false) { EntryPath.push_back(mazeStack->GetTop());//获得从初始点到入口的路径 mazeStack->Pop(); } for(int ii=EntryPath.size()-1;ii>=0;ii--) { mazeStack->Push(EntryPath[ii]);//还原栈 } } if(temp.i==M-1&&temp.j==N-1) { ExitPath.clear(); while(mazeStack->isEmpty() == false) { ExitPath.push_back(mazeStack->GetTop());//获得从初始点到出口的路径 mazeStack->Pop(); } for(int i=ExitPath.size()-1;i>=0;i--) { mazeStack->Push(ExitPath[i]);//还原栈 } } switch(randNum) { case 0://向上搜索 if(Up==false&&i>1&&matrix[i-2][j].state!=1) { mazeStack->Push(temp); matrix[i-1][j].state=1; matrix[i-2][j].state=1; i=i-2; Left=false; Right=false; Up=false; Down=false; } else Up=true; break; case 1://向下搜索 if(Down==false&&i<M-2&&matrix[i+2][j].state!=1) { mazeStack->Push(temp); matrix[i+1][j].state=1; matrix[i+2][j].state=1; i=i+2; Left=false; Right=false; Up=false; Down=false; } else Down=true; break; case 2://向左搜索 if(Left==false&&j>1&&matrix[i][j-2].state!=1) { mazeStack->Push(temp); matrix[i][j-1].state=1; matrix[i][j-2].state=1; j=j-2; Left=false; Right=false; Up=false; Down=false; } else Left=true; break; case 3://向右搜索 if(Right==false&&j<N-2&&matrix[i][j+2].state!=1) { mazeStack->Push(temp); matrix[i][j+1].state=1; matrix[i][j+2].state=1; j=j+2; Left=false; Right=false; Up=false; Down=false; } else Right=true; break; }//end switch if(Left&&Right&&Up&&Down) //当上下左右都不可行时,进行回溯 { if(mazeStack->isEmpty()) //回溯完毕,生成迷宫 { return ; } else //进行出栈操作 { i = mazeStack->GetTop().i; j = mazeStack->GetTop().j; mazeStack->Pop(); Left=false; Right=false; Up=false; Down=false; } } }//end while } void MazeMat::displayMaze()//显示迷宫 { matrix[0][0].state = matrix[M-1][N-1].state = 2;//2表示入口和出口 for(int i=0;i<FinalPath.size();i++) { matrix[FinalPath.at(i).i][FinalPath.at(i).j].state=3;//3表示可达路径点 } cout<<"左上角为入口,右下角为出口,oo代表可达路径."<<endl; for(int k=0;k<N+2;k++)//在迷宫矩阵的外围墙 cout<<"■"; cout<<endl; for (int i = 0; i < M; i++) { cout<<"■"; for (int j = 0; j <N; j++) { switch ( matrix[i][j].state ) { case 0:cout<<"■";break;// 显示墙 case 1:cout<<" ";break;//显示空 case 2:cout<<"↘";break;//显示入口和出口 case 3:cout<<"oo";break;//显示可达路径 } } cout<<"■"; cout<<endl; } for(int k=0;k<N+2;k++) cout<<"■"; cout<<endl; } void MazeMat::FindWay()//寻找可达路径 { FinalPath.clear();//清零 int i=0,j=0; for(i=EntryPath.size()-1,j=ExitPath.size()-1;i>=0&&j>=0;i--,j--) { if(EntryPath.at(i).i!=ExitPath.at(j).i||EntryPath.at(i).j!=ExitPath.at(j).j) { break; } } if(i<0)//初始点到出口的路径中经过入口 { for(int k=ExitPath.size()-EntryPath.size()-1;k>=0;k--) { FinalPath.push_back(ExitPath.at(k)); } } else if(j<0)//初始点到入口的路径中经过出口 { for(int k=EntryPath.size()-ExitPath.size()-1;k>=0;k--) { FinalPath.push_back(EntryPath.at(k)); } } else//初始点到入口、出口的路径有部分重叠或则没有重叠 { for(int k=0;k<=i+1;k++) { FinalPath.push_back(EntryPath.at(k)); } for(int k=j;k>=0;k--) { FinalPath.push_back(ExitPath.at(k)); } } }
3、MazeStack.h
#include"Maze.h" typedef Maze ElementType; //这里是栈的定义 typedef struct node { ElementType data; struct node *next; }Node; class MazeStack { public: MazeStack():bottom(NULL),top(NULL),Size(NULL){} ~MazeStack(){} bool isEmpty(); bool Push(ElementType e); ElementType GetTop(); ElementType Pop(); private: Node *bottom; Node *top; int Size; };
4、MazeStack.cpp
#include"MazeStack.h" bool MazeStack::isEmpty()//判断栈是否为空 { if(top==bottom) return true; return false; } bool MazeStack::Push(Maze m)//进栈 { Node *temp; temp=top; top=new Node(); if(!top) return false; top->data=m; top->next=temp; Size++; return true; } Maze MazeStack::Pop()//出栈 { Node temp; temp.data=top->data; temp.next=top->next; delete top; top=temp.next; Size--; return temp.data; } Maze MazeStack::GetTop()//取栈顶元素 { return top->data; }
5、main.cpp
#include"MazeStack.h" void main() { MazeMat matrix; matrix.initMaze(); matrix.createMaze(); matrix.FindWay(); matrix.displayMaze(); }
具体的程序截图如下:
2维到3维的转化
原文:http://blog.csdn.net/tengweitw/article/details/40213317
作者:nineheadedbird
【Qt编程】3D迷宫游戏的更多相关文章
- 用webgl打造自己的3D迷宫游戏
用webgl打造自己的3D迷宫游戏 2016/09/19 · JavaScript · WebGL 原文出处: AlloyTeam 背景:前段时间自己居然迷路了,有感而发就想到写一个可以让人迷路 ...
- 【Qt编程】基于Qt的词典开发系列--后序
从去年八月份到现在,总算完成了词典的编写以及相关技术文档的编辑工作.从整个过程来说,文档的编写比程序的实现耗费的时间更多.基于Qt的词典开发系列文章,大致包含了在编写词典软件过程中遇到的技术重点与难点 ...
- Qt编程学习网站
http://blog.csdn.net/k122769836/article/details/8637677 QT - little_su - 博客频道 - CSDN.NET Qt - 1+1=2 ...
- 3D单机游戏《天鹰教》源码发布(二)
3D单机游戏<天鹰教>源码发布 作者 作者: 游蓝海 博客: http://blog.csdn.net/you_lan_hai mail: you_lan_hai@foxmail. ...
- POJ 2251 Dungeon Master(3D迷宫 bfs)
传送门 Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 28416 Accepted: 11 ...
- c语言迷宫游戏的实现
// // main.c // 迷宫游戏代码实现 // #include <stdio.h> #define ROW 6 //宏定义行 #define COL 6 //宏定义列 /** * ...
- 51nod 1459 迷宫游戏(dij)
题目链接:51nod 1459 迷宫游戏 dij裸题. #include<cstdio> #include<cstring> #include<algorithm> ...
- qt编程入门
面对qt编程,必须先知道qt中常用的类: QPushButton按钮类.QLabel标签类.QMessageBox对话框类.QCheckBox.QAction.QMenu.QStatusBar.QTo ...
- 3D跑酷游戏《月影忍者之疾风狂逃》
<月影忍者之疾风狂逃>是一款3D跑酷游戏,也是我实习的时候参与的一个项目,在那个公司我学到了很多东西,谢谢他们.大家可以去玩玩这个游戏啊,还是不错的哦.
随机推荐
- 模拟DbUtils实现接口回调机制
想必大家都用过apache 的DbUtils吧,这个简单的对JDBC的封装小框架真的是非常非常的适合新手的学习呢.逻辑上也不是很复杂,难度刚刚好. 下面我就模仿它来实现一个字符串的处理小框架. 思路 ...
- Oracle 大数据集成实施
Oracle 大数据实施架构 Oracle为广大客户提供了一个预装的用于测试和学习目的的免费大数据环境.你可以在这个环境中对Oracle大数据一体机(Big Data Appliance)上的可选软件 ...
- 文档发布工具mkdocs
mkdocs是Python的一个对 Markdown 友好的文档生成器.,小巧精美. MkDocs is a fast, simple and downright gorgeous static si ...
- Servlet之异常处理
当一个 Servlet 抛出一个异常时,Web 容器在使用了exception-type 元素的 web.xml 中搜索与抛出异常类型相匹配的配置. 前提是必须在 web.xml 中使用 error- ...
- Qzone React Native改造
Android Qzone 6.1版本在情侣空间涉水React Native,以动态插件方式将情侣空间进行React Natived的改造.在情侣空间基础上,Android Qzone 6.2版本以融 ...
- Android开发学习之路--Activity之生命周期
其实这篇文章应该要在介绍Activity的时候写的,不过那个时候还不怎么熟悉Activity,还是在这里详细介绍下好了.还是参考下官方文档的图吧: 从上面的流程,我们可以看出首先就是打开APP,开始执 ...
- TCP/IP 协议简单分析
首先TCP和IP是两种不同的协议,它们来七层网络模型中分别在不同的层次,IP协议是网络层的协议,TCP是更高一层的传输层的协议,TCP是建立在IP协议之上的,所以一般把TCP和IP连在一起说TCP/I ...
- Android的ExpandableListView-android学习之旅(二十八)
ExpandableListView简介 ExpandableListView是ListView的子类,用法和ListView类似,ExpandableListView可以创建几个类别,每个类别下面又 ...
- 【嵌入式开发】ARM 芯片简介 (ARM芯片类型 | ARM处理器工作模式 | ARM 寄存器 | ARM 寻址)
: 12MHz 晶振 对应 405 ~ 532 MHz 处理速度; -- : 16K 指令缓存, 16K 数据缓存; -- : 32KB 指令缓存, 32KB 数据缓存; (3) 内存接口对比 : 提 ...
- 利用openssl管理证书及SSL编程第3部分:将MinGW编译的openssl dll导出def和lib供MSVC使用
将MinGW编译的openssl dll导出def和lib供MSVC使用 前面我们用mingw把openssl 编译成了动态库,得到下面2个dll文件: libeay32.dll ssleay32.d ...