最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java基于深度優(yōu)先遍歷的隨機迷宮生成算法

 更新時間:2019年02月20日 14:25:38   作者:嚴洋羽  
今天小編就為大家分享一篇關(guān)于Java基于深度優(yōu)先遍歷的隨機迷宮生成算法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

這兩天因為要做一個隨機的地圖生成系統(tǒng),所以一直在研究隨機迷宮生成算法,好吧,算是有一點小小的成果。

隨機迷宮生成我自己的理解簡而言之分為以下幾步:

1、建立一張地圖,我用的二維數(shù)組表示,地圖上全是障礙物。然后再創(chuàng)建一個用來表示每個格子是否被訪問過的二維數(shù)組。再創(chuàng)建一個用來表示路徑的棧結(jié)構(gòu)。

2、隨機選擇地圖上的一點,呃為了方便我初始點直接取的是左上角即坐標表示為0,0的格子。終點的話因為不涉及到交互就暫時沒有。

3、查找當(dāng)前格子的鄰接格(注意,這里的鄰接格子都是還未被訪問的,下面的代碼里有寫)。隨機選擇一個鄰接格子為下一格,當(dāng)前格移動到下一格,標記當(dāng)前格為已訪問,將當(dāng)前格壓入路徑棧中。一直重復(fù)第三步操作。

4、在第三步操作中,如果當(dāng)前格子不存在可訪問的鄰接格,則將棧頂?shù)脑貜棾?,即退回上一步操作,如果棧為空,則結(jié)束程序,打印結(jié)果。

附上結(jié)果和源碼,這是基于JAVA控制臺來寫的。

package maze;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Stack;
public class Maze 
{
 int len = 11; //迷宮長度
 int wid = 11; //迷宮寬度
 char wall = '■'; //代表墻
 char blank = '○'; //代表空地
 char[][] maze; //迷宮
 boolean[][] visit; //用來標記某一格是否被訪問過
 Node start = new Node(0,0); //開始節(jié)點
 Node exit = new Node(len - 1, wid - 1); //出口,其實現(xiàn)在也沒什么用,因為沒有交互只是生成了一個迷宮而已
 Node cur; //當(dāng)前格
 Node next; //下一格
 Stack<Node> path = new Stack<Node>(); //表示路徑的棧
 int[][] adj = {
  {0,2},{0,-2},{2,0},{-2,0}
 }; //用來計算鄰接格
 /**
 * 迷宮的格子類
 * @author Yan
 */
 class Node
 {
 int x,y;
 public Node(){}
 public Node(int x, int y)
 {
  this.x = x;
  this.y = y;
 }
 public String toString() {
  return "Node [x=" + x + ", y=" + y + "]";
 }
 }
 /**
 * 初始化,初始化迷宮參數(shù)
 */
 void init()
 {
 maze = new char[len][wid];
 visit = new boolean[len][wid];
 for(int i = 0; i < len; i++)
 {
  for(int j = 0; j < wid; j++)
  {
  maze[i][j] = wall;
  visit[i][j] = false;
  }
 }
 visit[start.x][start.y] = true;
 maze[start.x][start.y] = blank;
 cur = start; //將當(dāng)前格標記為開始格
 }
 /**
 * 打印結(jié)果
 */
 void printMaze()
 {
 for(int i = 0; i < len; i++)
 {
  for(int j = 0; j < wid; j++)
  {
  System.out.print(maze[i][j] + " ");
//  if(maze[i][j] == '○')
//  {
//   System.err.print(maze[i][j] + " ");
//  }
//  else
//  {
//   System.out.print(maze[i][j] + " ");
//  }
//  try {
//   Thread.sleep(100);
//  } catch (InterruptedException e) {
//   e.printStackTrace();
//  }
  }
  System.out.println();
 }
 System.out.println("==========================================");
 }
 /**
 * 開始制作迷宮
 */
 void makeMaze()
 {
 path.push(cur); //將當(dāng)前格壓入棧
 while(!path.empty())
 {
  Node[] adjs = notVisitedAdj(cur);//尋找未被訪問的鄰接格
  if(adjs.length == 0)
  {
  cur = path.pop();//如果該格子沒有可訪問的鄰接格,則跳回上一個格子
  continue;
  }
  next = adjs[new Random().nextInt(adjs.length)]; //隨機選取一個鄰接格
  int x = next.x;
  int y = next.y;
  //如果該節(jié)點被訪問過,則回到上一步繼續(xù)尋找
  if(visit[x][y])
  {
  cur = path.pop();
  }
  else//否則將當(dāng)前格壓入棧,標記當(dāng)前格為已訪問,并且在迷宮地圖上移除障礙物
  {
  path.push(next);
  visit[x][y] = true;
  maze[x][y] = blank;
  maze[(cur.x + x) / 2][(cur.y + y) / 2] = blank; //移除當(dāng)前格與下一個之間的墻壁
  cur = next;//當(dāng)前格等于下一格
  }
 }
 }
 /**
 * 判斷節(jié)點是否都被訪問
 * @param ns
 * @return
 */
 boolean allVisited(Node[] ns)
 {
 for(Node n : ns)
 {
  if(!visit[n.x][n.y])
  return false;
 }
 return true;
 }
 /**
 * 尋找可訪問的鄰接格,這里可以優(yōu)化,不用list
 * @param node
 * @return
 */
 Node[] notVisitedAdj(Node node)
 {
 List<Node> list = new ArrayList<Node>();
 for(int i = 0; i < adj.length; i++)
 {
  int x = node.x + adj[i][0];
  int y = node.y + adj[i][1];
  if( x >= 0 && x < len && y >= 0 && y < wid)
  {
  if(!visit[x][y])
   list.add(new Node(x,y));
  }
 }
 Node[] a = new Node[list.size()];
 for(int i = 0; i < list.size(); i++)
 {
  a[i] = list.get(i);
 }
 return a;
 }
 /**
 * 入口方法
 * @param args
 */
 public static void main(String[] args) {
 Maze m = new Maze();
 m.init();
 m.makeMaze();
 m.printMaze();
 }
}

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • Java解析XML格式數(shù)據(jù)的方法詳解

    Java解析XML格式數(shù)據(jù)的方法詳解

    這篇文章主要介紹了Java解析XML格式數(shù)據(jù)的方法,并展示了較為常用的Java dom來解析XML的例子,需要的朋友可以參考下
    2015-10-10
  • Java訪問權(quán)限控制的重要性深入講解

    Java訪問權(quán)限控制的重要性深入講解

    這篇文章主要給大家介紹了關(guān)于Java訪問權(quán)限控制的重要性的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Struts2開發(fā) 基本配置與類型轉(zhuǎn)換

    Struts2開發(fā) 基本配置與類型轉(zhuǎn)換

    本篇文章,小編將為大家介紹關(guān)于Struts2開發(fā) 基本配置與類型轉(zhuǎn)換,有需要的朋友可以參考一下
    2013-04-04
  • springboot3?redis?常用操作工具類詳解

    springboot3?redis?常用操作工具類詳解

    本文詳細介紹了Spring Boot 3中使用Spring Data Redis進行Redis操作的工具類實現(xiàn),該工具類涵蓋了字符串、哈希、列表、集合和有序集合等常用功能,感興趣的朋友一起看看吧
    2025-01-01
  • java實現(xiàn)簡單日期計算功能

    java實現(xiàn)簡單日期計算功能

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單日期計算功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Spring Boot2.0實現(xiàn)靜態(tài)資源版本控制詳解

    Spring Boot2.0實現(xiàn)靜態(tài)資源版本控制詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot2.0實現(xiàn)靜態(tài)資源版本控制的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • 基于Java中throw和throws的區(qū)別(詳解)

    基于Java中throw和throws的區(qū)別(詳解)

    下面小編就為大家?guī)硪黄贘ava中throw和throws的區(qū)別(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 簡單了解java數(shù)組傳遞方法

    簡單了解java數(shù)組傳遞方法

    這篇文章主要介紹了簡單了解java數(shù)組傳遞方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • maven打包web項目時同時打包為war和jar文件的方法

    maven打包web項目時同時打包為war和jar文件的方法

    本篇文章主要介紹了maven打包web項目時同時打包為war和jar文件的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 教你使用Java實現(xiàn)掃雷小游戲(最新完整版)

    教你使用Java實現(xiàn)掃雷小游戲(最新完整版)

    本文給大家介紹使用Java實現(xiàn)掃雷小游戲,本程序封裝了五個類,分別是主類GameWin類,繪制底層地圖和繪制頂層地圖的類MapBottom類和MapTop類,繪制底層數(shù)字的類BottomNum類,以及初始化地雷的BottomRay類和工具GameUtil類,用于存靜態(tài)參數(shù)和方法,感興趣的朋友一起看看吧
    2022-05-05

最新評論

达孜县| 长寿区| 隆回县| 常州市| 新建县| 宜丰县| 会泽县| 迭部县| 布尔津县| 汶川县| 黔江区| 嘉义县| 榆林市| 冕宁县| 蛟河市| 江口县| 宁蒗| 城口县| 恩平市| 怀安县| 津市市| 红桥区| 利川市| 和林格尔县| 吉隆县| 潜山县| 安阳市| 麻江县| 阿坝县| 长沙县| 荔浦县| 江陵县| 岳池县| 闽清县| 河池市| 深圳市| 翁牛特旗| 尤溪县| 同心县| 四川省| 彩票|