如何在java中绘制一个正方形?

时间:2015-02-03 23:51:24

标签: java

以下是我必须做的事情:

  

你要编写一个程序,将一个由#符号组成的正方形绘制到网格上。用户将输入左下角的大小(边长),x坐标和y坐标   网格上的方块作为命令行参数按顺序编程。

     

换句话说,这三个值将存储在程序开头的String数组args中,作为值args[0], args[1], and args[2]。您可以使用命令Integer.parseInt()将String转换为int。假设输入参数是有效的int。

例如,在DrJava的“交互”面板中:

在2 5 1 1上运行Que s ti 意味着我们想绘制一个边长为5的正方形,其左下角位于(1,1)位置。 此问题中的所有距离都是字符数。默认情况下,程序应该打印 平方到15x15网格上,但如果方形不合适,网格必须相应地延伸。

我试图分三个步骤构建我的程序。

  1. 编写代码以正确显示轴。

  2. 构建一个解决方案,其中方块始终适合15x15网格。

  3. 如何扩展程序,使其适用于较大的正方形或偏移太大以适应15x15网格的正方形。

  4. 到目前为止我的代码是:

    import java.util.Scanner;
    
    public class drawS {
        public static void main(String[] args) {
            Scanner ask = new Scanner(System.in);
    
            int length = ask.nextInt();
            int i;
            int r = 15;
            int xmax = 15;
            int ymax = 15;
    
            drowLine(length);
    
            System.out.println();
    
            if (i == 0 && j == 0) {
                System.out.print("+");
            }
            if (i == 0 && j <= ymax) {
                System.out.print("|");
            }
            if (j == ymax) {
                System.out.print("^");
            }
            for (int j = ymax; j >= 0; j--) {
                for (int i = 0; i <= xmax; i++) {
                    for (i = 0; i < length - 2; i++) {
                        drowEmptyLine(length);
                        System.out.println();
                    }
                    drowLine(length);
                }
    
                public static void drowLine ( int n){
                    for (int i = 0; i < n; i++) {
                        System.out.print("");
                    }
                }
    
                public static void drowEmptyLine ( int n){
                    System.out.print("");
                    for (int i = 0; i < n - 2; i++) {
                        System.out.print("# ");
                    }
                    System.out.print('#');
                }
            }
        }
    }
    

1 个答案:

答案 0 :(得分:0)

显然是在挖一点坟墓:-)

首先,我们必须获取CLI上给出的args,并将其转换为经过清理的int。

    public static void main(String[] args) {
        try {
            int size = Integer.parseInt(args[0]);
            int x = Integer.parseInt(args[1]);
            int y = Integer.parseInt(args[2]);

            if (size < 1 || size > 30) {
                System.out.println("Setting size to 5");
                size = 5;
            }

            if (x < 0 || x > 30) {
                System.out.println("Setting x to 2");
                x = 2;
            }

            if (y < 0 || y > 30) {
                System.out.println("Setting y to 2");
                y = 2;
            }

            int height = Math.max(y + size + 1, 15);
            int width = Math.max(x + size + 1, 15);
            drawSquare(height, width, size, x, y);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

要绘制正方形,我们必须自上而下,因为我们使用的是CLI。另外,也可以填满一个大的char[][]并将其打印在末尾-从上到下:-)。 部分代码中的整个“ -1”基本上是由于数组等基于0的事实。

    static void drawSquare(int height, int width, int size, int x, int y) {
        for (int line = height -1 ; line >= 0; line--) {
            drawline(line, size, x, y, width);
        }
    }

行可以分为空行,即代表正方形的顶部和底部,以及代表正方形内容的空行。

    static void drawline(int line, int size, int x, int y, int width) {
        if (line > y + size - 1 || line < y) {
            drawEmptyLine(width);
        } else if (line == y + size - 1 || line == y) {
            drawBorder(x, size, width);
        } else {
            drawContent(x, size, width);
        }
    }

空行很简单:

    static void drawEmptyLine(int width) {
        draw(emptyLine(width));
    }

    static char[] emptyLine(int width) {
        char[] dots = new char[width];
        Arrays.fill(dots, 0, width, '.');
        return dots;
    }

    static void draw(char[] chars) {
        StringBuffer sb = new StringBuffer(chars.length);
        sb.append(chars);
        System.out.println(sb);
    }

边界线和内容线只是用一些散列替换空行中的点:

    static void drawContent(int x, int size, int width) {
        char[] dots = emptyLine(width);
        dots[x] = '#';
        dots[x + size - 1] = '#';
        draw(dots);
    }

    static void drawBorder(int x, int size, int width) {
        char[] dots = emptyLine(width);
        Arrays.fill(dots, x, x + size, '#');
        draw(dots);
    }

就是这样。