2009-10-15 3 views
7

나를 위해 미로를 생성하는 코드를 작성했습니다. 미로는 (nxn) 셀로 구성되며, 각 셀은 벽 (북쪽, 남쪽, 동쪽 서쪽)을 나타내는 부울 값을가집니다. 세포의 주 벽이 내 인쇄 기능의 이중 벽 복도 모양의 종류를 생산하기 때문에, 그러나아스키 미로에서 벽면 양면 인쇄를 중단하려면 어떻게해야합니까?

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

북쪽 벽과 서쪽 벽만 인쇄하십시오. 그것의 방법에 코드 ...

내가이 각각 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()); 

그리고 인쇄 코드는 다음과 같습니다 : 벽은 사용

,536,
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

"이 셀이 미로의 가장자리에 있지 않으면 북쪽이나 서쪽 벽을 절대 인쇄하지 마십시오"그런 식으로해야합니다. 서쪽으로가는이 셀의 서쪽 벽에 있어야한다면 이미 EAST 벽으로 인쇄 할 것입니다.

북쪽 또는 서쪽 벽에있는 경우 특별한 문/입구가 필요할 수도 있습니다.

+0

이 방법을 사용하는 경우 각 셀에 대해 두 개의 벽 (북쪽 벽과 서쪽 벽) 만 저장해야합니다. 남쪽과 동쪽 벽은 단지 인접한 공간의 북쪽과 서쪽 벽의 여분 복사물이며, 어쨌든 무시됩니다. 미로의 경계는 자동으로 벽으로 둘러싸여 있습니다. – RMorrisey

관련 문제