From 5da451e1b55e1ce1e5729b1366603052f11210c1 Mon Sep 17 00:00:00 2001 From: Factorino73 Date: Tue, 24 Oct 2023 20:22:03 +0400 Subject: [PATCH] PIbd-21_MasenkinMS_LabWork01 --- AccordionBus/AccordionBusForm.form | 90 ++++++++++++ AccordionBus/AccordionBusForm.java | 80 +++++++++++ AccordionBus/DirectionType.java | 13 ++ AccordionBus/DrawingAccordionBus.java | 199 ++++++++++++++++++++++++++ AccordionBus/DrawingDoors.java | 42 ++++++ AccordionBus/EntityAccordionBus.java | 55 +++++++ AccordionBus/FrameAccordionBus.java | 21 +++ AccordionBus/Main.java | 2 +- AccordionBus/NumDoors.java | 22 +++ AccordionBus/img/Down.png | Bin 0 -> 2180 bytes AccordionBus/img/Left.png | Bin 0 -> 2025 bytes AccordionBus/img/Right.png | Bin 0 -> 2247 bytes AccordionBus/img/Up.png | Bin 0 -> 2150 bytes 13 files changed, 523 insertions(+), 1 deletion(-) create mode 100644 AccordionBus/AccordionBusForm.form create mode 100644 AccordionBus/AccordionBusForm.java create mode 100644 AccordionBus/DirectionType.java create mode 100644 AccordionBus/DrawingAccordionBus.java create mode 100644 AccordionBus/DrawingDoors.java create mode 100644 AccordionBus/EntityAccordionBus.java create mode 100644 AccordionBus/FrameAccordionBus.java create mode 100644 AccordionBus/NumDoors.java create mode 100644 AccordionBus/img/Down.png create mode 100644 AccordionBus/img/Left.png create mode 100644 AccordionBus/img/Right.png create mode 100644 AccordionBus/img/Up.png diff --git a/AccordionBus/AccordionBusForm.form b/AccordionBus/AccordionBusForm.form new file mode 100644 index 0000000..56443d0 --- /dev/null +++ b/AccordionBus/AccordionBusForm.form @@ -0,0 +1,90 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/AccordionBus/AccordionBusForm.java b/AccordionBus/AccordionBusForm.java new file mode 100644 index 0000000..e2f60cd --- /dev/null +++ b/AccordionBus/AccordionBusForm.java @@ -0,0 +1,80 @@ +package AccordionBus; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionListener; +import java.util.Random; + +public class AccordionBusForm { + private DrawingAccordionBus drawingAccordionBus; + private JPanel pictureBox; + public JPanel getPictureBox() { + return pictureBox; + } + private JPanel createPanel; + private JButton buttonCreateAccordionBus; + private JButton buttonCreate; + private JButton buttonLeft; + private JButton buttonDown; + private JButton buttonRight; + private JButton buttonUp; + private JPanel MovePanel; + + public AccordionBusForm() { + buttonUp.setName("buttonUp"); + buttonDown.setName("buttonDown"); + buttonLeft.setName("buttonLeft"); + buttonRight.setName("buttonRight"); + + buttonCreateAccordionBus.addActionListener(e -> { + Random random = new Random(); + drawingAccordionBus = new DrawingAccordionBus(); + drawingAccordionBus.Init(random.nextInt(100, 300), + random.nextInt(1000, 3000), + new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)), + new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)), + random.nextBoolean(), + random.nextBoolean(), + pictureBox.getWidth(), + pictureBox.getHeight()); + drawingAccordionBus.SetNumDoors(random.nextInt(3, 6)); + drawingAccordionBus.SetPosition(random.nextInt(10, 100), + random.nextInt(10, 100)); + Draw(); + }); + + ActionListener buttonMoveClickedListener = e -> { + String name = ((JButton)e.getSource()).getName(); + switch (name) { + case "buttonUp" -> { + drawingAccordionBus.MoveTransport(DirectionType.Up); + } + case "buttonDown" -> { + drawingAccordionBus.MoveTransport(DirectionType.Down); + } + case "buttonLeft" -> { + drawingAccordionBus.MoveTransport(DirectionType.Left); + } + case "buttonRight" -> { + drawingAccordionBus.MoveTransport(DirectionType.Right); + } + } + Draw(); + }; + + buttonUp.addActionListener(buttonMoveClickedListener); + buttonDown.addActionListener(buttonMoveClickedListener); + buttonLeft.addActionListener(buttonMoveClickedListener); + buttonRight.addActionListener(buttonMoveClickedListener); + } + + public void Draw() { + if (drawingAccordionBus.AccordionBus == null) { + return; + } + + Graphics g = pictureBox.getGraphics(); + pictureBox.paint(g); + drawingAccordionBus.DrawTransport(g); + } +} diff --git a/AccordionBus/DirectionType.java b/AccordionBus/DirectionType.java new file mode 100644 index 0000000..a4022a1 --- /dev/null +++ b/AccordionBus/DirectionType.java @@ -0,0 +1,13 @@ +package AccordionBus; + +// Направление перемещения +public enum DirectionType { + // Вверх + Up, + // Вниз + Down, + // Влево + Left, + // Вправо + Right, +} diff --git a/AccordionBus/DrawingAccordionBus.java b/AccordionBus/DrawingAccordionBus.java new file mode 100644 index 0000000..0f9d010 --- /dev/null +++ b/AccordionBus/DrawingAccordionBus.java @@ -0,0 +1,199 @@ +package AccordionBus; + +import java.awt.*; +import java.util.Random; + +// Класс, отвечающий за прорисовку объекта +public class DrawingAccordionBus { + // Класс-сущность + public EntityAccordionBus AccordionBus; + + // Прорисовка дверей + public DrawingDoors drawingDoors; + + // Ширина окна + private int _pictureWidth; + + // Высота окна + private int _pictureHeight; + + // Левая координата прорисовки автобуса + private int _startPosX; + + // Верхняя координата прорисовки автобуса + private int _startPosY; + + // Ширина прорисовки автобуса + private int _busWidth = 100; + + // Высота прорисовки автобуса + private final int _busHeight = 50; + + // Инициализация свойста + public boolean Init(int speed, float weight, Color bodyColor, Color additionalColor, boolean additionalBody, boolean additionalDoor, int width, int height) { + // Проверка на вместимость объекта в размеры картинки + if ((_busWidth >= width) || (_busHeight >= height)) { + return false; + } + + _pictureWidth = width; + _pictureHeight = height; + if (additionalBody) { + _busWidth = 215; + } + AccordionBus = new EntityAccordionBus(); + AccordionBus.Init(speed, weight, + bodyColor, additionalColor, + additionalBody, additionalDoor); + drawingDoors = new DrawingDoors(); + + return true; + } + + // Количество дополнительных дверей + public void SetNumDoors(int numDoors) { + drawingDoors.setNumDoors(numDoors); + } + + // Установка позиции + public void SetPosition(int x, int y) { + if (x < 0 || y < 0) { + _startPosX = 0; + _startPosY = 0; + } + else if ((x + _busWidth > _pictureWidth) || (y + _busHeight > _pictureHeight)) { + _startPosX = _pictureWidth - _busWidth; + _startPosY = _pictureHeight - _busHeight; + } + else { + _startPosX = x; + _startPosY = y; + } + } + + // Изменение направления движения + public void MoveTransport(DirectionType direction) { + if (AccordionBus == null) { + return; + } + + switch (direction) { + case Left: + if (_startPosX - AccordionBus.Step > 0) { + _startPosX -= (int)AccordionBus.Step; + } + break; + case Up: + if (_startPosY - AccordionBus.Step > 0) { + _startPosY -= (int)AccordionBus.Step; + } + break; + case Right: + if (_startPosX + AccordionBus.Step < _pictureWidth - _busWidth) { + _startPosX += (int)AccordionBus.Step; + } + break; + case Down: + if (_startPosY + AccordionBus.Step < _pictureHeight - _busHeight) { + _startPosY += (int)AccordionBus.Step; + } + break; + } + } + + // Прорисовка объекта + public void DrawTransport(Graphics g) { + if (AccordionBus == null) { + return; + } + + Graphics2D g2d = (Graphics2D)g; + + Color bodyColor = AccordionBus.getBodyColor(); + Color additionalColor = AccordionBus.getAdditionalColor(); + Color blackColor = Color.BLACK; + Color whiteColor = Color.WHITE; + + // Граница главного отсека + g2d.setColor(blackColor); + g2d.setStroke(new BasicStroke(3)); + g2d.drawRect(_startPosX, _startPosY, 100, 40); + + // Кузов главного отсека + g2d.setColor(bodyColor); + g2d.fillRect(_startPosX + 1, _startPosY + 1, 99, 39); + + // Окна главного отсека + g2d.setColor(Color.CYAN); + g2d.fillRect(_startPosX, _startPosY + 5, 100, 15); + g2d.setColor(blackColor); + g2d.setStroke(new BasicStroke(2)); + g2d.drawLine(_startPosX, _startPosY + 5, _startPosX + 100, _startPosY + 5); + g2d.drawLine(_startPosX, _startPosY + 20, _startPosX + 100, _startPosY + 20); + + // Дверь главного отсека + g2d.setColor(blackColor); + g2d.setStroke(new BasicStroke(2)); + g2d.drawRect(_startPosX + 10, _startPosY + 10, 15, 30); + g2d.setColor(whiteColor); + g2d.fillRect(_startPosX + 11, _startPosY + 11, 14, 29); + + // Дополнительный отсек + if (AccordionBus.isAdditionalBody()) { + // Граница дополнительного отсека + g2d.setColor(blackColor); + g2d.setStroke(new BasicStroke(3)); + g2d.drawRect(_startPosX + 115, _startPosY, 100, 40); + + // Кузов дополнительного отсека + g2d.setColor(bodyColor); + g2d.fillRect(_startPosX + 116, _startPosY + 1, 99, 39); + + // Окна главного отсека + g2d.setColor(Color.CYAN); + g2d.fillRect(_startPosX + 115, _startPosY + 5, 100, 15); + g2d.setColor(blackColor); + g2d.setStroke(new BasicStroke(2)); + g2d.drawLine(_startPosX + 115, _startPosY + 5, _startPosX + 215, _startPosY + 5); + g2d.drawLine(_startPosX + 115, _startPosY + 20, _startPosX + 215, _startPosY + 20); + + // Дверь дополнительного отсека + if (AccordionBus.isAdditionalDoor()) { + g2d.setColor(blackColor); + g2d.setStroke(new BasicStroke(2)); + g2d.drawRect(_startPosX + 175, _startPosY + 10, 15, 30); + g2d.setColor(whiteColor); + g2d.fillRect(_startPosX + 176, _startPosY + 11, 14, 29); + } + + // Гармошка + g2d.setColor(blackColor); + g2d.setStroke(new BasicStroke(2)); + for (int i = 0; i < 5; i++) { + g2d.drawLine(_startPosX + 100 + i * 3, _startPosY, _startPosX + 100 + i * 3, _startPosY + 40); + } + } + + // Дополнительные двери + drawingDoors.DrawDoors(g2d, AccordionBus, additionalColor, _startPosX, _startPosY); + + // Колеса главного отсека + g2d.setColor(blackColor); + g2d.setStroke(new BasicStroke(3)); + g2d.drawOval(_startPosX + 15, _startPosY + 33, 15, 15); + g2d.drawOval(_startPosX + 70, _startPosY + 33, 15, 15); + g2d.setColor(whiteColor); + g2d.fillOval(_startPosX + 15, _startPosY + 33, 15, 15); + g2d.fillOval(_startPosX + 70, _startPosY + 33, 15, 15); + + // Колеса дополнительного отсека + if (AccordionBus.isAdditionalBody()) { + g2d.setColor(blackColor); + g2d.drawOval(_startPosX + 130, _startPosY + 33, 15, 15); + g2d.drawOval(_startPosX + 185, _startPosY + 33, 15, 15); + g2d.setColor(whiteColor); + g2d.fillOval(_startPosX + 131, _startPosY + 33, 15, 15); + g2d.fillOval(_startPosX + 186, _startPosY + 33, 15, 15); + } + } +} diff --git a/AccordionBus/DrawingDoors.java b/AccordionBus/DrawingDoors.java new file mode 100644 index 0000000..837b78e --- /dev/null +++ b/AccordionBus/DrawingDoors.java @@ -0,0 +1,42 @@ +package AccordionBus; + +import java.awt.*; + +public class DrawingDoors { + private NumDoors numDoors; + + public void setNumDoors(int num) { + for (NumDoors temp : numDoors.values()) { + if (temp.getNumDoors() == num) { + numDoors = temp; + return; + } + } + } + + public void DrawDoors(Graphics2D g2d, EntityAccordionBus AccordionBus, Color additionalColor, int _startPosX, int _startPosY) { + g2d.setColor(additionalColor); + int value = numDoors.getNumDoors(); + if (value >= 3) { + g2d.setColor(Color.BLACK); + g2d.setStroke(new BasicStroke(2)); + g2d.drawRect(_startPosX + 40, _startPosY + 10, 15, 30); + g2d.setColor(Color.WHITE); + g2d.fillRect(_startPosX + 41, _startPosY + 11, 14, 29); + } + if (value >= 4) { + g2d.setColor(Color.BLACK); + g2d.setStroke(new BasicStroke(2)); + g2d.drawRect(_startPosX + 75, _startPosY + 10, 15, 30); + g2d.setColor(Color.WHITE); + g2d.fillRect(_startPosX + 76, _startPosY + 11, 14, 29); + } + if (value >= 5 && AccordionBus.isAdditionalBody()) { + g2d.setColor(Color.BLACK); + g2d.setStroke(new BasicStroke(2)); + g2d.drawRect(_startPosX + 145, _startPosY + 10, 15, 30); + g2d.setColor(Color.WHITE); + g2d.fillRect(_startPosX + 146, _startPosY + 11, 14, 29); + } + } +} diff --git a/AccordionBus/EntityAccordionBus.java b/AccordionBus/EntityAccordionBus.java new file mode 100644 index 0000000..c58b201 --- /dev/null +++ b/AccordionBus/EntityAccordionBus.java @@ -0,0 +1,55 @@ +package AccordionBus; + +import java.awt.*; + +public class EntityAccordionBus { + // Скорость + private int Speed; + public int getSpeed() { return Speed; } + + // Вес + private float Weight; + public float getWeight() { + return Weight; + } + + // Основной цвет + private Color BodyColor; + public Color getBodyColor() { + return BodyColor; + } + + // Дополнительный цвет + private Color AdditionalColor;; + public Color getAdditionalColor() { + return AdditionalColor; + } + + // Дополнительный отсек + private boolean AdditionalBody; + public boolean isAdditionalBody() { + return AdditionalBody; + } + + // Дополнительная дверь + private boolean AdditionalDoor; + public boolean isAdditionalDoor() { + return AdditionalDoor; + } + + // Шаг перемещения автобуса + public double Step; + + // Инициализация полей + public void Init(int speed, float weight, + Color bodyColor, Color additionalColor, + boolean additionalBody, boolean additionalDoor) { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + AdditionalColor = additionalColor; + AdditionalBody = additionalBody; + AdditionalDoor = additionalDoor; + Step = (double)Speed * 100 / Weight; + } +} diff --git a/AccordionBus/FrameAccordionBus.java b/AccordionBus/FrameAccordionBus.java new file mode 100644 index 0000000..4e5e3a8 --- /dev/null +++ b/AccordionBus/FrameAccordionBus.java @@ -0,0 +1,21 @@ +package AccordionBus; + +import javax.swing.*; +import java.awt.*; + +public class FrameAccordionBus extends JFrame { + private AccordionBusForm accordionBusForm; + + public FrameAccordionBus() { + super(); + setTitle("AccordionBus"); + setDefaultCloseOperation(EXIT_ON_CLOSE); + accordionBusForm = new AccordionBusForm(); + setContentPane(accordionBusForm.getPictureBox()); + setDefaultLookAndFeelDecorated(false); + setPreferredSize(new Dimension(900, 500)); + setLocation(500, 500); + pack(); + setVisible(true); + } +} diff --git a/AccordionBus/Main.java b/AccordionBus/Main.java index 486e3be..95f5f8e 100644 --- a/AccordionBus/Main.java +++ b/AccordionBus/Main.java @@ -2,6 +2,6 @@ package AccordionBus; public class Main { public static void main(String[] args) { - + new FrameAccordionBus(); } } \ No newline at end of file diff --git a/AccordionBus/NumDoors.java b/AccordionBus/NumDoors.java new file mode 100644 index 0000000..492b809 --- /dev/null +++ b/AccordionBus/NumDoors.java @@ -0,0 +1,22 @@ +package AccordionBus; + +// Количество дополнительных дверей +public enum NumDoors { + // 3 двери + Three(3), + + // 4 двери + Four(4), + + // 5 дверей + Five(5); + + // Количество дверей + private final int Value; + public int getNumDoors() { return Value; } + + // Конструктор + NumDoors(int value) { + Value = value; + } +} \ No newline at end of file diff --git a/AccordionBus/img/Down.png b/AccordionBus/img/Down.png new file mode 100644 index 0000000000000000000000000000000000000000..67f0753dc6f15add6c9e079c4cfaecb23950f7f5 GIT binary patch literal 2180 zcmb_eeQeZZ96p3h7@!1!AP%VAB&hWIc^@r12JC>1?T*2YF+kYfwr_Xc?yg7MZ8t)6 zF8Id?5E-D6C?p~QG@{Hvge4m|kpKaNgb+vu1i|njj!6h42J!8EImq~kdP%SC+vk0L z&+qqp`o3*0@y{BXIVRI)vkfgQ@XkZ$an>;~1N~2?c72XcgQ5is4V!JaX&wD8DC1)` zTgFFfpxi9?6$_FUwgXucp*eH2k&m{z%fnS?PE!;%z3QanL91;#1R9G3jyD4Z@U!aVQHWH5B+ z!Goq56-ctazTRHX+BLn3q@<(jO-MH7aEeTMom?VU=||~wOZ4I zBdLiT!qGHs#7Nc&Rg8>*C`sEXE2lV6meROrtsaU8mn9O0U>HVB17YbjHX77S%?N5w zpiV!2Bmkkycl z9?-N_HIs+6XP`tp>k3f-UWMG14f@MiiG(8MZ!fF^)K{6Vt!m)H2g?uff=_oK#$HrCo zd_rNwFhN9ugd7i*O4lrMNZDI4?;xxl;$U*8=7L)107DQLbZFQxyUDpH$dIfr31hL zj-epo4Wx`?P$SF`M#hKGf^A)edIXFWB1SjH)R7_p>rGWEg6HQ&E5xad}R$;!nAua`Ap zWqTLCzj0Li(MD?ex9c7TGOLRtO?Q^|TZtH`WOA1fF_HL(kKd06VRc{S1Zp=Ay@4=6)$Ca%|Wc|UAYf<-(bD=L6eSN{6(Y~*!a}_#@X9iGCPXZDO(Ponb6tZy?xBSob$Kp-r4r*ke_efU0q>6yli0SZ3i`V zclqi=WNA%da)d+PeN48|%1Oaq3iXL*1VvPi#0?Idx~?=>D;T oJM+T#_|N>AO$V;MINiH8@66tcy<%7MUF$ocaE9NzYkFnV-#?P^%>V!Z literal 0 HcmV?d00001 diff --git a/AccordionBus/img/Left.png b/AccordionBus/img/Left.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c5a8647af9547ae626ed874eb6108769efe673 GIT binary patch literal 2025 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 literal 0 HcmV?d00001 -- 2.25.1