java - 给定随机尺寸,如何将某种图案打印到控制台?

标签 java

我在学校的计算机科学课上有一个家庭作业,其中我们必须打印出以下随机大小(宽度、高度)的图案。

..............................X..............................
..................................X..........................
.......................................X.....................
...........................................X.................
...............................................X.............
...................................................X.........
......................................................X......
........................................................X....
..........................................................X..
...........................................................X.
............................................................X
...........................................................X.
..........................................................X..
........................................................X....
......................................................X......
...................................................X.........
...............................................X.............
...........................................X.................
.......................................X.....................
..................................X..........................
..............................X..............................
..........................X..................................
.....................X.......................................
.................X...........................................
.............X...............................................
.........X...................................................
......X......................................................
....X........................................................
..X..........................................................
.X...........................................................
X............................................................
.X...........................................................
..X..........................................................
....X........................................................
......X......................................................
.........X...................................................
.............X...............................................
.................X...........................................
.....................X.......................................
..........................X..................................
..............................X..............................

考虑到大部分内容都是硬编码的,我几乎 100% 确定我的处理方式是错误的。我花了几个小时思考解决这个问题的不同方法。我试图找到一条曲线公式,但我终其一生都找不到一个完美拟合的公式。另外,即使我确实有一个公式,我也不知道如何在打印到控制台时实现它。我的代码当前仅打印固定尺寸的图案。

我的代码:

String pattern = "X";
String background = ".";
for(int i = 31; i < 61; i += 0) {
    String output = "";
    for(int j = 0; j < 61; j++) {
        if(j == i) {
            output += pattern;
        } else {
            output += background;
        }
    }
    output = output.substring(2);
    System.out.println(output);
    if(i == 35) i += 5;
    else if(i > 30 && i < 52) i += 4;
    else if(i == 52) i += 3;
    else if(i >= 55 && i < 59) i += 2;
    else i++;
}
for(int i = 59; i >= 31; i += 0) {
    String output = "";
    for(int j = 0; j < 61; j++) {
        if(j == i) {
            output += pattern;
        } else {
            output += background;
        }
    }
    output = output.substring(2);
    System.out.println(output);
    if(i <= 59 && i >= 57) i -= 2;
    else if(i == 55) i -= 3;
    else if(i <= 52 && i > 40) i -= 4;
    else if(i == 40) i -= 5;
    else i -= 4;
}
for(int i = 27; i >= 0; i += 0) {
    if(i <= 1) break;
    String output = "";
    for(int j = 0; j < 61; j++) {
        if(j == i) {
            output += pattern;
        } else {
            output += background;
        }
    }
    output = output.substring(2);
    System.out.println(output);
    if(i == 31) i -= 4;
    else if(i == 27) i -= 5;
    else if(i == 10) i -= 3;
    else if(i <= 7 && i >= 5) i -= 2; 
    else if(i <= 5) i--;
    else i -= 4;
}
for(int i = 3; i <= 31; i += 0) {
    String output = "";
    for(int j = 0; j < 61; j++) {
        if(j == i) {
            output += pattern;
        } else {
            output += background;
        }
    }
    output = output.substring(2);
    System.out.println(output);
    if(i >= 3 && i <= 5) i += 2;
    else if(i == 7) i += 3;
    else if(i >= 10 && i <= 18) i += 4;
    else if(i == 22) i += 5;
    else i += 4;
}

显然,我的方法是低效且不正确的。我不希望为我输入代码,但非常感谢一些为我指明正确方向的伪代码。

最佳答案

你展示的图案让我想起sinusoid

虽然我的正弦波打印机与原始输出不 100% 匹配,但它可以让您知道从哪里开始。您可以尝试旋转并连接多个parabolas或您想到的其他数学函数的图表,或者使用下面的示例来获得您需要的内容。

示例

以下代码片段依赖于 Math.sin 函数打印“X”(请注意,它使用以弧度表示的角度作为参数):

// Configurations
Integer DEFAULT_ROW_LEN = 61;
Integer NUMBER_OF_ROWS = 1000;
char DEFAULT_ROW_CONTENT = '.';
Double SPEED = 2.8;

// Preparing row of dots
StringBuilder row = new StringBuilder();
for (int i = 0; i < DEFAULT_ROW_LEN; i++) {
    row.append(DEFAULT_ROW_CONTENT);
}

for (int i = 0; i < NUMBER_OF_ROWS; i += SPEED) {

    // Loop progress
    double relativeProgress = i / DEFAULT_ROW_LEN.doubleValue();

    // In projection on a circle
    double circleProgress  = relativeProgress * Math.PI * 2;

    // Remember that sin goes from -1 to +1, but we need to fit the curve within 0 to +1
    double consoleProgress  = (Math.sin(circleProgress) + 1) / 2;

    // Exact index in the row to highlight
    int  exactPosition = (int) (consoleProgress * DEFAULT_ROW_LEN);
    row.setCharAt(exactPosition, 'X');

    // Print current progress and restore defaults
    System.out.println(row);
    row.setCharAt(exactPosition, DEFAULT_ROW_CONTENT);
}

输出

..............................X..............................
....................................X........................
..........................................X..................
................................................X............
....................................................X........
........................................................X....
...........................................................X.
............................................................X
............................................................X
...........................................................X.
.........................................................X...
.....................................................X.......
.................................................X...........
............................................X................
......................................X......................
................................X............................
.........................X...................................
...................X.........................................
..............X..............................................
.........X...................................................
.....X.......................................................
..X..........................................................
X............................................................
X............................................................
X............................................................
..X..........................................................
......X......................................................
..........X..................................................
...............X.............................................
.....................X.......................................
...........................X.................................
.................................X...........................

关于java - 给定随机尺寸,如何将某种图案打印到控制台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46714400/

相关文章:

Java Swing - 如何更改 JPanel 的 TitledBorder 上的字体大小?

java - maven settings.xml 中的存储库与pluginRepositories

java - 如何设置弹窗的画面自动适应横屏的长度

java - 某些同等条件不起作用

java - 从特定列启动表 excel apache poi

java - 如何在 Java 8 中将 Map<Shape, int[]> 转换为 Map<Shape, Set<Integer>>?

java - 使用 FileSystems.newFileSystem(URI uri, Map<String, ?> env) 时出错

java - netbeans环境变量

java - Spring Boot 2.5.1 服务不会在 System.exit(0) 上停止

java - 当我从 android 服务调用类时出现 NullPointerException