2009-10-15 3 views
7

私は私のために迷路を生成するいくつかのコードを書いた。迷路は(n×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(); 
     } 
    } 

しかし、細胞は、私は私の印刷機能では二重壁の廊下の外観のようなものを作る壁を共有するため:

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

、それがどのように見えるので、どのように私は私の印刷機能を変更する必要があります:私は恐れて

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

私も同様の問題に直面するつもりですが、実際にはアスキーではなく実際のグラフィックを使用して迷路を描き始めるということになります。

printMazeメソッドを最初の例から2番目の例に変更するにはどうすればよいですか?

誰かが興味がある場合は、これらを生成するための私のクラスのソースコードはhereです。

答えて

5

北と西の壁だけを印刷します。

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

そして、あなたを削除するには:コードの途中で...

は、私はあなたがあなたのコンストラクタ内の任意の壁を追加する必要はありませんEnumSetの

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

に壁を変更しました

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の壁として印刷しています。

北または西の壁にある場合は、特別なケースのドア/エントリが必要な場合があります。

+0

この方法を使用する場合は、各セルに2つの壁(北と西の壁)のみを保存する必要があります。南と東の壁は隣接する空間の北と西の壁の冗長なコピーであり、とにかく無視されます。迷路の境界線は自動的に囲まれています。 – RMorrisey

関連する問題