import javax.swing.*;
import javax.swing.text.View;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

// Требования к лабораторной работе
//  - Не использовать магические числа
//        drawRect(123, 123, 12, 15); - плохо
//        drawRect(HOUSE_POS_X, HOUSE_POS_Y, HOUSE_WIDTH, HOUSE_HEIGHT); - хорошо
//  - Выносить рисовку отдельных объектов в отдельные методы
//      - Рисовать всё внутри paintComponent - плохо.
//      - Желательно создавать отдельные методы для рисования.
//          public void drawHouse(Graphics g,
//              int posX, int posY, int width, int height, Color color);
//   - Для получения максимального балла по задаче нужна анимация.

class Viewport extends JPanel {
    // Размеры рисуемой области
    private final int VIEWPORT_WIDTH = 640;
    private final int VIEWPORT_HEIGHT = 480;

    // Позиция облака
    private int cloudPositionX = 10;
    private int cloudPositionY = 30;

    // Размеры облака
    private int cloudSizeX = 200;
    private int cloudSizeY = 80;

    // Направление движения облака (1 - вправо, -1 - влево).
    private int cloudMovementDir = 1;

    public Viewport() {
        // Фоновый цвет и размеры рисуемой области
        setBackground(new Color(215, 255, 252));
        setPreferredSize(new Dimension(VIEWPORT_WIDTH, VIEWPORT_HEIGHT));
    }

    public void update(float delta) {
        // Скорость движения облака в пикселях в секунду
        final int CLOUD_MOVEMENT_SPEED = 100;

        // delta - сколько времени прошло с прошлого кадра.
        // Если мы умножаем какую-то скорость на delta, то можем использовать
        // удобные единицы (например, "пиксель в секунду").
        cloudPositionX += delta * CLOUD_MOVEMENT_SPEED * cloudMovementDir;

        // Если облако вышло за границы экрана, меняем направление движения
        // на противоположное.
        if (cloudPositionX > VIEWPORT_WIDTH) {
            cloudMovementDir = -1;
        }
        else if (cloudPositionX + cloudSizeX < 0) {
            cloudMovementDir = 1;
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        final int HOUSE_ORIGIN_X = 300;
        final int HOUSE_ORIGIN_Y = 320;

        final int HOUSE_WIDTH = 100;
        final int HOUSE_HEIGHT = 100;

        final int HOUSE_ROOF_HEIGHT = 50;

        // Рисуем ландшафт
        g.setColor(new Color(109, 141, 35));
        g.fillRect(0, VIEWPORT_HEIGHT / 2, VIEWPORT_WIDTH, VIEWPORT_HEIGHT / 2);

        // Рисуем корпус дома
        g.setColor(Color.WHITE);
        g.fillRect(HOUSE_ORIGIN_X, HOUSE_ORIGIN_Y, HOUSE_WIDTH, HOUSE_HEIGHT);

        // Рисуем крышу дома
        Polygon polygon = new Polygon();
        polygon.addPoint(HOUSE_ORIGIN_X, HOUSE_ORIGIN_Y);
        polygon.addPoint(HOUSE_ORIGIN_X + HOUSE_WIDTH / 2, HOUSE_ORIGIN_Y - HOUSE_ROOF_HEIGHT);
        polygon.addPoint(HOUSE_ORIGIN_X + HOUSE_WIDTH, HOUSE_ORIGIN_Y);

        g.setColor(Color.WHITE);
        g.fillPolygon(polygon);

        // Рисуем окно
        g.setColor(Color.GRAY);
        g.fillRect(HOUSE_ORIGIN_X + HOUSE_WIDTH / 2 - 15, HOUSE_ORIGIN_Y + 25,
                30, 30);

        // Разделитель между крышей и корпусом дома
        g.setColor(Color.BLACK);
        g.drawLine(HOUSE_ORIGIN_X, HOUSE_ORIGIN_Y, HOUSE_ORIGIN_X + HOUSE_WIDTH, HOUSE_ORIGIN_Y);

        // Облако
        g.setColor(new Color(127, 127, 127));
        g.fillOval(cloudPositionX, cloudPositionY, cloudSizeX, cloudSizeY);
    }
}

public class Main extends JFrame {
    private Timer timer;
    private Viewport viewport = new Viewport();

    public Main() {
        super("Hello, graphics!");

        // Запрещаем масштабирование
        setResizable(false);
        // Останавливаем процесс приложения при закрытии окна
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        // Добавляем рисуемую область на окно
        getContentPane().add(viewport);
        // Перемасштабируем все элементы, чтобы их размер
        // соответствовал заданному
        pack();

        // Создаём таймер, который будет "тикать" раз в 33 миллисекунды.
        // В каждом тике вызываем обновление сцены (для анимации)
        // и перерисовку сцены.
        timer = new Timer(33, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                viewport.update(1.0f / 33.0f);
                viewport.repaint();
            }
        });

        // Показываем окно на экране
        setVisible(true);

        // Запускаем таймер
        timer.start();

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(Main::new);
    }
} нужно доработать машину которая подьедет дому и улучшить анимации и дом