Печать поезда с символами - PullRequest
3 голосов
/ 11 февраля 2020

Я пытаюсь найти хороший способ напечатать поезд в Java, используя символы.

     ++      +------
     ||      |+-+ | 
   /---------|| | | 
  + ========  +-+ | 
 _|--/~\------/~\-+ 
//// \_/      \_/   

Мой подход к решению до сих пор:

  • Использование массива String и сохранение построчно.

например

String[] array = new String[10];
array[0] = "...";
array[1] = "...";
...

Другая идея заключалась в использовании StringBuilder.

Есть ли лучший способ, чем использовать StringBuilder?

Ответы [ 8 ]

6 голосов
/ 11 февраля 2020

Вы можете существенно упростить способ создания массива:

final String[] train = {
    "     ++      +------",
    "     ||      |+-+ | ",
    "   /---------|| | | ",
    "  + ========  +-+ | ",
    " _|--/~\\------/~\\-+ ",
    "//// \\_/      \\_/   "

};

И затем либо печатать эту строку за строкой, либо String.join сначала.

2 голосов
/ 11 февраля 2020

Забудьте о stati c train, сделайте движущийся поезд:)

Java 11 +

package org.pta.train;

import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static final int FRAME_TIME = 300;
    public static final int CARS_COUNT = 10;

    public static final List<String> TRAIN = List.of(
            "            ".repeat(CARS_COUNT) + " . . . . . o o o o o      ",
            "___________ ".repeat(CARS_COUNT) + "_______    ____      o    ",
            "[] [] [] [] ".repeat(CARS_COUNT) + "[_____(__  ][]]_n_n__][.  ",
            "[_________]_".repeat(CARS_COUNT) + "[________]_|__|________)< ",
            "oo      oo '".repeat(CARS_COUNT) + " oo    oo 'oo 0000---oo\\_"
    );

    public static void main(String[] args) throws Exception {
        clearConsole();

        for (int i = 0; i < TRAIN.get(0).length(); i++) {
            printFrame(i);

            Thread.sleep(FRAME_TIME);

            clearConsole();
        }
    }

    private static void clearConsole() {
        System.out.print("\033[H\033[2J");
    }

    private static void printFrame(int i) {
        System.out.println(TRAIN.stream()
                .map(line -> line.substring(line.length() - i))
                .collect(Collectors.joining("\n")));
    }
}

PS: Могут быть проблемы с clearConsole(), если вы ' Запустим его из IDE, но он должен нормально работать с cmd:)

2 голосов
/ 11 февраля 2020

Для поддержки разделителей строк Windows и Linux (\r\n против \n), используя %n с printf:

System.out.printf("     ++      +------%n" + 
                  "     ||      |+-+ | %n" + 
                  "   /---------|| | | %n" + 
                  "  + ========  +-+ | %n" + 
                  " _|--/~\\------/~\\-+ %n" + 
                  "//// \\_/      \\_/  %n");

. Компилируется так же, как:

System.out.printf("     ++      +------%n     ||      |+-+ | %n   /---------|| | | %n  + ========  +-+ | %n _|--/~\\------/~\\-+ %n//// \\_/      \\_/  %n");

Выход

     ++      +------
     ||      |+-+ | 
   /---------|| | | 
  + ========  +-+ | 
 _|--/~\------/~\-+ 
//// \_/      \_/  
1 голос
/ 11 февраля 2020

В будущем Java будет содержать текстовые блоки (https://openjdk.java.net/jeps/355). Вы уже можете использовать их в JDK 13 в качестве функции предварительного просмотра.

Используя текстовые блоки, вы можете написать что-то вроде:

String train = """
                   ++      +------
                   ||      |+-+ | 
                 /---------|| | | 
                + ========  +-+ | 
               _|--/~\------/~\-+ 
              //// \_/      \_/
              """;
0 голосов
/ 11 февраля 2020

Вы можете сделать это просто как:

public class Main {
    public static void main(String[] args) {
        String train = "     ++      +------\n" + 
                       "     ||      |+-+ | \n" + 
                       "   /---------|| | |\n" + 
                       "  + ========  +-+ |\n" + 
                       " _|--/~\\------/~\\-+\n" + 
                       "//// \\_/      \\_/";
        System.out.println(train);
    }
}

Вывод:

     ++      +------
     ||      |+-+ | 
   /---------|| | |
  + ========  +-+ |
 _|--/~\------/~\-+
//// \_/      \_/

Существенные особенности этого решения:

  1. Это решение работает со всеми версиями Java.
  2. Не требует никакого массива, файла или коллекции.
0 голосов
/ 11 февраля 2020

Я не рекомендую использовать этот дизайн в коде, вместо этого для чистого решения я бы предложил создать текстовые файлы для ваших проектов, а затем просто прочитать их:

Файл дизайна

train design

Код, чтобы прочитать ваш дизайн

public static void printDesign(String designName) {
    Path filePath = Paths.get(String.format("D:\\%s.txt", designName));

    try (Stream<String> lines = Files.lines(filePath)) {
        lines.forEach(System.out::println);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

и затем вызвать ваш метод:

printDesign("train");

Это распечатать для меня :

design

0 голосов
/ 11 февраля 2020

Я бы поместил весь рисунок в текстовый файл. Таким образом, вам не нужно беспокоиться об экранировании специальных символов и прочего. Вы можете прочитать весь файл в List строк в одну строку, используя Files.readAllLines()

0 голосов
/ 11 февраля 2020

По сути, это предыдущий ответ. Но если вы хотите, чтобы он компилировался, вам нужно экранировать \.

Вот код:

public static void main(String[] args) {

    final String[] train = {
            "     ++      +------",
            "     ||      |+-+ | ",
            "   /---------|| | | ",
            "  + ========  +-+ | ",
            " _|--/~\\------/~\\-+ ",
            "//// \\_/      \\_/   "

    };

    System.out.println(String.join(System.lineSeparator(), train));
}

И это только Java 8 :)

...