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メソッドを変更して、最初の例から2番目の例に変更するにはどうすればよいですか?

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

4

3 に答える 3

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が好きです。しかし、それは私だけです;-)

于 2009-10-15T23:09:51.327 に答える
4

「このセルが迷路の端にない限り、NORTHまたはWESTの壁を印刷しない」などの操作を行う必要があります。そうすれば、このセルのWESTに壁があるはずの場合、西のセルはすでに印刷されています。それ自身のEAST壁として。

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

于 2009-10-15T22:53:29.377 に答える
1

セルは壁を共有しているため、値の半分を無視することができます。北西のセルから始めて、南と東の壁だけをテストすると、単壁の迷路を描くことができます。もちろん、迷路の北と西の壁は完全に閉じている必要があります。

免責事項:私はこれを実際には考えていなかったので、まったく機能しない可能性がありますが、私には合理的に聞こえます。

于 2009-10-15T22:52:30.783 に答える