嵌套的循环艺术

时间:2014-10-08 00:56:01

标签: java algorithm for-loop ascii

所以我知道有类似的问题,但它们似乎都没有这么复杂。" 这是该计划的预期输出。

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

这是我构建身体的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);
        }
    }

如您所见,我错过了下降期。

2 个答案:

答案 0 :(得分: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(".");
    }
}

答案 1 :(得分: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());
}
}

结果是:

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