我写了一些为我生成迷宫的代码。迷宫由(n x n)个单元组成,每个单元格都有一个布尔值来表示墙(北,南,东西)。
它工作正常,我写了下面的函数来打印出迷宫:
public static void printMaze(Cell[][] maze)
{
for(int i = 0; i < maze.length; i++)
{
for(int j = 0; j < maze[i].length; j++)
{
System.out.print((maze[i][j].walls.get(Dir.NORTH)) ? "+--+" : "+ +");
}
System.out.println();
for(int j = 0; j < maze[i].length; j++)
{
System.out.print((maze[i][j].walls.get(Dir.WEST)) ? "|" : " ");
System.out.print(" ");
System.out.print((maze[i][j].walls.get(Dir.EAST)) ? "|" : " ");
}
System.out.println();
for(int j = 0; j < maze[i].length; j++)
{
System.out.print((maze[i][j].walls.get(Dir.SOUTH)) ? "+--+" : "+ +");
}
System.out.println();
}
}
然而,由于细胞共用墙壁,我在打印功能中产生了一种双壁走廊外观:
+--++--++--++--++--++--++--++--++--++--+
| || || |
+--++ ++--++--++ ++--++--++ ++ ++--+
+--++ ++--++--++ ++--++--++ ++ ++--+
| || || || || |
+ ++--++--++ ++ ++ ++--++--++--++ +
+ ++--++--++ ++ ++ ++--++--++--++ +
| || || || || || || |
+ ++ ++ ++--++ ++ ++ ++ ++ ++ +
+ ++ ++ ++--++ ++ ++ ++ ++ ++ +
| || || || || || || |
+ ++ ++ ++ ++ ++--++--++--++--++ +
+ ++ ++ ++ ++ ++--++--++--++--++ +
| || || || || |
+ ++--++--++--++--++--++ ++--++ ++ +
+ ++--++--++--++--++--++ ++--++ ++ +
| || || || || |
+ ++--++ ++ ++ ++--++--++ ++--++ +
+ ++--++ ++ ++ ++--++--++ ++--++ +
| || || || || || |
+--++--++--++ ++ ++ ++ ++ ++ ++ +
+--++--++--++ ++ ++ ++ ++ ++ ++ +
| || || || || || || |
+ ++ ++--++ ++ ++ ++ ++--++--++ +
+ ++ ++--++ ++ ++ ++ ++--++--++ +
| || || || || || || |
+ ++ ++ ++--++--++--++ ++ ++ ++--+
+ ++ ++ ++--++--++--++ ++ ++ ++--+
| || || |
+--++--++--++--++--++--++--++--++--++--+
我应该如何修改我的打印功能,如下所示:
+--+--+--+--+--+--+--+--+--+--+
| | | |
+--+ +--+--+ +--+--+ + +--+
| | | | | |
+ +--+--+ + + +--+--+--+ +
| | | | | | | |
+ + + +--+ + + + + + +
| | | | | | | |
+ + + + + +--+--+--+--+ +
| | | | | |
+ +--+--+--+--+--+ +--+ + +
| | | | | |
+ +--+ + + +--+--+ +--+ +
| | | | | | |
+--+--+--+ + + + + + + +
| | | | | | | |
+ + +--+ + + + +--+--+ +
| | | | | | | |
+ + + +--+--+--+ + + +--+
| | | |
+--+--+--+--+--+--+--+--+--+--+
我担心当我最终开始使用实际图形而不是ascii来绘制迷宫时,我将面临类似的问题。
如何修改printMaze方法,使其从第一个示例转到第二个示例?
如果有人感兴趣,我的课程的源代码是here。
答案 0 :(得分:5)
仅打印NORTH和WEST墙。代码正在......
我将墙更改为EnumSet
public Set<Dir> walls = EnumSet.allOf(Dir.class);
因此,您无需在构造函数中添加任何墙:
public Cell(final int x, final int y) {
this.x = x;
this.y = y;
this.Visited = false;
}
要移除墙壁,请使用:
this.walls.remove(randDir);
randomNeighbor.walls.remove(randDir.opposite());
然后打印代码如下:
public static void printMaze(final Cell[][] maze) {
for (int r = 0; r < maze.length; r++) {
final Cell[] row = maze[r];
printTop(row);
printMiddle(row);
if (r == maze.length - 1) {
printBottom(row);
}
}
}
private static void printBottom(final Cell[] row) {
for (final Cell cell : row) {
System.out.print(cell.walls.contains(Dir.SOUTH) ? "+--" : "+ ");
}
System.out.println("+");
}
private static void printMiddle(final Cell[] row) {
for (int c = 0; c < row.length; c++) {
final Cell cell = row[c];
System.out.print(cell.walls.contains(Dir.WEST) ? "| " : " ");
if (c == row.length - 1) {
System.out.println(cell.walls.contains(Dir.EAST) ? "|" : " ");
}
}
}
private static void printTop(final Cell[] row) {
for (final Cell cell : row) {
System.out.print(cell.walls.contains(Dir.NORTH) ? "+--" : "+ ");
}
System.out.println("+");
}
(注意:在美学上,我更喜欢Direction和randomDirection。但那只是我; - )
答案 1 :(得分:4)
你需要做一些事情,比如“永远不要打印NORTH或WEST的墙壁,除非这个单元位于迷宫的边缘”这样的话,如果这个单元格的WEST应该是一堵墙,那么西边的单元格将会是已经把它打印成了自己的EAST墙。
如果它们位于北墙或西墙,您可能需要特殊的门/入口。
答案 2 :(得分:1)
由于细胞共享墙壁,您可以忽略一半的值。如果你从远西北角开始,只测试南边和东边的墙壁,你可以画出单壁迷宫。当然,迷宫的北墙和西墙必须完全封闭。
免责声明:我并没有真正想到这一点,所以它可能根本不起作用,但这对我来说听起来很合理。