The art of nested loop

So, I know there are similar questions, but none of them seem so "difficult". This is the intended output of the program.

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

      

This is my for loop to build the body

    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);
        }
    }

      

As you can see, I am missing the descending periods.

+3


source to share


2 answers


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(".");
    }
}

      



+2


source


Although this question has already been answered; it is rather ticklish, my imagination when I saw him at school and when I got home I started my own realization. Thought I would share it here as it might be useful to you. In case you're wondering, I've added everything in StringBuilder

to avoid potential error in work System.out

used by other processes and smoothing art. So just print everything at once.

/**
 * 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 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 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());
}
}

      



The result was:

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

      

+2


source







All Articles