2009-10-15 29 views
7

Tôi đã viết một số mã tạo mê cung cho tôi. Mê cung bao gồm các ô (n x n), mỗi ô có giá trị boolean để biểu diễn một bức tường (bắc, nam, đông tây).Làm thế nào tôi có thể ngừng in cả hai mặt của bức tường trong mê cung ascii của tôi?

Nó đang làm việc tốt, và tôi đã viết các chức năng dưới đây để in ra mê cung:

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

Tuy nhiên, do các tế bào phần tường tôi sản xuất một loại một đôi tường hành lang nhìn vào chức năng in của tôi:

+--++--++--++--++--++--++--++--++--++--+ 
|  ||     ||   | 
+--++ ++--++--++ ++--++--++ ++ ++--+ 
+--++ ++--++--++ ++--++--++ ++ ++--+ 
| ||   || ||   ||  | 
+ ++--++--++ ++ ++ ++--++--++--++ + 
+ ++--++--++ ++ ++ ++--++--++--++ + 
|  ||  || || ||  || || | 
+ ++ ++ ++--++ ++ ++ ++ ++ ++ + 
+ ++ ++ ++--++ ++ ++ ++ ++ ++ + 
| || || || ||   ||  || | 
+ ++ ++ ++ ++ ++--++--++--++--++ + 
+ ++ ++ ++ ++ ++--++--++--++--++ + 
| ||  ||   ||   || | 
+ ++--++--++--++--++--++ ++--++ ++ + 
+ ++--++--++--++--++--++ ++--++ ++ + 
| ||   ||   ||  || | 
+ ++--++ ++ ++ ++--++--++ ++--++ + 
+ ++--++ ++ ++ ++--++--++ ++--++ + 
|   || || ||  || ||  | 
+--++--++--++ ++ ++ ++ ++ ++ ++ + 
+--++--++--++ ++ ++ ++ ++ ++ ++ + 
|   || || || || ||  || | 
+ ++ ++--++ ++ ++ ++ ++--++--++ + 
+ ++ ++--++ ++ ++ ++ ++--++--++ + 
| || ||  ||  || || ||  | 
+ ++ ++ ++--++--++--++ ++ ++ ++--+ 
+ ++ ++ ++--++--++--++ ++ ++ ++--+ 
| ||      ||   | 
+--++--++--++--++--++--++--++--++--++--+ 

Làm thế nào tôi nên sửa đổi chức năng in của tôi vì vậy nó trông giống như:

+--+--+--+--+--+--+--+--+--+--+ 
|  |    |  | 
+--+ +--+--+ +--+--+ + +--+ 
| |  | |  |  | 
+ +--+--+ + + +--+--+--+ + 
|  |  | | |  | | | 
+ + + +--+ + + + + + + 
| | | | |  |  | | 
+ + + + + +--+--+--+--+ + 
| |  |  |  | | 
+ +--+--+--+--+--+ +--+ + + 
| |  |  |  | | 
+ +--+ + + +--+--+ +--+ + 
|  | | |  | |  | 
+--+--+--+ + + + + + + + 
|  | | | | |  | | 
+ + +--+ + + + +--+--+ + 
| | |  |  | | |  | 
+ + + +--+--+--+ + + +--+ 
| |     |  | 
+--+--+--+--+--+--+--+--+--+--+ 

tôi sợ Tôi sẽ phải đối mặt với một vấn đề tương tự khi tôi cuối cùng nhận được điểm tôi bắt đầu vẽ mê cung của tôi bằng cách sử dụng đồ họa thực tế hơn là ascii là tốt.

Làm cách nào để sửa đổi phương thức printMaze của tôi để nó đi từ ví dụ đầu tiên sang phương thức thứ hai?

Trong trường hợp bất kỳ ai quan tâm đến mã nguồn cho lớp của tôi để tạo các mã này là here.

Trả lời

5

Chỉ in các bức tường NORTH và WEST. Mã trên đường ...

Tôi đã thay đổi các bức tường để một EnumSet

public Set<Dir> walls = EnumSet.allOf(Dir.class); 

Vì vậy, bạn không cần phải thêm bất kỳ bức tường trong constructor của bạn:

public Cell(final int x, final int y) { 
    this.x = x; 
    this.y = y; 
    this.Visited = false; 
} 

Và để loại bỏ của bạn tường, sử dụng:

this.walls.remove(randDir); 
randomNeighbor.walls.remove(randDir.opposite()); 

Và sau đó mã in trông giống như:

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

(Lưu ý: Về mặt thẩm mỹ, tôi thích Chỉ đường và randomDirection. Nhưng đó chỉ là tôi ;-)

1

Vì các ô chia sẻ tường, bạn chỉ có thể bỏ qua một nửa giá trị. Nếu bạn bắt đầu ở ô phía tây bắc và chỉ kiểm tra các bức tường ở phía nam và phía đông, bạn có thể vẽ mê cung một vách. Các bức tường phía bắc và phía tây của mê cung sẽ phải hoàn toàn khép kín, tất nhiên.

Tuyên bố miễn trừ trách nhiệm: Tôi không thực sự nghĩ điều này thông qua, vì vậy nó có thể không hoạt động chút nào, nhưng điều đó nghe có vẻ hợp lý với tôi.

4

Bạn cần phải làm một cái gì đó như "không bao giờ in tường cho NORTH hoặc WEST trừ khi ô này nằm ở rìa mê cung" Bằng cách đó nếu có nghĩa vụ phải là một bức tường ở WEST cho ô này, ô phía tây đã in nó thành bức tường EAST riêng của nó.

Bạn cũng có thể phải nhập các cửa/mục nhập đặc biệt nếu chúng ở trên tường phía bắc hoặc phía tây.

+0

Nếu bạn sử dụng phương pháp này, bạn chỉ nên lưu trữ hai bức tường (tường phía bắc và phía tây) cho mỗi ô; các bức tường phía nam và phía đông chỉ là những bản sao dự phòng của các bức tường phía bắc và phía tây của các không gian liền kề, và dù sao thì cũng sẽ bị bỏ qua. Các ranh giới của mê cung được tự động tường. – RMorrisey

Các vấn đề liên quan