diff --git a/OOP/.idea/uiDesigner.xml b/OOP/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/OOP/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OOP/src/DirectionType.java b/OOP/src/DirectionType.java new file mode 100644 index 0000000..d3a2058 --- /dev/null +++ b/OOP/src/DirectionType.java @@ -0,0 +1,6 @@ +public enum DirectionType { + Up, + Down, + Left, + Right +} \ No newline at end of file diff --git a/OOP/src/DrawningElectricLocomotive.java b/OOP/src/DrawningElectricLocomotive.java new file mode 100644 index 0000000..e560f86 --- /dev/null +++ b/OOP/src/DrawningElectricLocomotive.java @@ -0,0 +1,193 @@ +import java.awt.*; +import java.util.Random; + +public class DrawningElectricLocomotive { + private EntityElectricLocomotive entityElectricLocomotive; + public EntityElectricLocomotive getEntityElectricLocomotive() { + return entityElectricLocomotive; + } + private Integer _pictureWidth; + private Integer _pictureHeight; + private Integer _startPosX; + private Integer _startPosY; + private final int _drawingElectricLocomotiveWidth = 100; + private final int _drawingElectricLocomotiveHight = 100; + + public DrawningElectricLocomotiveWheels _drawningElectricLocomotiveWheels; + + public void Init(int speed, double weight, Color bodyColor, Color additionalColor, boolean pantograph, boolean batteryStorage) { + entityElectricLocomotive = new EntityElectricLocomotive(); + entityElectricLocomotive.Init(speed, weight, bodyColor, additionalColor, pantograph, batteryStorage); + _startPosY = null; + _startPosX = null; + _pictureWidth = null; + _pictureHeight = null; + + _drawningElectricLocomotiveWheels = new DrawningElectricLocomotiveWheels(); + Random random = new Random(); + int[] countwheels = {2, 3, 4}; + int wheelCount = countwheels[random.nextInt(countwheels.length)]; + _drawningElectricLocomotiveWheels.setEnumNumber(wheelCount); + + + } + + public void setPosition(int x, int y) { + if (_pictureHeight == null || _pictureWidth == null) + return; + _startPosX = x; + _startPosY = y; + + if (_drawingElectricLocomotiveWidth + x > _pictureWidth || x < 0) { + _startPosX = 0; + } + if (_drawingElectricLocomotiveHight + y > _pictureHeight || y < 0) { + _startPosY = 0; + } + } + + public boolean setPictureSize(int width, int height) { + + if (_drawingElectricLocomotiveHight > height || _drawingElectricLocomotiveWidth > width) + return false; + _pictureHeight = height; + _pictureWidth = width; + + if (_startPosX != null && _startPosY != null) { + if (_startPosX + _drawingElectricLocomotiveWidth > width) + _startPosX = width - _drawingElectricLocomotiveWidth; + if (_startPosY + _drawingElectricLocomotiveHight > height) + _startPosY = height - _drawingElectricLocomotiveHight; + } + return true; + } + + public boolean moveTransport(DirectionType direction) { + if (entityElectricLocomotive == null || _pictureWidth == null || _pictureHeight == null) + return false; + switch (direction) { + case Left: + if (_startPosX - entityElectricLocomotive.Step() > 0) + _startPosX -= (int) entityElectricLocomotive.Step(); + return true; + case Up: + if (_startPosY - entityElectricLocomotive.Step() > 0) + _startPosY -= (int) entityElectricLocomotive.Step(); + return true; + case Right: + if (_startPosX + entityElectricLocomotive.Step() < _pictureWidth - _drawingElectricLocomotiveWidth) + _startPosX += (int) entityElectricLocomotive.Step(); + return true; + case Down: + if (_startPosY + entityElectricLocomotive.Step() < _pictureHeight - _drawingElectricLocomotiveHight) + _startPosY += (int) entityElectricLocomotive.Step(); + return true; + default: + return false; + } + } + + public void DrawTransport(Graphics g){ + if (entityElectricLocomotive == null || _startPosX == null || _startPosY == null) { + return; + } + + Graphics2D g2d = (Graphics2D) g; + _drawningElectricLocomotiveWheels.drawElectricLocomotiveWheels(g, Color.BLACK, _startPosX, _startPosY); + Point[] Body = new Point[]{ + new Point(_startPosX + 20,_startPosY + 20), + new Point(_startPosX, _startPosY + 25 + 20), + new Point(_startPosX , _startPosY + 50 + 20), + new Point(_startPosX + 100 , _startPosY + 50 + 20), + new Point(_startPosX + 100, _startPosY + 25 + 20), + new Point(_startPosX + 105, _startPosY + 20), + }; + + Polygon BodyPolygon = new Polygon(); + for(Point point:Body){ + BodyPolygon.addPoint(point.x, point.y); + } + g2d.setColor(entityElectricLocomotive.getBodyColor()); + g2d.fillPolygon(BodyPolygon); + + + Point[] line = new Point[]{ + new Point(_startPosX, _startPosY + 25 + 20), + new Point(_startPosX, _startPosY + 30 + 20), + new Point(_startPosX + 100, _startPosY + 30 + 20), + new Point(_startPosX + 100, _startPosY + 25 + 20), + }; + Polygon linePolugon = new Polygon(); + for(Point point: line){ + linePolugon.addPoint(point.x, point.y); + } + g2d.setColor(entityElectricLocomotive.getAdditionalColor()); + g2d.fillPolygon(linePolugon); + + + Point[] glass = new Point[]{ + new Point(_startPosX + 20, _startPosY + 2 + 20), + new Point(_startPosX + 6 , _startPosY + 20 + 20), + new Point(_startPosX + 20, _startPosY + 20 + 20), + new Point(_startPosX + 20, _startPosY + 2 + 20) + }; + Polygon glassPolygon = new Polygon(); + for(Point point: glass){ + glassPolygon.addPoint(point.x, point.y); + } + g2d.setColor(Color.WHITE); + g2d.fillPolygon(glassPolygon); + + + if(entityElectricLocomotive.getBatteryStorage()){ + int mod = 50; + Point[] battery = new Point[]{ + new Point(_startPosX + 40/2 + mod, _startPosY + 2+ 20), + new Point(_startPosX + 40/2 + mod, _startPosY + 4+ 20), + new Point(_startPosX + 35/2 + mod , _startPosY + 4+ 20), + new Point(_startPosX + 35/2 + mod, _startPosY + 16+ 20), + new Point(_startPosX + 60/2 + mod, _startPosY + 16+ 20), + new Point(_startPosX + 60/2 + mod, _startPosY + 4+ 20), + new Point(_startPosX + 55/2 + mod, _startPosY + 4+ 20), + new Point(_startPosX + 55/2 + mod, _startPosY + 2+ 20), + }; + mod += 20; + Point[] battery2 = new Point[]{ + new Point(_startPosX + 40/2 + mod, _startPosY + 2+ 20), + new Point(_startPosX + 40/2 + mod, _startPosY + 4+ 20), + new Point(_startPosX + 35/2 + mod , _startPosY + 4+ 20), + new Point(_startPosX + 35/2 + mod, _startPosY + 16+ 20), + new Point(_startPosX + 60/2 + mod, _startPosY + 16+ 20), + new Point(_startPosX + 60/2 + mod, _startPosY + 4+ 20), + new Point(_startPosX + 55/2 + mod, _startPosY + 4+ 20), + new Point(_startPosX + 55/2 + mod, _startPosY + 2+ 20), + }; + + Polygon batteryPolygon = new Polygon(); + for(Point points : battery){ + batteryPolygon.addPoint(points.x, points.y); + } + Polygon battery2Polygon = new Polygon(); + for(Point points : battery2){ + battery2Polygon.addPoint(points.x, points.y); + } + g2d.setColor(Color.YELLOW); + g2d.fillPolygon(batteryPolygon); + g2d.fillPolygon(battery2Polygon); + } + if(entityElectricLocomotive.getPantograph()){ + g2d.setColor(Color.BLACK); + g.drawRect(_startPosX + 40,_startPosY,10,1); + g.drawRect(_startPosX + 5 + 40, _startPosY ,1,20); + + g.drawRect(_startPosX + 40 + 30,_startPosY,10,1); + g.drawRect(_startPosX + 5 + 40 + 30, _startPosY ,1,20); + + } + + + + } + + +} diff --git a/OOP/src/DrawningElectricLocomotiveWheels.java b/OOP/src/DrawningElectricLocomotiveWheels.java new file mode 100644 index 0000000..a403e62 --- /dev/null +++ b/OOP/src/DrawningElectricLocomotiveWheels.java @@ -0,0 +1,51 @@ +import java.awt.*; + +public class DrawningElectricLocomotiveWheels { + private WheelsCount _wheelCount; + public void setEnumNumber(int wheelCount) { + for (WheelsCount value : WheelsCount.values()) { + if (value.getEnumNumber() == wheelCount) { + _wheelCount = value; + return; + } + } + } + public void drawElectricLocomotiveWheels(Graphics g, Color color, int startPosX, int startPosY) { + Graphics2D g2d = (Graphics2D) g; + g2d.setColor(color); + g2d.setStroke(new BasicStroke(4)); + + if (_wheelCount.getEnumNumber() >= 2){ + g2d.drawOval(startPosX, startPosY + 70,10,10); + g2d.drawOval(startPosX+ 10, startPosY + 70,10,10); + + g2d.drawOval(startPosX + 50, startPosY + 70,10,10); + g2d.drawOval(startPosX+ 10 + 50, startPosY + 70,10,10); + + } + + if (_wheelCount.getEnumNumber() >= 3){ + g2d.drawOval(startPosX, startPosY + 70,10,10); + g2d.drawOval(startPosX+ 10, startPosY + 70,10,10); + g2d.drawOval(startPosX+ 10 +10, startPosY + 70,10,10); + + g2d.drawOval(startPosX + 50, startPosY + 70,10,10); + g2d.drawOval(startPosX + 10 + 50, startPosY + 70,10,10); + g2d.drawOval(startPosX + 10 + 10 + 50, startPosY + 70,10,10); + } + + if (_wheelCount.getEnumNumber() >= 4){ + g2d.drawOval(startPosX, startPosY + 70,10,10); + g2d.drawOval(startPosX+ 10, startPosY + 70,10,10); + g2d.drawOval(startPosX+ 10 +10, startPosY + 70,10,10); + g2d.drawOval(startPosX+ 10 +10 + 10, startPosY + 70,10,10); + + g2d.drawOval(startPosX + 50, startPosY + 70,10,10); + g2d.drawOval(startPosX + 10 + 50, startPosY + 70,10,10); + g2d.drawOval(startPosX + 10 + 10 + 50, startPosY + 70,10,10); + g2d.drawOval(startPosX + 10 + 10 + 10 + 50, startPosY + 70,10,10); + } + + } +} + diff --git a/OOP/src/FormElectricLocomotive.form b/OOP/src/FormElectricLocomotive.form new file mode 100644 index 0000000..137ff13 --- /dev/null +++ b/OOP/src/FormElectricLocomotive.form @@ -0,0 +1,131 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/OOP/src/FormElectricLocomotive.java b/OOP/src/FormElectricLocomotive.java new file mode 100644 index 0000000..1dd2a7d --- /dev/null +++ b/OOP/src/FormElectricLocomotive.java @@ -0,0 +1,177 @@ + +import Drawnings.DrawningElectricLocomotive; +import Drawnings.DrawningLocomotive; +import MovementStrategy.*; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.LinkedList; +import java.util.Random; +import java.util.List; + +public class FormElectricLocomotive extends JFrame { + protected DrawningLocomotive _drawningLocomotive; + JPanel PanelWrapper; + private JPanel PictureBox; + private JButton buttonCreateElectricLocomotive; + private JButton buttonCreateLocomotive; + private JButton buttonRight; + private JButton buttonDown; + private JButton buttonLeft; + private JButton buttonUp; + private JComboBox comboBoxStrategy; + private JButton buttonStrategyStep; + private AbstractStrategy _strategy; + private List controls; + + private void createObject(String type) { + Random random = new Random(); + switch (type) { + case "Drawnings.DrawningLocomotive": + _drawningLocomotive = new DrawningLocomotive(50, 100, + new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)), random.nextInt(3)); + break; + case "Drawnings.DrawningElectricLocomotive": + _drawningLocomotive = new DrawningElectricLocomotive(50, 100, + new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)),random.nextInt(3), + new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)), + random.nextBoolean(), random.nextBoolean()); + break; + default: + return; + } + _drawningLocomotive.setPictureSize(PictureBox.getWidth(), PictureBox.getHeight()); + _drawningLocomotive.setPosition(random.nextInt(100), + random.nextInt(100)); + _strategy = null; + comboBoxStrategy.setEnabled(true); + + Draw(); + } + + public FormElectricLocomotive() { + buttonUp.setName("buttonUp"); + buttonDown.setName("buttonDown"); + buttonLeft.setName("buttonLeft"); + buttonRight.setName("buttonRight"); + + InitializeControlsRepaintList(); + + buttonCreateElectricLocomotive.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + createObject("Drawnings.DrawningElectricLocomotive"); + + } + }); + buttonCreateLocomotive.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + createObject("Drawnings.DrawningLocomotive"); + } + }); + ActionListener buttonMoveClickedListener = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + String buttonName = ((JButton) e.getSource()).getName(); + boolean result = false; + + switch (buttonName) { + case "buttonUp": { + result = _drawningLocomotive.moveTransport(MovementDirection.Up); + } + break; + case "buttonDown": { + result = _drawningLocomotive.moveTransport(MovementDirection.Down); + } + break; + case "buttonLeft": { + result = _drawningLocomotive.moveTransport(MovementDirection.Left); + } + break; + case "buttonRight": { + result = _drawningLocomotive.moveTransport(MovementDirection.Right); + } + break; + } + if (result) + Draw(); + } + }; + buttonRight.addActionListener(buttonMoveClickedListener); + buttonDown.addActionListener(buttonMoveClickedListener); + buttonLeft.addActionListener(buttonMoveClickedListener); + buttonUp.addActionListener(buttonMoveClickedListener); + comboBoxStrategy.addItem("К центру"); + comboBoxStrategy.addItem("К краю"); + buttonStrategyStep.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (_drawningLocomotive == null) + return; + if (comboBoxStrategy.isEnabled()) { + switch (comboBoxStrategy.getSelectedIndex()) { + case 0: + _strategy = new MoveToCenter(); + break; + case 1: + _strategy = new MoveToBorder(); + break; + + default: + _strategy = null; + break; + + } + if (_strategy == null) { + return; + } + _strategy.SetData(new MoveableLocomotive(_drawningLocomotive), PictureBox.getWidth(), PictureBox.getHeight()); + } + if (_strategy == null) { + return; + } + _strategy.MakeStep(); + Draw(); + comboBoxStrategy.setEnabled(false); + + if (_strategy.GetStatus() == StrategyStatus.Finish) { + comboBoxStrategy.setEnabled(true); + _strategy = null; + } + } + }); + } + private void Draw() { + if (_drawningLocomotive.getEntityLocomotive() == null) + return; + if (PictureBox.getWidth() == 0 || PictureBox.getHeight() == 0) { + return; + } + Graphics g = PictureBox.getGraphics(); + g.setColor(PictureBox.getBackground()); + g.fillRect(0,0, PictureBox.getWidth(), PictureBox.getHeight()); + _drawningLocomotive.DrawTransport(g); + + RepaintControls(); + } + private void RepaintControls() { + for (JComponent control : controls) { + control.repaint(); + } + } + + private void InitializeControlsRepaintList() { + controls = new LinkedList<>(); + controls.add(buttonCreateElectricLocomotive); + controls.add(buttonCreateLocomotive); + controls.add(buttonUp); + controls.add(buttonDown); + controls.add(buttonLeft); + controls.add(buttonRight); + controls.add(comboBoxStrategy); + controls.add(buttonStrategyStep); + } +} \ No newline at end of file