嵌套循环艺术

3

我知道有类似的问题,但他们都不够“复杂”。 这是程序的期望输出。

     /**\
    //**\\
   ///**\\\
  ////**\\\\
 /////**\\\\\
+=*=*=*=*=*=*+
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
+=*=*=*=*=*=*+
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
+=*=*=*=*=*=*+
    /**\
   //**\\
  ///**\\\
 ////**\\\\
/////**\\\\\

这是我的for循环来构建主体。
    divider();
    for (int fb=0;fb<=2;fb++) {
        System.out.print("|");
        System.out.print(fSlash+bSlash);
            for (int i=0;i<=fb*2;i++) {
                System.out.print(fSlash+bSlash);
            }
    }
    for (int fb=2;fb>=0;fb--) {
        System.out.print("|");
        System.out.print(bSlash+fSlash);
            for (int i=fb;i<=fb*3;i++) {
                System.out.print(bSlash+fSlash);
        }
    }

正如您所看到的,我缺少下降的周期。


所以要包含它们吗?你甚至还没有尝试打印它们。 - Scott Hunter
你的问题在于你想以与头部和尾部相同的方式创建身体。但是两者之间存在根本性的区别。头部和尾部(你已经做对了)向外扩展。由于明显的原因,你不能使用相同类型的算法或方法来处理身体。试着想出一些新的东西,而不是重复利用你已经想出的东西。 - asteri
@asteri 我认为我需要将 /\ 嵌套到生成 .s 的循环中。 - EwokHugz
FYI,此问题已在Code Review上被引用Retro Rocket ASCII Art - rolfl
@rolfl 谢谢。不幸的是,我只能使用书的前三章。这是一门初级的CSE课程。我希望我被允许使用更高级的代码。 - EwokHugz
此外,供您参考,这个问题已经激发了一个高尔夫挑战。请访问此链接:http://codegolf.stackexchange.com/questions/38622/the-retro-rocket - rolfl
2个回答

2
public static void topCenter(String fSlash, String bSlash) {
    divider();
    for(int fb = 0; fb <= 2; fb++) {
        System.out.print("|");
        for(int repeat = 0; repeat < 2; repeat++) {
            printDots(2 - fb);
            for(int i = 0; i <= fb; i++) {
                System.out.print(fSlash + bSlash);
            }
            printDots(2 - fb);
        }
        System.out.println("|");
    }
    for(int fb = 2; fb >= 0; fb--) {
        System.out.print("|");
        for(int repeat = 0; repeat < 2; repeat++) {
            printDots(2 - fb);
            for(int i = fb; i <= fb * 2; i++) {
                System.out.print(bSlash + fSlash);
            }
            printDots(2 - fb);
        }
        System.out.println("|");
    }
    //bottomCenter(fSlash, bSlash);
}

public static void printDots(final int count) {
    for(int i = 0; i < count; i++) {
        System.out.print(".");
    }
}

应该打印printDots(fb); 但除此之外它是有效的。谢谢。 - EwokHugz
不应该。在第一次迭代中,fb 是零,但你需要两个点。所以你需要 2 - fb - Jason
你说得对,我的printDot()方法设置有所不同。谢谢。 - EwokHugz

2

虽然这个问题已经被回答了,但是当我在学校看到它后,它引起了我的兴趣。今天回家后,我开始进行自己的实现。我想在这里分享一下,因为它可能对你有用。如果你想知道,我将所有东西都附加到StringBuilder上,以避免潜在的错误,即System.out打印流被其他进程使用并破坏图像。因此,只需一次性打印所有内容。

/**
 * Created by Thomas on 08/10/2014 at 4:53 PM.
 *
 * @author Thomas
 * @since X.X.X
 */
public class CharacterArt {

/**
 * Makes a triangle with astrix's along the center, and slashes on the sides.
 *
 * @param height          The height of the triangle, total width is determined off this.
 * @param middleWidth     The width of the characters in the middle of the triangle.
 * @param sideBufferExtra How much buffering to put on each side of the triangle, this is used
 *                        (in the OP's example) for the extra spacing required to be flush with
 *                        the rest of the piece.
 * @return The triangle with the passed parameters.
 */
public static String makeACenteredTriangle(int height, int middleWidth, int sideBufferExtra) {
    StringBuilder builder = new StringBuilder();
    for (int row = 1; row <= height; row++) {

        //Left buffer
        for (int b = 1; b <= height - row + sideBufferExtra; b++)
            builder.append(' ');

        //Left slashes
        for (int slash = 1; slash <= row; slash++)
            builder.append('/');

        //Middle column
        for (int mid = 1; mid <= middleWidth; mid++)
            builder.append('*');

        //Right slashes
        for (int slash = 1; slash <= row; slash++)
            builder.append('\\');

        //Right buffer
        for (int b = 1; b <= height - row + sideBufferExtra; b++)
            builder.append(' ');

        builder.append('\n');
    }
    return builder.toString();
}

/**
 * Creates a strip of a diamond ascii art - piece.
 *
 * @param sideLength     Length of each side of the diamonds.
 * @param numberDiamonds Number of diamonds to append to the line.
 * @param rowNumber      Which row of the diamond to be generated. Starting at row index 1 and
 *                       going up to sideLength * 2
 * @return The row of the diamond
 */
public static String makeADiamondsStrip(int sideLength, int numberDiamonds, int rowNumber) {
    StringBuilder builder = new StringBuilder();

    //For the number of diamonds
    for (int number = 1; number <= numberDiamonds; number++) {

        //Left buffering
        if (rowNumber <= sideLength)
            for (int b = 1; b <= sideLength - rowNumber; b++) builder.append('.');
        else
            for (int b = 1; b <= rowNumber - sideLength - 1; b++) builder.append('.');

        //Slashes
        if (rowNumber <= sideLength)
            for (int s = 1; s <= rowNumber; s++)
                builder.append("/\\");
        else
            for (int s = 1; s <= rowNumber - 2 * (rowNumber - sideLength) + 1; s++)
                builder.append("\\/");

        //Right buffering
        if (rowNumber <= sideLength)
            for (int b = 1; b <= sideLength - rowNumber; b++) builder.append('.');
        else
            for (int b = 1; b <= rowNumber - sideLength - 1; b++) builder.append('.');
    }
    return builder.toString();
}

/**
 * Not working the best, though gets the basic job done.
 *
 * @param totalWidth  Total width of the divider, must be an even number as of now.
 * @param middleWidth Width of the middle characters in the divider, as of now must be an even
 *                    number.
 * @param sideWidth   Width of the '+' characters on each side of the divider.
 * @return The divider.
 */
public static String makeADivider(int totalWidth, int middleWidth, int sideWidth) {
    StringBuilder builder = new StringBuilder();

    int remainingEachSide = (totalWidth - middleWidth - 2 * sideWidth) / 2;

    for (int i = 0; i < sideWidth; i++) builder.append('+');

    //Left
    for (int left = 1; left <= remainingEachSide; left++)
        builder.append(left % 2 == 1 ? '=' : '*');
    //Middle
    for (int middle = 1; middle <= middleWidth; middle++) builder.append('*');

    //Right
    for (int right = 1; right <= remainingEachSide; right++)
        builder.append(right % 2 == 1 ? '=' : '*');

    for (int i = 0; i < sideWidth; i++) builder.append('+');


    return builder.toString();
}

public static void main(String[] args) {

    /* Initialise our StringBuilder. */
    StringBuilder builder = new StringBuilder();

    /* Append the first triangle to the top, with a height of 5, middle column width of 2 and a side-padding of 1. */
    builder.append(makeACenteredTriangle(5, 2, 1));

    /* Append the first divider, with a width of 14 having a total middle column width of 2, and 1 '+' at each end. */
    builder.append(makeADivider(14, 2, 1)).append('\n');

    /*
        Append the first section of the main body of the art. This is done by going
        through row 1 to 6 of a diamond with side-lengths of 3.  The end characters are
        appended for each row. In conclusion the diamond - parts generated are that of one
        with a side-length of 3, and having 2 of them.
    */
    for (int i = 1; i <= 6; i++)
        builder.append('|').append(makeADiamondsStrip(3, 2, i)).append('|').append('\n');

    /* Append another divider, the same as the last. */
    builder.append(makeADivider(14, 2, 1)).append('\n');

    /* Create the next section of the body, this time with the bottom half then the top half of the diamonds; in that order. */
    for (int i = 4; i <= 6; i++)
        builder.append('|').append(makeADiamondsStrip(3, 2, i)).append('|').append('\n');
    for (int i = 1; i <= 3; i++)
        builder.append('|').append(makeADiamondsStrip(3, 2, i)).append('|').append('\n');

    /* Append the last divider. */
    builder.append(makeADivider(14, 2, 1)).append('\n');

    /* Append another triangle, this one being the same as the first. */
    builder.append(makeACenteredTriangle(5, 2, 1));

    /* Print out the final ASCII art. */
    System.out.println(builder.toString());
}
}

结果是:

     /**\     
    //**\\    
   ///**\\\   
  ////**\\\\  
 /////**\\\\\ 
+=*=*=**=*=*=+
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
+=*=*=**=*=*=+
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
+=*=*=**=*=*=+
     /**\     
    //**\\    
   ///**\\\   
  ////**\\\\  
 /////**\\\\\ 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接