用字符打印火车

Print train with characters

我正在尝试找到一种使用字符在 Java 中打印火车的好方法。

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

目前我的解决方法:

例如

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

另一个想法是使用 StringBuilder

有没有比使用 StringBuilder 更好的方法?

您可以大大简化创建数组的方式:

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

};

然后要么逐行打印,要么先String.join

将来,Java 将包含文本块 (https://openjdk.java.net/jeps/355)。您已经可以在 JDK 13 中将它们用作预览功能。

使用文本块,您可以编写如下内容:

String train = """
                   ++      +------
                   ||      |+-+ | 
                 /---------|| | | 
                + ========  +-+ | 
               _|--/~\------/~\-+ 
              //// \_/      \_/
              """;

基本上,这是上一个答案。但是如果你想让它编译你需要转义\

代码如下:

public static void main(String[] args) {

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

    };

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

这只是 Java 8 :)

我会把整幅画放到一个文本文件中。这样你就不需要为转义特殊字符和东西而烦恼。您可以使用 Files.readAllLines()

在一行中将整个文件读入 List 个字符串

同时支持 Windows 和 Linux 行分隔符(\r\n vs \n),使用 %nprintf:

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

它将编译为:

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

输出

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

我不建议在代码中使用这种设计,为了获得干净的解决方案,我建议为您的设计创建 txt 文件,然后阅读它们:

设计文件

读取您的设计的代码

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");

它为我打印:

忘记静态火车,做移动火车:)

Java11+

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("3[H3[2J");
    }

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

P.S.: 如果你 运行 它形成 IDE,clearConsole() 可能会有问题,但它应该可以在 cmd 中正常工作 :)