生成迷宫/C++

小时候,都喜欢玩迷宫,现在的电脑上还可以玩3D类迷宫。
那么每次开始游戏时,迷宫里密密麻麻的道路是怎么生成的呢?
在代码里面,我们把它们想象成一堆像素小格子,当两个格子连在一起,就像一堵墙,那一圈格子就是一间小房间,房间有门,对应的门就没有墙壁。所以生成迷宫地图,就是一个挖墙造门的过程。
在这里插入图片描述

思路:
1.首先假设迷宫场地是充满墙壁没有道路的。我们的工作其实就是把迷宫“挖”出来。不妨把开始时的迷宫看成一些小的“房间”,每个“房间”四面都被墙壁包围。画迷宫的过程实际就是从一个房间随机走到另一个房间,走的过程中把墙壁“挖掉”。定义一个类,这个类的每个对象代表迷宫里的一个格子,里面存放了这块墙壁或房间是否被挖过,以及它是否是一个“房间”。选好一个房间作为起点(我选的左上角),然后开始随机挖。

2.到达一个房间时判断四周房间的情况。按照四个方向判断。如果其中一个方向的隔壁房间挖过了,就不要把这个方向记录下来。如果四周都不能挖了,就一路退回之前能挖的地方。再次随机一个新方向,继续挖。(有点类似走迷宫的过程)

程序中记录道路用了C++STL里的栈。

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <stack>
#include <vector>
#define M 25   //迷宫的规模
using namespace std;class Grid{
public:bool cell, dig;
};
//迷宫格子类型,记录了是否被挖过
Grid maze[M][M];
stack<int> row_s, col_s;
//用来存放路径的栈
void Init(){for(int i=0; i<M; i++){for(int j=0; j<M; j++){maze[i][j].dig=false;if(i%2!=0 && j%2!=0)maze[i][j].cell=true;}}row_s.push(1);    col_s.push(1);srand(time(0));
}
//初始化迷宫格子
int DirRand(){vector <int> dirlist;        //用来记录可选择的方向int result=0;int row=row_s.top(), col=col_s.top();//0 up, 1 down, 2 left, 3 rightif(row-2>0 && !maze[row-2][col].dig) dirlist.push_back(0);if(row+2<M-1 && !maze[row+2][col].dig) dirlist.push_back(1);if(col-2>0 && !maze[row][col-2].dig) dirlist.push_back(2);if(col+2<M-1 && !maze[row][col+2].dig) dirlist.push_back(3);if(dirlist.size()==0) result=-1;else result=dirlist[rand()%((int)dirlist.size())];return result;
}
//判断周围情况,没有可挖的格子时返回-1
void GenMaze(){while(!row_s.empty() && !col_s.empty()){int dir=DirRand();int row=row_s.top(), col=col_s.top();if(dir!=-1){     //前进if(dir==0){maze[row-2][col].dig=maze[row-1][col].dig=true;row_s.push(row-2);  col_s.push(col);}else if(dir==1){maze[row+2][col].dig=maze[row+1][col].dig=true;row_s.push(row+2);  col_s.push(col);}else if(dir==2){maze[row][col-2].dig=maze[row][col-1].dig=true;row_s.push(row);    col_s.push(col-2);}else if(dir==3){maze[row][col+2].dig=maze[row][col+1].dig=true;row_s.push(row);    col_s.push(col+2);}}else{row_s.pop();    col_s.pop();        //后退}}
}void OutMaze(){      //输出迷宫for(int i=0; i<M; i++){for(int j=0; j<M; j++){if(maze[i][j].cell || maze[i][j].dig)cout<<"  ";else cout<<"##";        //为了保证对齐,墙壁和道路宽都是2个字符}cout<<endl;}
}int main(){Init();GenMaze();OutMaze();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring boot 配置tomcat后 控制台不打印SQL日志

在pom.xml中配置tomcat启动处加上&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</…

人生有五不:不等、不管、不看、不做、不给

一、我不等 朋友什么都等&#xff1a;等退休、等一千万存款、等孩子长大、等房贷缴清……最后等到了告别式。 他有感而发告诉我们这群探病友人&#xff0c;人都会走&#xff0c;可是他走得有些遗憾&#xff0c;有点不甘&#xff0c;非常后悔&#xff0c;除了工作之外&#xff0…

selenium操作浏览器的前进和后退

前进关键字&#xff1a;driver.forward() 后退关键字&#xff1a;driver.back() 测试对象&#xff1a;1、https://www.baidu.com/ 2、https://www.sogou.com/ 实例代码&#xff1a; 1 # 导入测试所需的库或者模块2 from selenium import webdriver3 import unittest4 import ti…

关于对象不能直接访问私有成员的误区(转)

先贴代码&#xff1a; #includeusing namespace std; class CPoint { public:CPoint(int xx, int yy){x xx;y yy;}CPoint(const CPoint &p){x p.x;y p.y;} private:int x, y; };如果你在想为什么拷贝构造函数的参数可以直接去访问它自己的私有成员的话&#xff0c;你就…

阿里云 ECS服务器 开放 8080 端口 -- 图解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 由于 kong-dashboard 的端口是映射到 8080 的&#xff0c;服务已启动成功却一直访问不了&#xff0c;最后才想起端口没有开放 ... 1. 登…

.NET高级代码审计(第三课)Fastjson反序列化漏洞

0X00 前言 Java中的Fastjson曾经爆出了多个反序列化漏洞和Bypass版本&#xff0c;而在.Net领域也有一个Fastjson的库&#xff0c;作者官宣这是一个读写Json效率最高的的.Net 组件&#xff0c;使用内置方法JSON.ToJSON可以快速序列化.Net对象。让你轻松实现.Net中所有类型(对象,…

IDEA:No SLF4J providers were found.

如果您是用IDEA 的 maven 写的 将slf4j的导入包 更改 为下列代码 <dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.8.0-beta2</version></dependency><dependency><groupId&…

【C++基础】时间类型详解(转)

Unix时间戳(Unix timestamp)&#xff0c;或称Unix时间(Unix time)、POSIX时间(POSIX time)&#xff0c;是一种时间表示方式&#xff0c;定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。Unix时间戳不仅被使用在Unix 系统、类Unix系统中&#xff0c;也在许多其…

没变强是因为你太舒服(图)

职业生涯很长&#xff0c;对企业而言&#xff0c;它需要你成为一个专才&#xff0c;但从职业发展来看&#xff0c;你需要成为一个全才&#xff0c;方能适应社会的变化。 阻碍你成为全才的不良习惯有很多&#xff0c;有时候我们喜欢趋利避害&#xff0c;拖延症更是让自己定下来…

解决:DuplicateMappingException: Table [xx] contains physical column name referred to by multiple ... .

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 报错如题&#xff1a; Caused by: org.hibernate.DuplicateMappingException: Table [xxx] contains physical column name [comment] …

0323表格学习

上午早来复习了一会昨天的课程。今天主要学习了表格的标签写法&#xff0c;难度不大&#xff0c;但是合并行与合并列容易混淆搞不明白。 <!--有序列表--> <ol type"I"> <li>数学</li> <li>英语</li> &l…

路由进阶

1>路由组件传参 在组件中使用 $route 会使之与其对应路由形成高度耦合&#xff0c;从而使组件只能在某些特定的 URL 上使用&#xff0c;限制了其灵活性。 解决方法: 1.1若是动态匹配页面&#xff0c;只需要在路由参数中加入props:true即可。 import Home from "/views/…

物联网摄像机通讯_网络调试助手

1&#xff0c;文档目的&#xff1a; 了解对于物联网网关与摄像机协议联动&#xff0c;进行报警抓图&#xff0c;智能检测&#xff0c;OSD叠加&#xff0c;语音播报控制等联动及数据交互。 适用产品&#xff1a;物联网网关 &#xff08;OSD是屏幕显示技术的一种&#xff09; 2…

linux 复制指定目录下的全部文件到另一个目录中,linux cp 文件夹

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 linux复制指定目录下的全部文件到另一个目录中复制指定目录下的全部文件到另一个目录中文件及目录的复制是经常要用到的。linux下进行复…

银行不告诉的秘密,看完豁然大悟

随着理财意识的广泛普及&#xff0c;每个人与银行打交道的次数越来越频繁&#xff0c;对于银行知识、业务的了解似乎也有了很大的进步。 但总有一些看似很“肯定”的事&#xff0c;在银行那里却成了“不一定”。 在银行里&#xff0c;还存在着不少让非专业人士“意想不到”…

TOJ 3046: 招商银行网络系统

3046: 招商银行网络系统 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByteTotal Submit: 12 Accepted:3 Description 虽然招商银行的网络安全已经做得非常完善&#xff0c;但是天有不测风云&#xff0c;招商银行内部网络系统的一台服务器意外感…

vue打包成app后,背景图片不显示

问题&#xff1a; 在使用npm run build 打包后&#xff0c; 如果在页面中使用img标签引入&#xff0c;打包后的路径是由index.html开始访问的&#xff0c;真正访问的是Static/img/图片名&#xff0c; 是正确的&#xff0c; 但是写在css 中的background: url("../../assets…

解决: Linux – git: command not found

出错原因&#xff1a;服务器没有安装GIT&#xff0c;所以导致出错。 解决方法&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Centos下使用&#xff1a;yum install git…

19-03-25

关于上拉加载和下拉刷新 minirefresh.github.io/minirefresh… 这是一个插件&#xff0c;应该是默认禁止了e.preventDefault和e.stopPropagation&#xff0c;而且在每次touchend中判断当前滚动条位置&#xff0c;如果到达上部顶部&#xff0c;则再次双禁止&#xff0c;因为插件…

如何设计函数?

函数&#xff1a; 一段具有某项功能的代码&#xff0c;是C语言中管理代码的单位。 把代码封装成一个个函数&#xff0c;可以方便的管理和调用代码。函数分类&#xff1a; 标准库函数&#xff1a;C语言标准为委员会为C语言以函数形式提供的一些基础功能&#xff0c;被封装在lib…