2

我基于 Prim 算法的迷宫生成器程序:

该算法是 Prim 算法的随机版本。

  1. 从一个充满墙壁的网格开始。
  2. 选择一个单元格,将其标记为迷宫的一部分。将单元格的墙壁添加到墙壁列表中。
  3. 虽然列表中有墙:
    1. 从列表中随机选择一面墙。如果对面的牢房还没有进入迷宫:
      1. 使墙壁成为通道,并将另一侧的单元格标记为迷宫的一部分。
      2. 将单元格的相邻墙添加到墙列表中。
    2. 如果对面的牢房已经在迷宫中,则将墙从列表中删除。

(来自维基百科

我已经理解了算法,我只是停留在这一部分:“知道相邻单元是否构成迷宫的一部分”(这意味着,首先获取相邻单元)因为单元实际上是树的节点(迷宫,一个二维单元阵列)和墙壁是这些节点之间的边缘,我认为有必要用一对点(x,y)来识别每个墙壁。我如何知道两个 Cell 是否通过墙连接?(请记住,每个单元格有 4 个墙)

我考虑过使用 equals() 函数。我只是要求提供伪代码或您的最佳解释,以使事情变得更容易。

我的 Wall 类具有三个属性: bool isWall(确定它是墙还是单元格之间的通道);诠释 x; int y(标识符)。

如果您认为我需要更多属性,我会很高兴知道。我知道有一个简单的方法,我只是卡住了;)谢谢你的时间!

4

2 回答 2

1

我无法评论以添加到讨论中,所以我只是回复一个答案。基本上,Lee Meandor 的想法是正确的。

在此处输入图像描述

这是细胞与壁与细胞关系的基本结构。

所以一个细胞有一个南北西和东墙。

在连接它们的两个相邻单元之间有一堵墙。

Class Cell{

   Wall North;
   Wall South;
   Wall East;
   Wall West;

}


Class Wall{
    // You can store the cells that are connected to the wall but it's not necessary.
    Cell 1;
    Cell 2;

    bool isUP;
}

要记住的重要一点是细胞指向正确的墙壁。

这是一些重要的逻辑工作:)。

如果您需要帮助,请发表评论。

于 2013-08-14T22:39:20.920 回答
1

让我们看看我们可以定义什么:

 Cell[][] maze; // prepopulate with cells in a rectangular fashion. 
                // Populate adjacent cells with walls.
 {
     maze = new Cell[m][n];
     for (i = 0 .. m) {
         for (j = 0 .. n) {
             cell = maze[i][j] = new Cell(m, n);

             // fix top wall
             if (i == 0) { // first row
                 cell.wall[0] = new Wall();
                 cell.wall[0].setIsEdge();
             } else {
                 cell.wall[0] = maze[i-1][j].wall[2]; // my up is last row's down
             }

             // fix bottom wall
             cell.wall[2] = new Wall();
             if (i == m-1) { // last row
                 cell.wall[2].setIsEdge();
             }

             // fix left wall
             if (j == 0) { // leftmost column
                 cell.wall[3] = new Wall();
                 cell.wall[3].setIsEdge();
             } else {
                 cell.wall[3] = maze[i][j-1].wall[1]; // my left is last col's right
             }

             // fix right wall
             cell.wall[1] = new Wall();
             if (j == n-1) { // rightmost column
                 cell.wall[1].setIsEdge();
             }
         }
     }
 }

 List walls = new List();

 class Cell {
     Wall[] walls = new Wall[4]; // 0 is up, 1 is right, 2 is down, 3 is left (count clockwise)
     boolean isInMaze = false;
     int x;
     int y;
     Cell(col, row) {
         x = col;
         y = row;
     }
 }

 class Wall {
     boolean isOpen = false; // open walls are passages
     boolean isEdge = false; // edges have nothing on the other side.
     Cell[] cells = new Cell[2];
 }

 Cell aCell = maze[randomx][randomy]; // make sure x,y in bounds
 initializeCellInMaze(aCell, null);

 while (!walls.isEmpty()) {
    aWall = walls.get(randomWall); // in range
    if (!(aWall.cell[0].isInMaze && aWall.cell[1].isInMaze)) {
        // opposite cell NOT in maze
        wall.setIsOpen();
        Cell otherCell;
        if (wall.cell[0].isInMaze) {
            otherCell = wall.cell[1];
        } else {
            otherCell = wall.cell[0];
        }
        initializeCellInMaze(otherCell, aWall);
    }
    walls.remove(aWall); // or use index
 }

 initializeCellInMaze(cell, wallToSkip) {
     cell.setIsInMaze();
     for (i = 0 .. 3) if (cell.wall[i] != wallToSkip) walls.add(cell.wall[i]);
 }
于 2013-08-14T22:44:33.813 回答