Untitled

mail@pastecode.io avatar
unknown
java
2 years ago
2.7 kB
4
Indexable
Never
import java.util.Scanner;

public class Main {

    // Метод для печати символа N раз (в 1 строку)
    public static void drawCharacter(char character, int times) {
        for (int i = 1; i <= times; i++) {
            System.out.print(character);
        }
    }

    // Метод для отрисовки горизонтальной границы рисунка
    public static void drawHorizontalBound(int effectiveWidth, boolean breakLine) {
        drawCharacter(' ', 1);
        drawCharacter('-', effectiveWidth);
        drawCharacter(' ', 1);
        if (breakLine) {
            System.out.println();
        }
    }

    // Метод для вычисления ЭФФЕКТИВНОЙ высоты рисунка (то есть не включающей
    // верхнюю и нижнюю границы)
    public static int calculateHeight(int effectiveWidth) {
        int height = 1;
        int decreaseNumber = 0;
        for (int i = effectiveWidth - 1; i > 0; i -= decreaseNumber) {
            if (i - decreaseNumber <= 0) {
                return height;
            } else {
                height += 2;
            }
            decreaseNumber++;
        }
        return height;
    }

    public static void drawLine(int effectiveWidth, int startIndex, int count) {
        drawCharacter('|', 1);
        drawCharacter(' ', startIndex);
        // Обрубание символов если сумма отступа и их количества больше допустимой ширины
        if (count + startIndex > effectiveWidth) {
            while (count + startIndex > effectiveWidth) {
                count--;
            }
        }
        drawCharacter('!', count);
        drawCharacter(' ', effectiveWidth - startIndex - count);
        drawCharacter('|', 1);
        System.out.println();
    }

    public static void drawPicture(int srcWidth) {
        int effectiveWidth = srcWidth - 2;
        int height = calculateHeight(effectiveWidth);
        drawHorizontalBound(effectiveWidth, true);
        int i;
        int currOffset = 0;
        for (i = 1; i <= (height-1)/2; i++) {
            drawLine(effectiveWidth, currOffset, i);
            currOffset += i;
        }
        for (i = (height-1)/2; i >= 0; i--){
            drawLine(effectiveWidth, currOffset, i + 1);
            currOffset -= i;
        }
        drawHorizontalBound(effectiveWidth, true);
    }

    public static void main(String[] args) {
        System.out.print("Введите w: ");
        Scanner scanner = new Scanner(System.in);
        int w = scanner.nextInt();
        System.out.println();
        drawPicture(w);
    }
}