生成迷宮/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.pswp.cn/news/449117.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449117.shtml
英文地址,請注明出處:http://en.pswp.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…