diff --git a/src/DirectionType.java b/src/DoubleDeckerBus/DirectionType.java similarity index 72% rename from src/DirectionType.java rename to src/DoubleDeckerBus/DirectionType.java index 35657f0..3714125 100644 --- a/src/DirectionType.java +++ b/src/DoubleDeckerBus/DirectionType.java @@ -1,3 +1,5 @@ +package DoubleDeckerBus; + public enum DirectionType { Up, Down, diff --git a/src/DoorNumberType.java b/src/DoubleDeckerBus/DoorNumberType.java similarity index 70% rename from src/DoorNumberType.java rename to src/DoubleDeckerBus/DoorNumberType.java index d503c6d..2532020 100644 --- a/src/DoorNumberType.java +++ b/src/DoubleDeckerBus/DoorNumberType.java @@ -1,3 +1,5 @@ +package DoubleDeckerBus; + public enum DoorNumberType { Three, Four, diff --git a/src/DoubleDeckerBus/DrawningObjects/DrawningBus.java b/src/DoubleDeckerBus/DrawningObjects/DrawningBus.java new file mode 100644 index 0000000..9da9393 --- /dev/null +++ b/src/DoubleDeckerBus/DrawningObjects/DrawningBus.java @@ -0,0 +1,188 @@ +package DoubleDeckerBus.DrawningObjects; + +import DoubleDeckerBus.DirectionType; +import DoubleDeckerBus.Entities.EntityBus; + +import javax.swing.*; +import java.awt.*; +import java.util.Random; + +public class DrawningBus { + protected JPanel BusPanel; + protected EntityBus EntityBus; + private int _pictureWidth; + private int _pictureHeight; + protected int _startPosX; + protected int _startPosY; + protected int _busWidth = 110; + protected int _busHeight = 70; + private IDraw DrawningDoor; + + public EntityBus EntityBus() { + return EntityBus; + } + + public DrawningBus(int speed, double weight, Color bodyColor, int width, int height, JPanel busPanel) { + if (width <= _busWidth || height <= _busHeight) { + return; + } + + _startPosX = 0; + _startPosY = 0; + busPanel.setSize(width, height); + BusPanel = busPanel; + busPanel.paint(BusPanel.getGraphics()); + _pictureWidth = width; + _pictureHeight = height; + EntityBus = new EntityBus(speed, weight, bodyColor); + Random random = new Random(); + int option = random.nextInt(1,4); + if (option == 1) { + DrawningDoor = new DrawningDoor(_busWidth, _busHeight, _startPosX, _startPosY, busPanel); + } else if (option == 2) { + DrawningDoor = new DrawningDoorOval(_busWidth, _busHeight, _startPosX, _startPosY, busPanel); + } else if (option == 3) { + DrawningDoor = new DrawningDoorTriangle(_busWidth, _busHeight, _startPosX, _startPosY, busPanel); + } + DrawningDoor.ChangeDoorsNumber(random.nextInt(2, 6)); + } + + protected DrawningBus(int speed, double weight, Color bodyColor, + int width, int height, int busWidth, int busHeight, JPanel busPanel) { + if (width <= _busWidth || height <= _busHeight) { + return; + } + + _startPosX = 0; + _startPosY = 0; + busPanel.setSize(width, height); + BusPanel = busPanel; + busPanel.paint(BusPanel.getGraphics()); + _pictureWidth = width; + _pictureHeight = height; + _busWidth = busWidth; + _busHeight = busHeight; + EntityBus = new EntityBus(speed, weight, bodyColor); + Random random = new Random(); + int option = random.nextInt(1,4); + if (option == 1) { + DrawningDoor = new DrawningDoor(_busWidth, _busHeight, _startPosX, _startPosY, busPanel); + } else if (option == 2) { + DrawningDoor = new DrawningDoorOval(_busWidth, _busHeight, _startPosX, _startPosY, busPanel); + } else if (option == 3) { + DrawningDoor = new DrawningDoorTriangle(_busWidth, _busHeight, _startPosX, _startPosY, busPanel); + } + DrawningDoor.ChangeDoorsNumber(random.nextInt(2, 6)); + } + + public void SetPosition(int x, int y){ + if (x < 0 || x + _busWidth > _pictureWidth) + { + x = Math.max(0, _pictureWidth - _busWidth); + } + if (y < 0 || y + _busHeight > _pictureHeight) + { + y = Math.max(0, _pictureHeight - _busHeight); + } + _startPosX = x; + _startPosY = y; + } + + public int GetPosX() { + return _startPosX; + } + + public int GetPosY() { + return _startPosY; + } + + public int GetWidth() { + return _busWidth; + } + + public int GetHeight() { + return _busHeight; + } + + public boolean CanMove(DirectionType direction) + { + if (EntityBus == null) + return false; + boolean can = false; + switch (direction) + { + case Left: + can = _startPosX - EntityBus.Step() >= 0; + break; + case Right: + can = _startPosX + EntityBus.Step() + _busWidth < _pictureWidth; + break; + case Down: + can = _startPosY + EntityBus.Step() + _busHeight < _pictureHeight; + break; + case Up: + can = _startPosY - EntityBus.Step() >= 0; + break; + }; + return can; + } + + public void MoveTransport(DirectionType direction){ + if (!CanMove(direction) || EntityBus == null) { + return; + } + BusPanel.paint(BusPanel.getGraphics()); + switch (direction) + { + case Left: + if (_startPosX - EntityBus.Step() >= 0) { + _startPosX -= (int) EntityBus.Step(); + } + break; + case Up: + if (_startPosY - EntityBus.Step() >= 0) { + _startPosY -= (int) EntityBus.Step(); + } + break; + case Right: + if (_startPosX + EntityBus.Step() + _busWidth <= _pictureWidth) { + _startPosX += (int) EntityBus.Step(); + } + break; + case Down: + if (_startPosY + EntityBus.Step() + _busHeight <= _pictureHeight) { + _startPosY += (int) EntityBus.Step(); + } + break; + } + DrawningDoor.ChangeX(_startPosX); + DrawningDoor.ChangeY(_startPosY); + } + + public void DrawTransport() { + Graphics2D g2d = (Graphics2D)BusPanel.getGraphics(); + + if (EntityBus == null) { + return; + } + + // Границы первого этажа автобуса + g2d.setColor(EntityBus.BodyColor()); + g2d.fillRect(_startPosX, _startPosY + 30, 100, 30); + + // Колеса + g2d.setColor(Color.black); + g2d.fillOval(_startPosX + 7, _startPosY + 55, 10, 10); + g2d.fillOval(_startPosX + 77, _startPosY + 55, 10, 10); + + // Окна + g2d.setColor(Color.blue); + g2d.fillOval(_startPosX + 10, _startPosY + 35, 10, 15); + g2d.fillOval(_startPosX + 50, _startPosY + 35, 10, 15); + g2d.fillOval(_startPosX + 70, _startPosY + 35, 10, 15); + g2d.fillOval(_startPosX + 90, _startPosY + 35, 10, 15); + + // двери + DrawningDoor.DrawDoors(); + } +} \ No newline at end of file diff --git a/src/DrawningDoor.java b/src/DoubleDeckerBus/DrawningObjects/DrawningDoor.java similarity index 58% rename from src/DrawningDoor.java rename to src/DoubleDeckerBus/DrawningObjects/DrawningDoor.java index 51a82eb..846fafd 100644 --- a/src/DrawningDoor.java +++ b/src/DoubleDeckerBus/DrawningObjects/DrawningDoor.java @@ -1,8 +1,12 @@ +package DoubleDeckerBus.DrawningObjects; + +import DoubleDeckerBus.DoorNumberType; + import javax.swing.*; import java.awt.*; -public class DrawningDoor { - JPanel DoubleDeckerBusPanel; +public class DrawningDoor implements IDraw { + JPanel BusPanel; private DoorNumberType DoorNumberType; private Color blackColor; private int Width; @@ -10,14 +14,20 @@ public class DrawningDoor { public int CurX; public int CurY; - public boolean Init(int width, int height, int curX, int curY, JPanel doubleDeckerBusPanel) { + public DrawningDoor(int width, int height, int curX, int curY, JPanel busPanel) { Width = width; Height = height; CurX = curX; CurY = curY; blackColor = Color.BLACK; - DoubleDeckerBusPanel = doubleDeckerBusPanel; - return true; + BusPanel = busPanel; + } + + public void ChangeX(int x){ + CurX = x; + } + public void ChangeY(int y){ + CurY = y; } public void ChangeDoorsNumber(int x) { @@ -36,22 +46,27 @@ public class DrawningDoor { return DoorNumberType; } + public void DrawDoor(int x, int y){ + Graphics2D g2d = (Graphics2D)BusPanel.getGraphics(); + g2d.fillRect(x, y, 10, 20); + } + public void DrawDoors() { - Graphics2D g2d = (Graphics2D) DoubleDeckerBusPanel.getGraphics(); + Graphics2D g2d = (Graphics2D) BusPanel.getGraphics(); g2d.setColor(blackColor); - g2d.fillRect(CurX + 15, CurY + 40, 10, 20); - g2d.fillRect(CurX + 30, CurY + 40, 10, 20); + DrawDoor(CurX + 15, CurY + 40); + DrawDoor(CurX + 30, CurY + 40); if (DoorNumberType() == DoorNumberType.Three || DoorNumberType() == DoorNumberType.Four || DoorNumberType() == DoorNumberType.Five) { - g2d.fillRect(CurX + 45, CurY + 40, 10, 20); + DrawDoor(CurX + 45, CurY + 40); } if (DoorNumberType() == DoorNumberType.Four || DoorNumberType() == DoorNumberType.Five) { - g2d.fillRect(CurX + 60, CurY + 40, 10, 20); + DrawDoor(CurX + 60, CurY + 40); } if (DoorNumberType() == DoorNumberType.Five) { - g2d.fillRect(CurX + 75, CurY + 40, 10, 20); + DrawDoor(CurX + 75, CurY + 40); } } } diff --git a/src/DoubleDeckerBus/DrawningObjects/DrawningDoorOval.java b/src/DoubleDeckerBus/DrawningObjects/DrawningDoorOval.java new file mode 100644 index 0000000..77f7ba0 --- /dev/null +++ b/src/DoubleDeckerBus/DrawningObjects/DrawningDoorOval.java @@ -0,0 +1,72 @@ +package DoubleDeckerBus.DrawningObjects; + +import DoubleDeckerBus.DoorNumberType; + +import javax.swing.*; +import java.awt.*; + +public class DrawningDoorOval implements IDraw { + JPanel BusPanel; + private DoorNumberType DoorNumberType; + private Color blackColor; + private int Width; + private int Height; + public int CurX; + public int CurY; + + public DrawningDoorOval(int width, int height, int curX, int curY, JPanel busPanel) { + Width = width; + Height = height; + CurX = curX; + CurY = curY; + blackColor = Color.BLACK; + BusPanel = busPanel; + } + + public void ChangeX(int x){ + CurX = x; + } + public void ChangeY(int y){ + CurY = y; + } + + public void ChangeDoorsNumber(int x) { + if (x <= 3) { + DoorNumberType = DoorNumberType.Three; + } + if (x == 4) { + DoorNumberType = DoorNumberType.Four; + } + if (x >= 5) { + DoorNumberType = DoorNumberType.Five; + } + } + + public DoorNumberType DoorNumberType() { + return DoorNumberType; + } + + public void DrawDoor(int x, int y){ + Graphics2D g2d = (Graphics2D)BusPanel.getGraphics(); + g2d.fillOval(x, y, 10, 20); + } + + public void DrawDoors() { + Graphics2D g2d = (Graphics2D) BusPanel.getGraphics(); + g2d.setColor(blackColor); + DrawDoor(CurX + 15, CurY + 40); + DrawDoor(CurX + 30, CurY + 40); + + if (DoorNumberType() == DoorNumberType.Three || DoorNumberType() == DoorNumberType.Four || DoorNumberType() == DoorNumberType.Five) { + DrawDoor(CurX + 45, CurY + 40); + } + + if (DoorNumberType() == DoorNumberType.Four || DoorNumberType() == DoorNumberType.Five) { + DrawDoor(CurX + 60, CurY + 40); + } + + if (DoorNumberType() == DoorNumberType.Five) { + DrawDoor(CurX + 75, CurY + 40); + } + } +} diff --git a/src/DoubleDeckerBus/DrawningObjects/DrawningDoorTriangle.java b/src/DoubleDeckerBus/DrawningObjects/DrawningDoorTriangle.java new file mode 100644 index 0000000..5ed797b --- /dev/null +++ b/src/DoubleDeckerBus/DrawningObjects/DrawningDoorTriangle.java @@ -0,0 +1,74 @@ +package DoubleDeckerBus.DrawningObjects; + +import DoubleDeckerBus.DoorNumberType; + +import javax.swing.*; +import java.awt.*; + +public class DrawningDoorTriangle implements IDraw { + JPanel BusPanel; + private DoubleDeckerBus.DoorNumberType DoorNumberType; + private Color blackColor; + private int Width; + private int Height; + public int CurX; + public int CurY; + + public DrawningDoorTriangle(int width, int height, int curX, int curY, JPanel busPanel) { + Width = width; + Height = height; + CurX = curX; + CurY = curY; + blackColor = Color.BLACK; + BusPanel = busPanel; + } + + public void ChangeX(int x){ + CurX = x; + } + public void ChangeY(int y){ + CurY = y; + } + + public void ChangeDoorsNumber(int x) { + if (x <= 3) { + DoorNumberType = DoorNumberType.Three; + } + if (x == 4) { + DoorNumberType = DoorNumberType.Four; + } + if (x >= 5) { + DoorNumberType = DoorNumberType.Five; + } + } + + public DoorNumberType DoorNumberType() { + return DoorNumberType; + } + + public void DrawDoor(int x, int y){ + Graphics2D g2d = (Graphics2D)BusPanel.getGraphics(); + int[] xPoints = {x, x + 5, x + 10}; + int[] yPoints = {y + 20, y, y + 20}; + g2d.fillPolygon(xPoints, yPoints, 3); + } + + public void DrawDoors() { + Graphics2D g2d = (Graphics2D) BusPanel.getGraphics(); + g2d.setColor(blackColor); + DrawDoor(CurX + 15, CurY + 40); + DrawDoor(CurX + 30, CurY + 40); + + if (DoorNumberType() == DoorNumberType.Three || DoorNumberType() == DoorNumberType.Four || DoorNumberType() == DoorNumberType.Five) { + DrawDoor(CurX + 45, CurY + 40); + } + + if (DoorNumberType() == DoorNumberType.Four || DoorNumberType() == DoorNumberType.Five) { + DrawDoor(CurX + 60, CurY + 40); + } + + if (DoorNumberType() == DoorNumberType.Five) { + DrawDoor(CurX + 75, CurY + 40); + } + } +} diff --git a/src/DoubleDeckerBus/DrawningObjects/DrawningDoubleDeckerBus.java b/src/DoubleDeckerBus/DrawningObjects/DrawningDoubleDeckerBus.java new file mode 100644 index 0000000..04b134c --- /dev/null +++ b/src/DoubleDeckerBus/DrawningObjects/DrawningDoubleDeckerBus.java @@ -0,0 +1,71 @@ +package DoubleDeckerBus.DrawningObjects; + +import DoubleDeckerBus.Entities.EntityDoubleDeckerBus; + +import javax.swing.*; +import java.awt.*; + +public class DrawningDoubleDeckerBus extends DrawningBus { + + public DrawningDoubleDeckerBus(int speed, double weight, Color bodyColor, Color additionalColor, int doorNumber, + int width, int height, boolean secondFloor, boolean ladder, boolean lineBetweenFloor, JPanel busPanel) { + super(speed, weight, bodyColor, width, height, busPanel); + if (EntityBus != null) { + EntityBus = new EntityDoubleDeckerBus(speed, weight, bodyColor, additionalColor, doorNumber, secondFloor, + ladder, lineBetweenFloor); + } + } + + @Override + public void DrawTransport() { + + if (!(EntityBus instanceof EntityDoubleDeckerBus)) { + return; + } + + super.DrawTransport(); + + EntityDoubleDeckerBus _bus = (EntityDoubleDeckerBus) EntityBus; + Graphics2D g2d = (Graphics2D)BusPanel.getGraphics(); + + // второй этаж + if (_bus.SecondFloor()) + { + g2d.setColor(_bus.BodyColor()); + // Границы второго этажа автобуса + g2d.setColor(_bus.AdditionalColor()); + g2d.fillRect(_startPosX, _startPosY, 100, 30); + + // Окна второго этажа + g2d.setColor(Color.BLUE); + g2d.fillOval(_startPosX + 12, _startPosY + 5, 10, 15); + g2d.fillOval(_startPosX + 30, _startPosY + 5, 10, 15); + g2d.fillOval(_startPosX + 50, _startPosY + 5, 10, 15); + g2d.fillOval(_startPosX + 70, _startPosY + 5, 10, 15); + g2d.fillOval(_startPosX + 90, _startPosY + 5, 10, 15); + } + + // лестница + if (_bus.Ladder()) + { + if (_bus.SecondFloor()) { + //Вертикальные прямые + g2d.setColor(Color.black); + g2d.drawLine(_startPosX, _startPosY + 55, _startPosX, _startPosY + 25); + g2d.drawLine(_startPosX + 10, _startPosY + 55, _startPosX + 10, _startPosY + 25); + + //Горизонтальные прямые + g2d.drawLine(_startPosX, _startPosY + 35, _startPosX + 10, _startPosY + 35); + g2d.drawLine(_startPosX, _startPosY + 45, _startPosX + 10, _startPosY + 45); + g2d.drawLine(_startPosX, _startPosY + 55, _startPosX + 10, _startPosY + 55); + } + } + + // полоса между этажами + if (_bus.LineBetweenFloor()) + { + g2d.setColor(Color.black); + g2d.fillRect(_startPosX, _startPosY + 30, 100, 3); + } + } +} diff --git a/src/DoubleDeckerBus/DrawningObjects/IDraw.java b/src/DoubleDeckerBus/DrawningObjects/IDraw.java new file mode 100644 index 0000000..7719a89 --- /dev/null +++ b/src/DoubleDeckerBus/DrawningObjects/IDraw.java @@ -0,0 +1,12 @@ +package DoubleDeckerBus.DrawningObjects; + +import DoubleDeckerBus.DoorNumberType; + +public interface IDraw { + public void ChangeDoorsNumber(int x); + public DoorNumberType DoorNumberType(); + public void DrawDoor(int x, int y); + public void DrawDoors(); + public void ChangeX(int x); + public void ChangeY(int y); +} diff --git a/src/DoubleDeckerBus/Entities/EntityBus.java b/src/DoubleDeckerBus/Entities/EntityBus.java new file mode 100644 index 0000000..3b312c7 --- /dev/null +++ b/src/DoubleDeckerBus/Entities/EntityBus.java @@ -0,0 +1,33 @@ +package DoubleDeckerBus.Entities; + +import java.awt.*; + +public class EntityBus { + public int Speed; + public double Weight; + public Color BodyColor; + public double Step; + + public int Speed() { + return Speed; + } + + public double Weight() { + return Weight; + } + + public Color BodyColor() { + return BodyColor; + } + + public double Step() { + return Step; + } + + public EntityBus(int speed, double weight, Color bodyColor) { + Speed = speed; + Weight = weight; + Step = (double) Speed * 100 / Weight; + BodyColor = bodyColor; + } +} diff --git a/src/DoubleDeckerBus/Entities/EntityDoubleDeckerBus.java b/src/DoubleDeckerBus/Entities/EntityDoubleDeckerBus.java new file mode 100644 index 0000000..1e9402e --- /dev/null +++ b/src/DoubleDeckerBus/Entities/EntityDoubleDeckerBus.java @@ -0,0 +1,39 @@ +package DoubleDeckerBus.Entities; + +import java.awt.*; + +public class EntityDoubleDeckerBus extends EntityBus { + public Color AdditionalColor; + public boolean SecondFloor; + public boolean Ladder; + public boolean LineBetweenFloor; + + public Color AdditionalColor() { + return AdditionalColor; + } + + public boolean SecondFloor() { + return SecondFloor; + } + + public boolean Ladder() { + return Ladder; + } + + public boolean LineBetweenFloor() { + return LineBetweenFloor; + } + + public double Step() { + return Step; + } + + public EntityDoubleDeckerBus(int speed, double weight, Color bodyColor, Color additionalColor, + int doorNumber, boolean secondFloor ,boolean ladder, boolean lineBetweenFloor) { + super(speed, weight, bodyColor); + AdditionalColor = additionalColor; + SecondFloor = secondFloor; + Ladder = ladder; + LineBetweenFloor = lineBetweenFloor; + } +} diff --git a/src/DoubleDeckerBus/FormDoubleDeckerBus.java b/src/DoubleDeckerBus/FormDoubleDeckerBus.java new file mode 100644 index 0000000..404513a --- /dev/null +++ b/src/DoubleDeckerBus/FormDoubleDeckerBus.java @@ -0,0 +1,166 @@ +package DoubleDeckerBus; + +import DoubleDeckerBus.DrawningObjects.DrawningDoubleDeckerBus; +import DoubleDeckerBus.DrawningObjects.DrawningBus; +import DoubleDeckerBus.MovementStrategy.*; + +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.Random; +import javax.imageio.ImageIO; +import javax.swing.*; + +public class FormDoubleDeckerBus { + static DrawningBus DrawningBus; + static AbstractStrategy _abstractStrategy; + public static void main(String[] args) throws IOException { + String[] items = {"Довести до центра", "Довести до края"}; + + JComboBox comboBoxStrategy = new JComboBox(items); + comboBoxStrategy.setBounds(562,12,151,28); + JFrame BusFrame = new JFrame(); + BusFrame.setResizable(false); + JPanel BusPanel = new JPanel(); + BusFrame.setLayout(new BorderLayout()); + BusFrame.setSize(743, 576); + BusFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + BusFrame.setLayout(new BorderLayout(1,1)); + BusPanel.setLayout(null); + BufferedImage RightIcon = ImageIO.read(new File("Resources/RightArrow.png")); + BufferedImage LeftIcon = ImageIO.read(new File("Resources/LeftArrow.png")); + BufferedImage UpIcon = ImageIO.read(new File("Resources/UpArrow.png")); + BufferedImage DownIcon = ImageIO.read(new File("Resources/DownArrow.png")); + + JButton RightButton = new JButton(new ImageIcon(RightIcon)); + JButton LeftButton = new JButton(new ImageIcon(LeftIcon)); + JButton UpButton = new JButton(new ImageIcon(UpIcon)); + JButton DownButton = new JButton(new ImageIcon(DownIcon)); + JButton CreateButton = new JButton(); + JButton CreateDoubleDeckerBusButton = new JButton(); + JButton buttonStep = new JButton(); + + CreateDoubleDeckerBusButton.setBounds(198,477,180, 40); + CreateDoubleDeckerBusButton.setText("Создать двухэтажный автобус"); + CreateButton.setText("Создать"); + buttonStep.setBounds(619, 46, 94, 29); + buttonStep.setText("шаг"); + CreateButton.setBounds(12, 477, 180, 40); + RightButton.setBounds(683,487,30,30); + LeftButton.setBounds(611,487,30,30); + UpButton.setBounds(647,451,30,30); + DownButton.setBounds(647,487,30,30); + + BusPanel.add(CreateButton); + BusPanel.add(CreateDoubleDeckerBusButton); + BusPanel.add(RightButton); + BusPanel.add(LeftButton); + BusPanel.add(UpButton); + BusPanel.add(DownButton); + BusPanel.add(comboBoxStrategy); + BusPanel.add(buttonStep); + comboBoxStrategy.setSelectedIndex(-1); + + BusFrame.add(BusPanel, BorderLayout.CENTER); + Random random = new Random(); + CreateButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + DrawningBus = new DrawningBus(random.nextInt(100, 300), random.nextDouble(1000, 3000), + Color.getHSBColor(random.nextInt(0, 301), random.nextInt(0, 301), random.nextInt(0, 301)), + BusPanel.getWidth(), BusPanel.getHeight(), BusPanel); + DrawningBus.DrawTransport(); + comboBoxStrategy.enable(true); + } + }); + + CreateDoubleDeckerBusButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + DrawningBus = new DrawningDoubleDeckerBus(random.nextInt(100, 300), random.nextDouble(1000, 3000), + Color.getHSBColor(random.nextInt(0, 301), random.nextInt(0, 301), random.nextInt(0, 301)), + Color.getHSBColor(random.nextInt(0, 301), random.nextInt(0, 301), random.nextInt(0, 301)), + random.nextInt(1, 6), BusPanel.getWidth(), BusPanel.getHeight(), random.nextBoolean(), random.nextBoolean(), random.nextBoolean(), + BusPanel); + DrawningBus.DrawTransport(); + comboBoxStrategy.enable(true); + } + }); + + buttonStep.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (DrawningBus == null) { + return; + } + if (comboBoxStrategy.isEnabled()) { + if (comboBoxStrategy.getSelectedIndex() == 0) { + _abstractStrategy = new MoveToCenter(); + } + else if (comboBoxStrategy.getSelectedIndex() == 1) { + _abstractStrategy = new MoveToBorder(); + } else { + _abstractStrategy = null; + } + if (_abstractStrategy == null) { + return; + } + _abstractStrategy.SetData(new DrawningObjectBus(DrawningBus), BusPanel.getWidth(), + BusPanel.getHeight()); + comboBoxStrategy.enable(false); + } + if (_abstractStrategy == null) { + return; + } + _abstractStrategy.MakeStep(); + DrawningBus.DrawTransport(); + if (_abstractStrategy.GetStatus() == Status.Finish) { + comboBoxStrategy.enable(true); + _abstractStrategy = null; + } + } + }); + RightButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if(DrawningBus.EntityBus() == null) { + return; + } + DrawningBus.MoveTransport(DirectionType.Right); + DrawningBus.DrawTransport(); + } + }); + LeftButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if(DrawningBus.EntityBus() == null) + return; + DrawningBus.MoveTransport(DirectionType.Left); + DrawningBus.DrawTransport(); + } + }); + UpButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if(DrawningBus.EntityBus() == null) + return; + DrawningBus.MoveTransport(DirectionType.Up); + DrawningBus.DrawTransport(); + } + }); + DownButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if(DrawningBus.EntityBus() == null) + return; + DrawningBus.MoveTransport(DirectionType.Down); + DrawningBus.DrawTransport(); + } + }); + + BusFrame.setVisible(true); + } +} \ No newline at end of file diff --git a/src/DoubleDeckerBus/MovementStrategy/AbstractStrategy.java b/src/DoubleDeckerBus/MovementStrategy/AbstractStrategy.java new file mode 100644 index 0000000..fb46401 --- /dev/null +++ b/src/DoubleDeckerBus/MovementStrategy/AbstractStrategy.java @@ -0,0 +1,98 @@ +package DoubleDeckerBus.MovementStrategy; + +import DoubleDeckerBus.DirectionType; + +public abstract class AbstractStrategy { + private IMoveableObject _moveableObject; + + private Status _state = Status.NotInit; + + private int FieldWidth; + + protected int FieldWidth() { + return FieldWidth; + } + + private int FieldHeight; + + protected int FieldHeight() { + return FieldHeight; + } + + public Status GetStatus() { + return _state; + } + + public void SetData(IMoveableObject moveableObject, int width, int height) { + if (moveableObject == null) { + _state = Status.NotInit; + return; + } + + _state = Status.InProgress; + _moveableObject = moveableObject; + FieldWidth = width; + FieldHeight = height; + } + + public void MakeStep() { + if (_state != Status.InProgress) { + return; + } + + if (IsTargetDestination()) { + _state = Status.Finish; + return; + } + MoveToTarget(); + } + + protected boolean MoveLeft() { + return MoveTo(DirectionType.Left); + } + + protected boolean MoveRight() { + return MoveTo(DirectionType.Right); + } + + protected boolean MoveUp() { + return MoveTo(DirectionType.Up); + } + + protected boolean MoveDown() { + return MoveTo(DirectionType.Down); + } + + protected ObjectParameters GetObjectParameters(){ + if (_moveableObject != null) { + return _moveableObject.GetObjectParameters(); + } + else { + return null; + } + } + + protected Integer GetStep() { + if (_state != Status.InProgress) { + return null; + } + return _moveableObject.GetStep(); + } + + protected abstract void MoveToTarget(); + + protected abstract boolean IsTargetDestination(); + + private boolean MoveTo(DirectionType directionType) { + if (_state != Status.InProgress) { + return false; + } + + if (_moveableObject.CheckCanMove(directionType)) { + _moveableObject.MoveObject(directionType); + return true; + } + + return false; + } +} diff --git a/src/DoubleDeckerBus/MovementStrategy/DrawningObjectBus.java b/src/DoubleDeckerBus/MovementStrategy/DrawningObjectBus.java new file mode 100644 index 0000000..ebe7b78 --- /dev/null +++ b/src/DoubleDeckerBus/MovementStrategy/DrawningObjectBus.java @@ -0,0 +1,41 @@ +package DoubleDeckerBus.MovementStrategy; + +import DoubleDeckerBus.DrawningObjects.DrawningBus; +import DoubleDeckerBus.DirectionType; + +public class DrawningObjectBus implements IMoveableObject { + private final DrawningBus _drawningBus; + + public DrawningObjectBus(DrawningBus drawningBus){ + _drawningBus = drawningBus; + } + + public ObjectParameters GetObjectParameters(){ + if (_drawningBus == null || _drawningBus.EntityBus() == null) { + return null; + } + return new ObjectParameters(_drawningBus.GetPosX(), _drawningBus.GetPosY(), + _drawningBus.GetWidth(), _drawningBus.GetHeight()); + } + + public int GetStep(){ + if (_drawningBus.EntityBus() == null) { + return 0; + } + return (int)_drawningBus.EntityBus().Step(); + } + + public boolean CheckCanMove(DirectionType direction){ + if (_drawningBus == null) { + return false; + } + return _drawningBus.CanMove(direction); + } + + public void MoveObject(DirectionType direction){ + if (_drawningBus == null) { + return; + } + _drawningBus.MoveTransport(direction); + } +} diff --git a/src/DoubleDeckerBus/MovementStrategy/IMoveableObject.java b/src/DoubleDeckerBus/MovementStrategy/IMoveableObject.java new file mode 100644 index 0000000..270a480 --- /dev/null +++ b/src/DoubleDeckerBus/MovementStrategy/IMoveableObject.java @@ -0,0 +1,10 @@ +package DoubleDeckerBus.MovementStrategy; + +import DoubleDeckerBus.DirectionType; + +public interface IMoveableObject { + public ObjectParameters GetObjectParameters(); + public int GetStep(); + boolean CheckCanMove(DirectionType direction); + void MoveObject(DirectionType direction); +} diff --git a/src/DoubleDeckerBus/MovementStrategy/MoveToBorder.java b/src/DoubleDeckerBus/MovementStrategy/MoveToBorder.java new file mode 100644 index 0000000..1973516 --- /dev/null +++ b/src/DoubleDeckerBus/MovementStrategy/MoveToBorder.java @@ -0,0 +1,37 @@ +package DoubleDeckerBus.MovementStrategy; + +public class MoveToBorder extends AbstractStrategy { + @Override + protected boolean IsTargetDestination() { + var objParams = GetObjectParameters(); + + if (objParams == null) { + return false; + } + + return objParams.RightBorder <= FieldWidth() && objParams.RightBorder + GetStep() >= FieldWidth() && + objParams.DownBorder <= FieldHeight() && objParams.DownBorder + GetStep() >= FieldHeight(); + } + @Override + protected void MoveToTarget() { + var objParams = GetObjectParameters(); + + if (objParams == null) { + return; + } + + var diffX = objParams.RightBorder - FieldWidth(); + if (Math.abs(diffX) >= GetStep()) { + if (diffX < 0) { + MoveRight(); + } + } + + var diffY = objParams.DownBorder - FieldHeight(); + if (Math.abs(diffY) >= GetStep()) { + if (diffY < 0) { + MoveDown(); + } + } + } +} diff --git a/src/DoubleDeckerBus/MovementStrategy/MoveToCenter.java b/src/DoubleDeckerBus/MovementStrategy/MoveToCenter.java new file mode 100644 index 0000000..bf72659 --- /dev/null +++ b/src/DoubleDeckerBus/MovementStrategy/MoveToCenter.java @@ -0,0 +1,50 @@ +package DoubleDeckerBus.MovementStrategy; + +public class MoveToCenter extends AbstractStrategy{ + @Override + protected boolean IsTargetDestination() { + var objParams = GetObjectParameters(); + + if (objParams == null) { + return false; + } + + return ((objParams.ObjectMiddleHorizontal <= FieldWidth() / 2 && + objParams.ObjectMiddleHorizontal + GetStep() >= FieldWidth() / 2) + ||(objParams.ObjectMiddleHorizontal >= FieldWidth() / 2 && + objParams.ObjectMiddleHorizontal - GetStep() <= FieldWidth() / 2)) && + + ((objParams.ObjectMiddleVertical <= FieldHeight() / 2 && + objParams.ObjectMiddleVertical + GetStep() >= FieldHeight() / 2) || + (objParams.ObjectMiddleVertical >= FieldHeight() / 2 && + objParams.ObjectMiddleVertical - GetStep() <= FieldHeight() / 2)); + } + + @Override + protected void MoveToTarget() { + var objParams = GetObjectParameters(); + + if (objParams == null) { + return; + } + + var diffX = objParams.ObjectMiddleHorizontal - FieldWidth() / 2; + if (Math.abs(diffX) > GetStep()) { + if (diffX > 0) { + MoveLeft(); + } + else { + MoveRight(); + } + } + var diffY = objParams.ObjectMiddleVertical - FieldHeight() / 2; + if (Math.abs(diffY) > GetStep()) { + if (diffY > 0) { + MoveUp(); + } + else { + MoveDown(); + } + } + } +} diff --git a/src/DoubleDeckerBus/MovementStrategy/ObjectParameters.java b/src/DoubleDeckerBus/MovementStrategy/ObjectParameters.java new file mode 100644 index 0000000..44515ef --- /dev/null +++ b/src/DoubleDeckerBus/MovementStrategy/ObjectParameters.java @@ -0,0 +1,29 @@ +package DoubleDeckerBus.MovementStrategy; + +public class ObjectParameters { + private final int _x; + private final int _y; + private final int _width; + private final int _height; + public int LeftBorder; + public int TopBorder; + public int RightBorder; + public int DownBorder; + public int ObjectMiddleHorizontal; + public int ObjectMiddleVertical; + + public ObjectParameters(int x, int y, int width, int height) + { + _x = x; + _y = y; + _width = width; + _height = height; + LeftBorder = _x; + TopBorder = _y; + RightBorder = _x + width; + DownBorder = _y + height; + ObjectMiddleHorizontal = _x + _width / 2; + ObjectMiddleVertical = _y + _height / 2; + } + +} diff --git a/src/DoubleDeckerBus/MovementStrategy/Status.java b/src/DoubleDeckerBus/MovementStrategy/Status.java new file mode 100644 index 0000000..26466ba --- /dev/null +++ b/src/DoubleDeckerBus/MovementStrategy/Status.java @@ -0,0 +1,7 @@ +package DoubleDeckerBus.MovementStrategy; + +public enum Status { + NotInit, + InProgress, + Finish +} diff --git a/src/DrawningDoubleDeckerBus.java b/src/DrawningDoubleDeckerBus.java deleted file mode 100644 index 0f0c3ab..0000000 --- a/src/DrawningDoubleDeckerBus.java +++ /dev/null @@ -1,157 +0,0 @@ -import javax.swing.*; -import java.awt.*; -import java.util.Random; - -public class DrawningDoubleDeckerBus { - JPanel DoubleDeckerBusPanel; - private EntityDoubleDeckerBus EntityDoubleDeckerBus; - private int _pictureWidth; - private int _pictureHeight; - private int _startPosX = 0; - private int _startPosY = 0; - private final int _busWidth = 110; - private final int _busHeight = 70; - private DrawningDoor DrawningDoor; - - public EntityDoubleDeckerBus EntityDoubleDeckerBus() { - return EntityDoubleDeckerBus; - } - - public boolean Init(int speed, double weight, Color bodyColor, Color additionalColor, int doorNumber, - int width, int height, boolean secondFloor, boolean ladder, boolean lineBetweenFloor, JPanel doubleDeckerBusPanel) { - if (width <= _busWidth || height <= _busHeight) { - return false; - } - - _startPosX = 0; - _startPosY = 0; - doubleDeckerBusPanel.setSize(width, height); - DoubleDeckerBusPanel = doubleDeckerBusPanel; - doubleDeckerBusPanel.paint(DoubleDeckerBusPanel.getGraphics()); - _pictureWidth = width; - _pictureHeight = height; - EntityDoubleDeckerBus = new EntityDoubleDeckerBus(); - EntityDoubleDeckerBus.Init(speed, weight, bodyColor, additionalColor, doorNumber, secondFloor, ladder, lineBetweenFloor); - DrawningDoor = new DrawningDoor(); - DrawningDoor.Init(_busWidth, _busHeight, _startPosX, _startPosY, doubleDeckerBusPanel); - Random random = new Random(); - DrawningDoor.ChangeDoorsNumber(random.nextInt(2,6)); - return true; - } - - public void SetPosition(int x, int y){ - if (EntityDoubleDeckerBus == null) { - return; - } - - _startPosX = x; - _startPosY = y; - - if (x + _busWidth <= _pictureWidth || y + _busHeight <= _pictureHeight) { - _startPosX = 0; - _startPosY = 0; - } - } - - public void MoveTransport(DirectionType direction){ - if (EntityDoubleDeckerBus == null) - return; - DoubleDeckerBusPanel.paint(DoubleDeckerBusPanel.getGraphics()); - switch (direction) - { - case Left: - if (_startPosX - EntityDoubleDeckerBus.Step() >= 0) - _startPosX -= (int)EntityDoubleDeckerBus.Step(); - else - _startPosX = 0; - break; - case Up: - if (_startPosY - EntityDoubleDeckerBus.Step() >= 0) - _startPosY -= (int)EntityDoubleDeckerBus.Step(); - else - _startPosY = 0; - break; - case Right: - if (_startPosX + EntityDoubleDeckerBus.Step() + _busWidth < _pictureWidth) - _startPosX += (int)EntityDoubleDeckerBus.Step(); - else - _startPosX = _pictureWidth - _busWidth; - break; - case Down: - if (_startPosY + EntityDoubleDeckerBus.Step() + _busHeight < _pictureHeight) - _startPosY += (int)EntityDoubleDeckerBus.Step(); - else - _startPosY = _pictureHeight - _busHeight; - break; - } - DrawningDoor.CurX = _startPosX; - DrawningDoor.CurY = _startPosY; - } - - public void DrawTransport() { - Graphics2D g2d = (Graphics2D) DoubleDeckerBusPanel.getGraphics(); - - if (EntityDoubleDeckerBus == null) { - return; - } - - // Границы первого этажа автобуса - g2d.setColor(EntityDoubleDeckerBus.BodyColor()); - g2d.fillRect(_startPosX, _startPosY + 30, 100, 30); - - // Колеса - g2d.setColor(Color.black); - g2d.fillOval(_startPosX + 7, _startPosY + 55, 10, 10); - g2d.fillOval(_startPosX + 77, _startPosY + 55, 10, 10); - - // Окна - g2d.setColor(Color.blue); - g2d.fillOval(_startPosX + 10, _startPosY + 35, 10, 15); - g2d.fillOval(_startPosX + 50, _startPosY + 35, 10, 15); - g2d.fillOval(_startPosX + 70, _startPosY + 35, 10, 15); - g2d.fillOval(_startPosX + 90, _startPosY + 35, 10, 15); - - // двери - DrawningDoor.DrawDoors(); - - // второй этаж - if (EntityDoubleDeckerBus.SecondFloor()) - { - g2d.setColor(EntityDoubleDeckerBus.BodyColor()); - // Границы второго этажа автобуса - g2d.setColor(EntityDoubleDeckerBus.AdditionalColor()); - g2d.fillRect(_startPosX, _startPosY, 100, 30); - - // Окна второго этажа - g2d.setColor(Color.BLUE); - g2d.fillOval(_startPosX + 12, _startPosY + 5, 10, 15); - g2d.fillOval(_startPosX + 30, _startPosY + 5, 10, 15); - g2d.fillOval(_startPosX + 50, _startPosY + 5, 10, 15); - g2d.fillOval(_startPosX + 70, _startPosY + 5, 10, 15); - g2d.fillOval(_startPosX + 90, _startPosY + 5, 10, 15); - } - - // лестница - if (EntityDoubleDeckerBus.Ladder()) - { - if (EntityDoubleDeckerBus.SecondFloor()) { - //Вертикальные прямые - g2d.setColor(Color.black); - g2d.drawLine(_startPosX, _startPosY + 55, _startPosX, _startPosY + 25); - g2d.drawLine(_startPosX + 10, _startPosY + 55, _startPosX + 10, _startPosY + 25); - - //Горизонтальные прямые - g2d.drawLine(_startPosX, _startPosY + 35, _startPosX + 10, _startPosY + 35); - g2d.drawLine(_startPosX, _startPosY + 45, _startPosX + 10, _startPosY + 45); - g2d.drawLine(_startPosX, _startPosY + 55, _startPosX + 10, _startPosY + 55); - } - } - - // полоса между этажами - if (EntityDoubleDeckerBus.LineBetweenFloor()) - { - g2d.setColor(Color.black); - g2d.fillRect(_startPosX, _startPosY + 30, 100, 3); - } - } -} diff --git a/src/EntityDoubleDeckerBus.java b/src/EntityDoubleDeckerBus.java deleted file mode 100644 index 9339cab..0000000 --- a/src/EntityDoubleDeckerBus.java +++ /dev/null @@ -1,62 +0,0 @@ -import java.awt.*; - -public class EntityDoubleDeckerBus { - private int Speed; - private int DoorNumber; - private double Weight; - private Color BodyColor; - private Color AdditionalColor; - private boolean SecondFloor; - private boolean Ladder; - private boolean LineBetweenFloor; - private double Step; - - public int Speed() { - return Speed; - } - - public int DoorNumber() { - return DoorNumber; - } - - public double Weight() { - return Weight; - } - - public Color BodyColor() { - return BodyColor; - } - - public Color AdditionalColor() { - return AdditionalColor; - } - - public boolean SecondFloor() { - return SecondFloor; - } - - public boolean Ladder() { - return Ladder; - } - - public boolean LineBetweenFloor() { - return LineBetweenFloor; - } - - public double Step() { - return Step; - } - - public void Init(int speed, double weight, Color bodyColor, Color additionalColor, - int doorNumber, boolean secondFloor ,boolean ladder, boolean lineBetweenFloor) { - Speed = speed; - Weight = weight; - Step = (double) Speed * 100 / Weight; - BodyColor = bodyColor; - AdditionalColor = additionalColor; - SecondFloor = secondFloor; - DoorNumber = doorNumber; - Ladder = ladder; - LineBetweenFloor = lineBetweenFloor; - } -} diff --git a/src/FormDoubleDeckerBus.java b/src/FormDoubleDeckerBus.java deleted file mode 100644 index 34bec7a..0000000 --- a/src/FormDoubleDeckerBus.java +++ /dev/null @@ -1,94 +0,0 @@ -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.util.Random; -import javax.imageio.ImageIO; -import javax.swing.*; - -public class FormDoubleDeckerBus { - public static void main(String[] args) throws IOException { - JFrame DoubleDeckerBusFrame = new JFrame(); - JPanel DoubleDeckerBusPanel = new JPanel(); - DoubleDeckerBusFrame.setLayout(new BorderLayout()); - DoubleDeckerBusFrame.setSize(900, 500); - DoubleDeckerBusFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - DoubleDeckerBusFrame.setLayout(new BorderLayout(1,1)); - DrawningDoubleDeckerBus DrawningDoubleDeckerBus = new DrawningDoubleDeckerBus(); - DoubleDeckerBusPanel.setLayout(null); - BufferedImage RightIcon = ImageIO.read(new File("Resources/RightArrow.png")); - BufferedImage LeftIcon = ImageIO.read(new File("Resources/LeftArrow.png")); - BufferedImage UpIcon = ImageIO.read(new File("Resources/UpArrow.png")); - BufferedImage DownIcon = ImageIO.read(new File("Resources/DownArrow.png")); - - JButton RightButton = new JButton(new ImageIcon(RightIcon)); - JButton LeftButton = new JButton(new ImageIcon(LeftIcon)); - JButton UpButton = new JButton(new ImageIcon(UpIcon)); - JButton DownButton = new JButton(new ImageIcon(DownIcon)); - JButton CreateButton = new JButton(); - CreateButton.setText("Создать"); - CreateButton.setBounds(12, 401, 90, 40); - RightButton.setBounds(840,411,30,30); - LeftButton.setBounds(768,411,30,30); - UpButton.setBounds(804,375,30,30); - DownButton.setBounds(804,411,30,30); - DoubleDeckerBusPanel.add(CreateButton); - DoubleDeckerBusPanel.add(RightButton); - DoubleDeckerBusPanel.add(LeftButton); - DoubleDeckerBusPanel.add(UpButton); - DoubleDeckerBusPanel.add(DownButton); - DoubleDeckerBusFrame.add(DoubleDeckerBusPanel, BorderLayout.CENTER); - Random random = new Random(); - CreateButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - DrawningDoubleDeckerBus.Init(random.nextInt(100, 300), random.nextDouble(1000, 3000), - Color.getHSBColor(random.nextInt(0, 301), random.nextInt(0, 301), random.nextInt(0, 301)), - Color.getHSBColor(random.nextInt(0, 301), random.nextInt(0, 301), random.nextInt(0, 301)), - random.nextInt(2, 5), DoubleDeckerBusPanel.getWidth(), DoubleDeckerBusPanel.getHeight(), - random.nextBoolean(), random.nextBoolean(), random.nextBoolean(), DoubleDeckerBusPanel); - DrawningDoubleDeckerBus.DrawTransport(); - } - }); - RightButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if(DrawningDoubleDeckerBus.EntityDoubleDeckerBus() == null) - return; - DrawningDoubleDeckerBus.MoveTransport(DirectionType.Right); - DrawningDoubleDeckerBus.DrawTransport(); - } - }); - LeftButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if(DrawningDoubleDeckerBus.EntityDoubleDeckerBus() == null) - return; - DrawningDoubleDeckerBus.MoveTransport(DirectionType.Left); - DrawningDoubleDeckerBus.DrawTransport(); - } - }); - UpButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if(DrawningDoubleDeckerBus.EntityDoubleDeckerBus() == null) - return; - DrawningDoubleDeckerBus.MoveTransport(DirectionType.Up); - DrawningDoubleDeckerBus.DrawTransport(); - } - }); - DownButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if(DrawningDoubleDeckerBus.EntityDoubleDeckerBus() == null) - return; - DrawningDoubleDeckerBus.MoveTransport(DirectionType.Down); - DrawningDoubleDeckerBus.DrawTransport(); - } - }); - - DoubleDeckerBusFrame.setVisible(true); - } -}