【问题标题】:Nested for-loop art嵌套的 for 循环艺术
【发布时间】:2014-12-02 13:32:58
【问题描述】:

所以我知道有类似的问题,但没有一个问题看起来如此“复杂”。 这是程序的预期输出。

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

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

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

【问题讨论】:

  • 所以包括他们?你甚至没有尝试打印它们。
  • 您的问题是您正在考虑以与制作头部和尾部相同的方式创建身体。但两者之间有根本的区别。头部和尾部(你猜对了)向外扩展。出于显而易见的原因,您不能对身体使用相同类型的算法或方法。试着想一些新的东西,而不是重复使用你已经想出的东西。
  • @asteri 我想我需要将 /\ 嵌套到产生 .s 的循环中
  • 仅供参考,此问题已在 Code Review Retro Rocket ASCII Art 中引用
  • @rolfl 谢谢。不幸的是,我仅限于本书的前 3 章。这是一个初级 CSE 课程。我希望我被允许使用更高级的代码。

标签: java algorithm for-loop ascii


【解决方案1】:

虽然这个问题已经得到解答;当我在学校看到它时,它让我觉得很痒,今天回到家后,我开始了自己的实施。以为我会在这里分享它,因为它可能对您有用。如果您想知道,我将所有内容附加到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());
}
}

结果是:

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

【讨论】:

    【解决方案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);但除此之外,它还有效。谢谢。
    • 不,不应该。在第一次迭代中,fb 为零,但您需要 2 个点。所以你需要2 - fb
    • 你说得对,我的 printDot() 方法设置不同。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多