2009-10-15 5 views
7

Я написал код, который генерирует лабиринты для меня. Лабиринт состоит из (n x n) ячеек, каждая ячейка имеет булевое значение для представления стены (север, юг, восток-запад).Как я могу прекратить печатать обе стороны стены в моем лабиринте ascii?

Это работает отлично, и я написал функцию ниже, чтобы распечатать лабиринт:

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.

ответ

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("+"); 
} 

(Примечание: Эстетически, я предпочитаю направление и случайное направление. Но это только я ;-)

1

Поскольку ячейки разделяют стены, вы можете просто игнорировать половину значений. Если вы начнете в дальнем северо-западном полете и испытаете только стены на юг и восток, вы можете нарисовать одностенный лабиринт. Конечно, северные и западные стены лабиринта должны быть полностью закрыты.

Отказ от ответственности: Я действительно не думал об этом, поэтому он может вообще не работать, но это звучит разумно для меня.

4

Вам нужно сделать что-то вроде «никогда не печатайте стены для СЕВЕРНОГО или ЗАПАДНОГО, если эта ячейка не находится на краю лабиринта». Таким образом, если на этой ячейке должна быть стена на ВЕСТЕ, ячейка на запад уже напечатал его как свою стену ВОСТОКА.

Возможно, вам придется делать специальные/дверные замки, если они находятся на северной или западной стене.

+0

Если вы используете этот подход, вы должны хранить только две стены (северную и западную стены) для каждой ячейки; южные и восточные стены - это просто избыточные копии северных и западных стен соседних пространств, и в любом случае их будут игнорировать. Границы лабиринта автоматически стеной. – RMorrisey