用字符打印火车
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
),使用 %n
和 printf
:
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 中正常工作 :)
我正在尝试找到一种使用字符在 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
),使用 %n
和 printf
:
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 中正常工作 :)