我已经学会了如何使用 for 循环打印带有“*”符号的 2D 形状,这要归功于我一直在从事的一个项目,但我想提高一点。我想通过使用和组合 2D 形状来创建 3D 形状。
例如,打印 2D 正方形很容易,但我想打印 3D 立方体。与直角棱柱相同。我可以打印矩形,但无法打印矩形棱柱。
我知道在 2D 终端上打印 3D 东西不太可能,但通过在 2D 形状中添加一些其他形状,它至少可以看起来像 3D。
我找不到任何关于如何打印这些东西的解决方案或想法。看起来可以通过一些基本的 for 循环来解决,但无论我尝试什么,它都不起作用。
我的想法在这里:
在屏幕上打印一个正方形,然后在侧面和顶部放置 2 个不同的平行四边形,使其看起来像 3D 立方体。
同样的想法也适用于矩形棱柱。首先打印一个矩形,然后在其侧面和顶部打印 2 个不同的平行四边形,使其看起来像 3D。
首先我尝试了矩形棱柱。我无法在与顶部平行四边形具有相同长度和与矩形相同高度的一侧打印另一个平行四边形。
如果我能学会如何打印这个,我会尝试打印我能想到的其他 3D 形状。
我只能走到这一步,不能再走得更远了。我尝试过的在这里:
import java.util.Scanner;
public class Empty {
public static void rectangle() {
int a = 5;
int b = 8;
for (int i = 0; i < a; i++) {
if (i == 0) continue;
for (int j = 0; j < b; j++) {
if (j == 0 || j == (b - 1) || i == (a - 1)) {
System.out.print(" * ");
} else {
System.out.print(" ");
}
}
System.out.println();
}
}
public static void parallelogram() {
int i, j, k;
int height = 5;
int width = 8;
for (i = 0; i < height; i++) {
for (j = 0; j < height - i - 1; j++) {
System.out.print(" ");
}
for (k = 0; k < width; k++) {
if (i == 0 || i == height - 1 || k == 0 || k == width - 1) {
System.out.print(" * ");
} else {
System.out.print(" ");
}
}
System.out.println();
}
}
public static void main(String[] args) {
parallelogram();
rectangle();
}
}
此代码块提供了一个包含平行四边形和其下方的矩形的形状。我想要做的是使用“ * ”符号连接平行四边形的右上角和矩形的右下角。
它只是添加另一个平行四边形。这是输出:
* * * * * * * *
* *
* *
* *
* * * * * * * *
* *
* *
* *
* * * * * * * *
我想要的在这里:
我刚刚生成了盒子。 我无法将 Eclipse 2024-06 中控制台的结果复制到此答案。
我创建了一个二维字符数组并逐行构建了盒子。 当我完成创建 char 数组后,我将其“打印”在
StringBuilder
上。
要运行 Java 应用程序,您需要设置框的宽度、高度和深度。
这是完整的可运行代码。
public class ThreeDShapes {
public static void main(String[] args) {
System.out.print(createCube(8, 5, 5));
}
public static String createCube(int width, int height, int depth) {
int maxWidth = width + depth - 1;
int maxHeight = height + depth - 1;
char[][] ch = new char[maxHeight][maxWidth];
char asterisk = '*';
// return Arrays.deepToString(ch);
// create first row
int row = 0;
int start = maxWidth - width;
for (int col = start; col < maxWidth; col++) {
ch[row][col] = asterisk;
}
// create next rows
int end = start + width - 2;
int backEnd = maxWidth - 1;
start--;
for (row = 1; row <= depth - 2; row++) {
ch[row][start--] = asterisk;
ch[row][end--] = asterisk;
ch[row][backEnd] = asterisk;
}
// create top of box;
row = depth - 1;
addEdgeLine(ch, width, row, asterisk);
ch[row][backEnd--] = asterisk;
// create next rows
start = 0;
end = width - 1;
for (row = depth; row < (maxHeight - 1); row++) {
ch[row][start] = asterisk;
ch[row][end] = asterisk;
ch[row][backEnd--] = asterisk;
}
// create bottom of box
row = maxHeight - 1;
addEdgeLine(ch, width, row, asterisk);
return printCharArray(ch, maxWidth, maxHeight);
}
private static void addEdgeLine(char[][] ch, int width, int row,
char asterisk) {
for (int col = 0; col < width; col++) {
ch[row][col] = asterisk;
}
}
private static String printCharArray(char[][] ch, int maxWidth,
int maxHeight) {
StringBuilder builder = new StringBuilder();
for (int row = 0; row < maxHeight; row++) {
for (int col = 0; col < maxWidth; col++) {
builder.append(ch[row][col]);
if (col < (maxWidth - 1)) {
builder.append(" ");
}
}
builder.append(System.lineSeparator());
if (row < (maxHeight - 1)) {
builder.append(System.lineSeparator());
}
}
return builder.toString();
}
}