Как я могу перестать печатать обе стороны стены в моем лабиринте ascii?

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

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

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, чтобы он перешел от первого примера ко второму?

Если кого-то интересует, исходный код моего класса для их создания находится здесь.


person Scorcher84    schedule 15.10.2009    source источник


Ответы (3)


Распечатайте только СЕВЕРНУЮ и ЗАПАДНУЮ стены. Код уже готов ...

Я изменил стены на 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. Но это только я ;-)

person toolkit    schedule 15.10.2009

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

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

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

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

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

person mooware    schedule 15.10.2009