Отрегулируйте высоту рисунка ASCII, чтобы разные рисунки печатались в одной строке

Я хочу напечатать все вагоны поезда в одну линию.

Вот фрагмент кода, который печатает графику поезда, которая состоит из различных подвижного состава.

    @Override
    public String toString() {
        StringBuilder trainGraphic = new StringBuilder();
        for (RollingStock rollingStock : train) {
            trainGraphic.append(rollingStock.toString());
        }
        return trainGraphic.toString();
    }

Самый простой способ исправить это - настроить количество линий для всех вагонов таким образом, чтобы у каждого ascii art было одинаковое количество строк. Тем не менее, я хотел бы решить это по-другому. Как я могу получить количество линий в ascii art, чтобы я мог отрегулировать высоту всех вагонов в соответствии с наибольшим количеством линий текущего поезда?

Вот код, который я использую для печати вагона (в данном случае DieselEngine):

        final String[] train = {
                "  _____________|____  ",
                " /_| ____________ |_\ ",
                "/   |____________|   \",
                "\                    /",
                " \__________________/ ",
                "  (O)(O)      (O)(O)  "
        };
        return String.join("
", train);

Например, этот универсал

         ++         
         ||         
_________||_________
|  ___ ___ ___ ___ |
|  |_| |_| |_| |_| |
|__________________|
|__________________|
   (O)        (O)   

выше, чем этот

|                  |
|                  |
|                  |
|__________________|
   (O)        (O)   

Вот

Всего 2 ответа


Мне нравится ваш проект, поэтому я, возможно, увлекся. По сути, вы делаете поезд двумерным массивом (массивом массивов), в котором каждый элемент train представляет собой вагон. Вагон здесь - это просто массив строк, который содержит дизайн.

Я сделал метод для изменения высоты каждого вагона поезда, названный getHeightedArray() (ужасное имя, я знаю).

Как правило, вы передаете необходимую высоту, а затем массив (вагон), который нужно изменить.

Используя некоторую математику, вы можете просто добавить пробел "" в первые несколько позиций (высот) вагона, а затем поместить все существующие линии дизайна ниже пустых строк.

TL; DR

Вы можете поместить несколько пустых линий над линиями дизайна для каждой группы вагонов, тем самым увеличивая ее печатаемую высоту, но ее фактическая высота такая же.

public static void main()
{
    String[] wagon1 = {
            "  _____________|____  ",
            " /_| ____________ |_\ ",
            "/   |____________|   \",
            "\                    /",
            " \__________________/ ",
            "  (O)(O)      (O)(O)  "
        };
    String[] wagon2 = {
            "         ++         ",
            "         ||         ",
            "_________||_________",
            "|  ___ ___ ___ ___ |",
            "|  |_| |_| |_| |_| |",
            "|__________________|",
            "|__________________|",
            "   (O)        (O)   "
        };

    String[][] train = {wagon1, wagon2, wagon1, wagon2};

    int max_height = 0;

    for(int i = 0; i < train.length; i++)
    {
        String[] wagon = train[i];
        if(wagon.length > max_height)
        {
            max_height = wagon.length;
        }
    }

    //printTrain(train, max_height);

    for(int i = 0; i < train.length; i++)
    {
        train[i] = getHeightedArray(max_height, train[i]);
        train[i] = getWidthedArray(train[i]);
    }

    printTrain(train, max_height);
}

public static String[] getHeightedArray(int heightNeeded, String[] wagon)
{
    String[] return_arr = new String[heightNeeded];
    for(int i = 0; i < heightNeeded-wagon.length; i++)
    {
        return_arr[i] = "";
    }
    for(int i = 0; i < wagon.length; i++)
    {
        return_arr[i+heightNeeded-wagon.length] = wagon[i];
    }
    return return_arr;
}

public static String[] getWidthedArray(String[] wagon)
{
    String[] return_wagon = new String[wagon.length];

    int max_width = 0;
    for(int i = 0; i < wagon.length; i++)
    {
        if(wagon[i].length() > max_width)
        {
            max_width = wagon[i].length();
        }
    }

    for(int i = 0; i < wagon.length; i++)
    {
        return_wagon[i] = wagon[i];
        for(int j = 0; j < max_width-wagon[i].length(); j++)
        {
            return_wagon[i] += " ";
        }
    }
    return return_wagon;
}

public static void printTrain(String[][] train, int max_height)
{
    int heightOfConnector = 2; // 1 means the connector is at the wheel level, so I chose 2
    for(int i = 0; i < max_height; i++) // Controls the height, 0 means the top
    {
        for(int j = 0; j < train.length; j++) // Controls the wagon index
        {
            if(heightOfConnector == max_height-i && j != train.length-1)
                System.out.print(train[j][i]+" ++ ");
            else
                System.out.print(train[j][i]+"    ");
        }
        System.out.println();
    }
}

Изменить 1: я тупица, поэтому предыдущая версия кода не может быть запущена из-за некоторых ошибок. Основной принцип такой же, как я уже говорил, но было несколько опечаток. Мои извенения.

getWidthedArray() гарантирует, что вагон имеет одинаковую ширину по всему телу, а если нет, вы просто добавляете пробелы в конце каждой из неровных линий.

printTrain() - вот где лежит магия. Вы печатаете верхний слой каждого вагона (разделенный несколькими пробелами), затем второй самый высокий слой и так далее. Если вы находитесь на уровне, указанном heightOfConnector , тогда вы печатаете ++ чтобы указать соединитель. Не стесняйтесь регулировать высоту разъема по пути.


Вы должны манипулировать String[] train перед тем, как присоединиться. Таким образом, вы можете получить

// height
train.length

// width
train[0].length()

Есть идеи?

10000