在java中绘制ASCII艺术

时间:2011-10-30 21:47:41

标签: java

嗨我想绘制一个正方形,其中*为大纲,点位于中间,大小范围为4-20。

*****
*...*
*...*
*...*
*****

我很难让高度与长度相等。 这是我的代码,请你帮忙..谢谢

class Main
{
  public static void printSquare( int size )
  {
    if ( size >= 20 && size >= 4) 
    { size = 4; }

    int squareLenght = size;
    int i = 1; 
    int p = 1;

    if ( p <= size )
    {
       int t = 1;

       while ( t <= squareLenght  )
       {
        System.out.print( "*" );
        t = t + 1;
       }
    }
       System.out.println();           //  Newline
       i = i + 1;


    while ( i <= squareLenght )
    {

       int d = 1; 
       int s = 1;


       if ( s < squareLenght  );{
       System.out.print( "*" ); 
       s = s + 1;
       }

       while ( d < size-1  )
       {
        System.out.print( "." );
        d = d + 1;

       }


       System.out.println( "*" );
        i = i + 1;


    }

    if ( p <= size )
    {
       int t = 1;

       while ( t <= squareLenght  )
       {
        System.out.print( "*" );
        t = t + 1;
       }
    }

    System.out.println();           
       i = i + 1;

}
}

3 个答案:

答案 0 :(得分:2)

由于此行,您在正文中打印了太多行(在边框之间):

while ( i <= squareLenght )

它应该是while ( i < squareLenght) while ( i <= squareLenght - 1 ),因为中间应该有2个边框和size - 2行组成高度。

此外,这没有任何意义:

if ( size >= 20 && size >= 4) 
{ size = 4; }

也许是你想要的范围:

if (size > 20) size = 20;
else if (size < 4) size = 4;

无论如何,你的代码对于不必要的if语句以及事物的整体结构有点混乱。 for循环也是一个好主意,你有while循环的初始化,条件和修饰符/增量。我不会为你改变它,因为它听起来像是家庭作业。

无论如何你想要把它搞定,想想你正在做的事情的实际结构和模式,因为它很简单:

  • 打印size个星号('*')和一个新行(顶部边框)
  • 循环size - 2次:(如果size为5,则边框之间有3条线,即size - 2
    • 打印'*'
    • 打印'.' size - 2
    • 打印'*'
    • 打印新行
  • 打印size个星号('*')和一个新行(底部边框)

编辑:我知道您已将问题标记为已回答,但我只是建议您使用printRepeatedly(char c, int count)之类的功能来减少您重复的循环次数(它只是一个for循环和一个打印语句。)

我刚刚重写了您的代码,我只需要printSquare中的11行代码,加上printRepeatedly中的2代码。如果你要重复代码,你应该几乎总是使用函数/方法。

答案 1 :(得分:1)

问题在于你的一个while循环中的条件。

while ( i <= squareLenght )

应该是:

while ( i < squareLenght )

答案 2 :(得分:1)

这是很多代码做你想做的事情; )

没有参加“代码混淆”比赛,有几种方法可以缩短它。

像这样:

public static void printSquare( int size ) {
    final int n = Math.max( 4, Math.min(20, size) );
    for (int y = 0; y < n; y++) {
        for (int x = 0; x < n; x++) {
            System.out.print( x == 0 || y == 0 || x == n - 1 || y == n - 1 ? "*" : "." );
        }
        System.out.println();
    }
}