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