From 61435bd7d281de06b4f687eec69f7db6e11b7956 Mon Sep 17 00:00:00 2001 From: sonyazubkova Date: Tue, 7 May 2024 16:48:56 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=20=E2=84=962?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/src/DrawingGasolineTanker.java | 192 ---------------- .../{ => Drawings}/CanvasGasolineTanker.java | 7 +- src/src/{ => Drawings}/DirectionType.java | 3 + src/src/Drawings/DrawingGasolineTanker.java | 48 ++++ src/src/Drawings/DrawingTruck.java | 207 ++++++++++++++++++ .../{ => Entities}/EntityGasolineTanker.java | 27 +-- src/src/Entities/EntityTruck.java | 25 +++ src/src/FormGasolineTanker.form | 47 +++- src/src/FormGasolineTanker.java | 137 +++++++++--- .../MovementStrategy/AbstractStrategy.java | 63 ++++++ .../MovementStrategy/IMoveableObjects.java | 7 + src/src/MovementStrategy/MoveToBorder.java | 47 ++++ src/src/MovementStrategy/MoveToCenter.java | 40 ++++ src/src/MovementStrategy/MoveableTruck.java | 44 ++++ .../MovementStrategy/MovementDirection.java | 8 + .../MovementStrategy/ObjectParameters.java | 27 +++ src/src/MovementStrategy/StrategyStatus.java | 7 + src/src/Wheels/DrawingOrnamentHeart.java | 82 +++++++ src/src/Wheels/DrawingOrnamentSquare.java | 82 +++++++ src/src/{ => Wheels}/DrawingWheels.java | 12 +- src/src/Wheels/IDrawingWheels.java | 7 + src/src/{ => Wheels}/NumWheels.java | 2 + 22 files changed, 866 insertions(+), 255 deletions(-) delete mode 100644 src/src/DrawingGasolineTanker.java rename src/src/{ => Drawings}/CanvasGasolineTanker.java (69%) rename src/src/{ => Drawings}/DirectionType.java (81%) create mode 100644 src/src/Drawings/DrawingGasolineTanker.java create mode 100644 src/src/Drawings/DrawingTruck.java rename src/src/{ => Entities}/EntityGasolineTanker.java (50%) create mode 100644 src/src/Entities/EntityTruck.java create mode 100644 src/src/MovementStrategy/AbstractStrategy.java create mode 100644 src/src/MovementStrategy/IMoveableObjects.java create mode 100644 src/src/MovementStrategy/MoveToBorder.java create mode 100644 src/src/MovementStrategy/MoveToCenter.java create mode 100644 src/src/MovementStrategy/MoveableTruck.java create mode 100644 src/src/MovementStrategy/MovementDirection.java create mode 100644 src/src/MovementStrategy/ObjectParameters.java create mode 100644 src/src/MovementStrategy/StrategyStatus.java create mode 100644 src/src/Wheels/DrawingOrnamentHeart.java create mode 100644 src/src/Wheels/DrawingOrnamentSquare.java rename src/src/{ => Wheels}/DrawingWheels.java (91%) create mode 100644 src/src/Wheels/IDrawingWheels.java rename src/src/{ => Wheels}/NumWheels.java (76%) diff --git a/src/src/DrawingGasolineTanker.java b/src/src/DrawingGasolineTanker.java deleted file mode 100644 index 6d557e7..0000000 --- a/src/src/DrawingGasolineTanker.java +++ /dev/null @@ -1,192 +0,0 @@ -import java.awt.*; -public class DrawingGasolineTanker { - public EntityGasolineTanker EntityGasolineTanker; - private DrawingWheels drawingWheels = null; - - // Ширина окна - private Integer _pictureWidth; - - // Высота окна - private Integer _pictureHeight; - - // Левая координата прорисовки бензовоза - private Integer _startPosX; - - // Верхняя координата прорисовки бензовоза - private Integer _startPosY; - - // Ширина прорисовки бензовоза - private int _drawingGasolineTankerWidth = 105; - - // Высота прорисовки бензовоза - private int _drawingGasolineTankerHeight = 70; - - public void Init(int speed, double weight, Color bodyColor, Color additionalColor, boolean gasTank, boolean signalBeacon, int numWheels) - { - EntityGasolineTanker = new EntityGasolineTanker(); - EntityGasolineTanker.Init(speed, weight, bodyColor, additionalColor, gasTank, signalBeacon); - _pictureWidth = null; - _pictureHeight = null; - _startPosX = null; - _startPosY = null; - drawingWheels = new DrawingWheels(); - drawingWheels.setNumWheels(numWheels); - } - - // Установка границ поля - public boolean SetPictureSize(int width, int height) - { - // Проверка "влезает" ли объект в размеры поля - if (_drawingGasolineTankerWidth > width || _drawingGasolineTankerHeight > height) - { - return false; - } - _pictureWidth = width; - _pictureHeight = height; - - if (_startPosX != null || _startPosY != null) - { - if (_drawingGasolineTankerWidth + _startPosX > _pictureWidth) - { - _startPosX = _pictureWidth - _drawingGasolineTankerWidth; - } - else if (_startPosX < 0) - { - _startPosX = 0; - } - if (_drawingGasolineTankerHeight + _startPosY > _pictureHeight) - { - _startPosY = _pictureHeight - _drawingGasolineTankerHeight; - } - else if (_startPosY < 0) - { - _startPosY = 0; - } - } - return true; - } - - // Установка позиции - public void SetPosition(int x, int y) - { - if (!(_pictureHeight != null && _pictureWidth != null)) - { - return; - } - if (x >= 0 && x + _drawingGasolineTankerWidth <= _pictureWidth && y >= 0 && y + _drawingGasolineTankerHeight <= _pictureHeight) - { - _startPosX = x; - _startPosY = y; - - } - if (x < 0) - { - _startPosX = 0; - } - if (y < 0) - { - _startPosY = 0; - } - if (x + _drawingGasolineTankerWidth > _pictureWidth) - { - _startPosX = _drawingGasolineTankerWidth - _pictureWidth; - } - if (y + _drawingGasolineTankerHeight > _pictureHeight) - { - _startPosY = _drawingGasolineTankerHeight - _pictureHeight; - } - } - - // Изменение направления - public boolean MoveTransport(DirectionType direction) - { - if (EntityGasolineTanker == null || _startPosX == null || _startPosY == null) - { - return false; - - } - switch(direction) - { - // влево - case Left: - if (_startPosX - EntityGasolineTanker.Step > 0) - { - _startPosX -= (int)EntityGasolineTanker.Step; - } - return true; - // вверх - case Up: - if (_startPosY - EntityGasolineTanker.Step > 0) - { - _startPosY -= (int)EntityGasolineTanker.Step; - } - return true; - // вправо - case Right: - if (_startPosX + EntityGasolineTanker.Step + _drawingGasolineTankerWidth < _pictureWidth) - { - _startPosX += (int)EntityGasolineTanker.Step; - } - return true; - // вниз - case Down: - if (_startPosY + EntityGasolineTanker.Step + _drawingGasolineTankerHeight < _pictureHeight) - { - _startPosY += (int)EntityGasolineTanker.Step; - } - return true; - default: - return false; - - } - } - - // Прорисовка объекта - public void DrawTransport(Graphics2D g) - { - if (EntityGasolineTanker == null || _startPosX == null || _startPosY == null) - { - return; - } - - // бензобак - if (EntityGasolineTanker.getGasTank()) - { - g.setColor(Color.BLACK); - g.drawOval(_startPosX + 7, _startPosY + 18, 31, 31); - g.drawOval(_startPosX + 47, _startPosY + 18, 31, 31); - g.drawRect(_startPosX + 20, _startPosY+ 20, 45, 30); - - g.setColor(EntityGasolineTanker.getAdditionalColor()); - g.fillOval(_startPosX + 7, _startPosY+18, 31, 31); - g.fillOval( _startPosX+ 47, _startPosY + 18, 31, 31); - g.fillRect(_startPosX + 20, _startPosY+ 18, 45, 30); - - } - // сигнальный маяк - if (EntityGasolineTanker.getSignalBeacon()) - { - g.setColor(Color.BLACK); - g.drawRect(_startPosX + 85, _startPosY + 10, 7, 7); - g.setColor(EntityGasolineTanker.getAdditionalColor()); - g.fillRect( _startPosX + 85, _startPosY + 10, 7, 7); - - } - - // колеса - drawingWheels.drawWheels(g, Color.BLACK, _startPosX, _startPosY); - - // нижняя платформа - g.setColor(EntityGasolineTanker.getBodyColor()); - g.fillRect(_startPosX + 5, _startPosY + 40, 100, 10); - g.setColor(Color.BLACK); - g.drawRect(_startPosX + 5, _startPosY + 40, 100, 10); - - - // кабина - g.setColor(Color.BLUE); - g.fillRect(_startPosX + 80, _startPosY + 15, 25, 25); - g.setColor(Color.BLACK); - g.drawRect(_startPosX + 80, _startPosY + 15, 25, 25); - } -} diff --git a/src/src/CanvasGasolineTanker.java b/src/src/Drawings/CanvasGasolineTanker.java similarity index 69% rename from src/src/CanvasGasolineTanker.java rename to src/src/Drawings/CanvasGasolineTanker.java index 1f5c8a1..8650e0f 100644 --- a/src/src/CanvasGasolineTanker.java +++ b/src/src/Drawings/CanvasGasolineTanker.java @@ -1,15 +1,16 @@ +package Drawings; import javax.swing.*; import java.awt.*; public class CanvasGasolineTanker extends JComponent{ - public DrawingGasolineTanker _gasolineTanker; + public DrawingTruck _drawingTruck; public CanvasGasolineTanker(){} public void paintComponent(Graphics g) { - if (_gasolineTanker == null) { + if (_drawingTruck == null) { return; } super.paintComponents(g); Graphics2D g2d = (Graphics2D) g; - _gasolineTanker.DrawTransport(g2d); + _drawingTruck.DrawTransport(g2d); super.repaint(); } } diff --git a/src/src/DirectionType.java b/src/src/Drawings/DirectionType.java similarity index 81% rename from src/src/DirectionType.java rename to src/src/Drawings/DirectionType.java index 7672b37..829b97e 100644 --- a/src/src/DirectionType.java +++ b/src/src/Drawings/DirectionType.java @@ -1,4 +1,7 @@ +package Drawings; + public enum DirectionType { + Unknow, //Вверх Up, //Вниз diff --git a/src/src/Drawings/DrawingGasolineTanker.java b/src/src/Drawings/DrawingGasolineTanker.java new file mode 100644 index 0000000..7e0d75d --- /dev/null +++ b/src/src/Drawings/DrawingGasolineTanker.java @@ -0,0 +1,48 @@ +package Drawings; +import Entities.EntityGasolineTanker; +import Wheels.IDrawingWheels; + +import java.awt.*; + +public class DrawingGasolineTanker extends DrawingTruck{ + private IDrawingWheels drawingWheels; + + public DrawingGasolineTanker(int speed, double weight, Color bodyColor, Color additionalColor, boolean gasTank, boolean signalBeacon, int number) { + super(105,70); + EntityTruck = new EntityGasolineTanker(speed, weight, bodyColor, additionalColor, gasTank, signalBeacon, number); + DrawWheels(); + } + @Override + public void DrawTransport(Graphics2D g) { + if (EntityTruck == null || !(EntityTruck instanceof EntityGasolineTanker gasolineTanker) || _startPosX == null || _startPosY == null) { + return; + } + + // бензобак + if (gasolineTanker.GasTank) { + g.setColor(Color.BLACK); + g.drawOval(_startPosX + 7, _startPosY + 18, 31, 31); + g.drawOval(_startPosX + 47, _startPosY + 18, 31, 31); + g.drawRect(_startPosX + 20, _startPosY + 20, 45, 30); + + g.setColor(gasolineTanker.getAdditionalColor()); + g.fillOval(_startPosX + 7, _startPosY + 18, 31, 31); + g.fillOval(_startPosX + 47, _startPosY + 18, 31, 31); + g.fillRect(_startPosX + 20, _startPosY + 18, 45, 30); + + } + super.DrawTransport(g); // Обращение к методу DrawTransport базового класса + // сигнальный маяк + if (gasolineTanker.SignalBeacon) { + g.setColor(Color.BLACK); + g.drawRect(_startPosX + 85, _startPosY + 8, 7, 7); + g.setColor(gasolineTanker.getAdditionalColor()); + g.fillRect(_startPosX + 85, _startPosY + 8, 7, 7); + + } + + } + } + + + diff --git a/src/src/Drawings/DrawingTruck.java b/src/src/Drawings/DrawingTruck.java new file mode 100644 index 0000000..4db358e --- /dev/null +++ b/src/src/Drawings/DrawingTruck.java @@ -0,0 +1,207 @@ +package Drawings; +import Entities.EntityTruck; +import Wheels.DrawingOrnamentSquare; +import Wheels.DrawingOrnamentHeart; +import Wheels.DrawingWheels; +import Wheels.IDrawingWheels; + +import javax.swing.*; +import java.awt.*; + +public class DrawingTruck extends JPanel{ + private IDrawingWheels drawingWheels; + public Entities.EntityTruck EntityTruck; + // Ширина окна + private Integer _pictureWidth; + + // Высота окна + private Integer _pictureHeight; + + // Левая координата прорисовки бензовоза + protected Integer _startPosX; + + // Верхняя координата прорисовки бензовоза + protected Integer _startPosY; + + // Ширина прорисовки бензовоза + protected int _drawingTruckWidth = 105; + + // Высота прорисовки бензовоза + protected int _drawingTruckHeight = 70; + + public Integer GetPosX() {return _startPosX;} + public Integer GetPosY() {return _startPosY;} + public Integer GetWidth() {return _drawingTruckWidth;} + public Integer GetHeight() {return _drawingTruckHeight;} + + protected void DrawWheels() { + int number = (int)(Math.random() * 4 + 0); + switch ((int)(Math.random() * 3 + 1)) { + case 1: + drawingWheels = new DrawingWheels(); + break; + case 2: + drawingWheels = new DrawingOrnamentSquare(); + break; + case 3: + drawingWheels = new DrawingOrnamentHeart(); + break; + default: + number = 0; + break; + } + drawingWheels.setNumWheels(number); + } + protected DrawingTruck(){ + _pictureWidth = null; + _pictureHeight = null; + _startPosX = null; + _startPosY = null; + } + + public DrawingTruck(int speed, double weight, Color bodyColor, int number){ + super(); + EntityTruck = new EntityTruck(speed, weight, bodyColor); + DrawWheels(); + + } + + protected DrawingTruck(int drawingTruckWidth, int drawingTruckHeight) + { + _drawingTruckWidth = drawingTruckWidth; + _drawingTruckHeight = drawingTruckHeight; + + } + + // Установка границ поля + public boolean SetPictureSize(int width, int height) + { + // Проверка "влезает" ли объект в размеры поля + if (_drawingTruckWidth > width || _drawingTruckHeight > height) + { + return false; + } + _pictureWidth = width; + _pictureHeight = height; + + if (_startPosX != null || _startPosY != null) + { + if (_drawingTruckWidth + _startPosX > _pictureWidth) + { + _startPosX = _pictureWidth - _drawingTruckWidth; + } + else if (_startPosX < 0) + { + _startPosX = 0; + } + if (_drawingTruckHeight + _startPosY > _pictureHeight) + { + _startPosY = _pictureHeight - _drawingTruckHeight; + } + else if (_startPosY < 0) + { + _startPosY = 0; + } + } + return true; + } + + // Установка позиции + public void SetPosition(int x, int y) + { + if (!(_pictureHeight != null && _pictureWidth != null)) + { + return; + } + if (x >= 0 && x + _drawingTruckWidth <= _pictureWidth && y >= 0 && y + _drawingTruckHeight <= _pictureHeight) + { + _startPosX = x; + _startPosY = y; + + } + if (x < 0) + { + _startPosX = 0; + } + if (y < 0) + { + _startPosY = 0; + } + if (x + _drawingTruckWidth > _pictureWidth) + { + _startPosX = _drawingTruckWidth - _pictureWidth; + } + if (y + _drawingTruckHeight > _pictureHeight) + { + _startPosY = _drawingTruckHeight - _pictureHeight; + } + } + + // Изменение направления + public boolean MoveTransport(DirectionType direction) + { + if (EntityTruck == null || _startPosX == null || _startPosY == null) + { + return false; + + } + switch(direction) + { + // влево + case Left: + if (_startPosX - EntityTruck.Step > 0) + { + _startPosX -= (int)EntityTruck.Step; + } + return true; + // вверх + case Up: + if (_startPosY - EntityTruck.Step > 0) + { + _startPosY -= (int)EntityTruck.Step; + } + return true; + // вправо + case Right: + if (_startPosX + EntityTruck.Step + _drawingTruckWidth < _pictureWidth) + { + _startPosX += (int)EntityTruck.Step; + } + return true; + // вниз + case Down: + if (_startPosY + EntityTruck.Step + _drawingTruckHeight < _pictureHeight) + { + _startPosY += (int)EntityTruck.Step; + } + return true; + default: + return false; + + } + } + + // Прорисовка объекта + public void DrawTransport(Graphics2D g) + { + if (EntityTruck == null || _startPosX == null || _startPosY == null) + { + return; + } + // колеса + drawingWheels.drawWheels(g, Color.BLACK, _startPosX, _startPosY); + + // нижняя платформа + g.setColor(EntityTruck.getBodyColor()); + g.fillRect(_startPosX + 5, _startPosY + 40, 100, 10); + g.setColor(Color.BLACK); + g.drawRect(_startPosX + 5, _startPosY + 40, 100, 10); + + // кабина + g.setColor(Color.BLUE); + g.fillRect(_startPosX + 80, _startPosY + 15, 25, 25); + g.setColor(Color.BLACK); + g.drawRect(_startPosX + 80, _startPosY + 15, 25, 25); + + } +} diff --git a/src/src/EntityGasolineTanker.java b/src/src/Entities/EntityGasolineTanker.java similarity index 50% rename from src/src/EntityGasolineTanker.java rename to src/src/Entities/EntityGasolineTanker.java index fdb6ddb..2bfc94f 100644 --- a/src/src/EntityGasolineTanker.java +++ b/src/src/Entities/EntityGasolineTanker.java @@ -1,37 +1,24 @@ +package Entities; + import java.awt.*; -public class EntityGasolineTanker { - // Скорость - private int Speed; - - // Вес - private double Weight; - - // Основной цвет - private Color BodyColor; - public Color getBodyColor() {return BodyColor;} +public class EntityGasolineTanker extends EntityTruck{ // Дополнительный цвет(для опциональныз элементов) public Color AdditionalColor; public Color getAdditionalColor() {return AdditionalColor;} // Признак (опция) наличия бака под бензин - private boolean GasTank; + public boolean GasTank; public boolean getGasTank() {return GasTank;} // Признак (опция) наличия сигнального маяка на кабине - private boolean SignalBeacon; + public boolean SignalBeacon; public boolean getSignalBeacon() {return SignalBeacon;} - // Шаг перемещения бензовоза - public double Step; - - public void Init(int speed, double weight, Color bodyColor, Color additionalColor, boolean signalBeacon, boolean gasTank){ - Speed = speed; - Weight = weight; - BodyColor = bodyColor; + public EntityGasolineTanker(int speed, double weight, Color bodyColor, Color additionalColor, boolean signalBeacon, boolean gasTank, int numWheels){ + super(speed, weight, bodyColor); AdditionalColor = additionalColor; GasTank = gasTank; SignalBeacon = signalBeacon; - Step = Speed * 700 / Weight; } } diff --git a/src/src/Entities/EntityTruck.java b/src/src/Entities/EntityTruck.java new file mode 100644 index 0000000..a68b5fc --- /dev/null +++ b/src/src/Entities/EntityTruck.java @@ -0,0 +1,25 @@ +package Entities; +import java.awt.*; + +public class EntityTruck { + // Скорость + private int Speed; + + // Вес + private double Weight; + + // Основной цвет + private Color BodyColor; + public Color getBodyColor() {return BodyColor;} + + // Шаг перемещения бензовоза + public double Step; + + public EntityTruck(int speed, double weight, Color bodyColor){ + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + Step = Speed * 200 / Weight; + } + +} diff --git a/src/src/FormGasolineTanker.form b/src/src/FormGasolineTanker.form index a2fef13..0311adc 100644 --- a/src/src/FormGasolineTanker.form +++ b/src/src/FormGasolineTanker.form @@ -1,29 +1,29 @@
- + - + - + - + - + - + - + @@ -32,7 +32,7 @@ - + @@ -41,7 +41,7 @@ - + @@ -50,13 +50,40 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/src/FormGasolineTanker.java b/src/src/FormGasolineTanker.java index 83da9c4..fc78a60 100644 --- a/src/src/FormGasolineTanker.java +++ b/src/src/FormGasolineTanker.java @@ -1,3 +1,8 @@ +import Drawings.CanvasGasolineTanker; +import Drawings.DirectionType; +import Drawings.DrawingGasolineTanker; +import Drawings.DrawingTruck; +import MovementStrategy.*; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; @@ -9,11 +14,44 @@ public class FormGasolineTanker extends JFrame{ private int Width; private int Height; private CanvasGasolineTanker canvasGasolineTanker = new CanvasGasolineTanker(); - private JButton buttonCreate = new JButton("Создание"); + private JButton buttonCreateTruck = new JButton("Создать грузовик"); private JButton buttonRight = new JButton(); private JButton buttonLeft = new JButton(); private JButton buttonDown = new JButton(); private JButton buttonUp = new JButton(); + private AbstractStrategy _strategy; + private JButton buttonCreateGasolineTanker = new JButton("Создать бензовоз"); + private JComboBox comboBoxStrategy = new JComboBox(new String[] {"К центру", "К краю"}); + private JButton buttonStrategy = new JButton("Шаг"); + + private void CreateObject(String typeOfClass){ + int StartPositionX = 10 + (int)(Math.random() *((100-10) +1)); + int StartPositionY = 10 + (int)(Math.random() *((100-10) +1)); + int speed = 10 + (int)(Math.random() *((100-10) +1)); + double weight = 1000 + (double)(Math.random() *((5000-1000) +1)); + Color bodyColor = new Color((int) (Math.random() * ((256) + 1)), (int) (Math.random() * ((256) + 1)), (int) (Math.random() * ((256) + 1))); + int number = new Random().nextInt(3)+1; + switch (typeOfClass){ + case "DrawingTruck": + canvasGasolineTanker._drawingTruck = new DrawingTruck(speed, weight, bodyColor, number); + canvasGasolineTanker._drawingTruck.SetPictureSize(Width,Height); + canvasGasolineTanker._drawingTruck.SetPosition(StartPositionX, StartPositionY); + canvasGasolineTanker.repaint(); + break; + case "DrawingGasolineTanker": + Color additionalColor = new Color((int)(Math.random() * 255 + 0),(int)(Math.random() * 255 + 0),(int)(Math.random() * 255 + 0)); + boolean gasTank = new Random().nextBoolean(); + boolean signalBeacon = new Random().nextBoolean(); + canvasGasolineTanker._drawingTruck = new DrawingGasolineTanker(speed, weight, bodyColor, additionalColor, signalBeacon, gasTank, number); + canvasGasolineTanker._drawingTruck.SetPictureSize(Width,Height); + canvasGasolineTanker._drawingTruck.SetPosition(StartPositionX, StartPositionY); + canvasGasolineTanker.repaint(); + break; + default: return; + } + _strategy = null; + comboBoxStrategy.setEnabled(true); + } public void Init(){ setTitle("Бензовоз"); @@ -22,8 +60,10 @@ public class FormGasolineTanker extends JFrame{ Width = getWidth(); Height = getHeight(); + _strategy = null; - buttonCreate.setName("CREATE"); + buttonCreateTruck.setName("CREATETRUCK"); + buttonCreateGasolineTanker.setName("CREATEGASOLINETANKER"); buttonUp.setName("buttonUp"); Icon iconUp = new ImageIcon("src\\src\\resources\\Up.jpg"); @@ -41,43 +81,71 @@ public class FormGasolineTanker extends JFrame{ Icon iconRight = new ImageIcon("src\\src\\resources\\Right.jpg"); buttonRight.setIcon(iconRight); - buttonCreate.addActionListener(new ActionListener() { + buttonCreateTruck.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - int StartPositionX = 10 + (int)(Math.random() * 90); - int StartPositionY = 10 + (int)(Math.random() * 90); - int speed = 10 + (int)(Math.random() * 90); - double weight = 1000 + (double)(Math.random() * 5000); - Color bodyColor = new Color((int)(Math.random() * 255 + 0), (int)(Math.random() * 255 + 0), (int) (Math.random() * 255 + 0)); - Color additionalColor = new Color((int)(Math.random() * 255 + 0), (int)(Math.random() * 255 + 0), (int) (Math.random() * 255 + 0)); - boolean gasTank = new Random().nextBoolean(); - boolean signalBeacon = new Random().nextBoolean(); - int wheelsNum = new Random().nextInt(3)+1; - canvasGasolineTanker._gasolineTanker = new DrawingGasolineTanker(); - canvasGasolineTanker._gasolineTanker.Init(speed, weight, bodyColor, additionalColor, gasTank, signalBeacon, wheelsNum); - canvasGasolineTanker._gasolineTanker.SetPictureSize(Width, Height); - canvasGasolineTanker._gasolineTanker.SetPosition(StartPositionX, StartPositionY); - canvasGasolineTanker.repaint(); + CreateObject("DrawingTruck"); + } + }); + buttonCreateGasolineTanker.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + CreateObject("DrawingGasolineTanker"); + } + }); + + buttonStrategy.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (canvasGasolineTanker._drawingTruck == null) return; + if (comboBoxStrategy.isEnabled()) { + int ind = comboBoxStrategy.getSelectedIndex(); + switch (ind) { + case 0: + _strategy = new MoveToCenter(); + break; + case 1: + _strategy = new MoveToBorder(); + break; + default: + _strategy = null; + break; + }; + if (_strategy == null) { + return; + } + _strategy.SetData(new MoveableTruck(canvasGasolineTanker._drawingTruck), Width, Height); + } + if (_strategy == null) { + return; + } + comboBoxStrategy.setEnabled(false); + _strategy.MakeStep(); + if (_strategy.GetStatus() == StrategyStatus.Finish) { + comboBoxStrategy.setEnabled(true); + _strategy = null; + } + } }); ActionListener actionListener = new ActionListener() { @Override public void actionPerformed(ActionEvent event) { - if (canvasGasolineTanker._gasolineTanker == null) return; + if (canvasGasolineTanker._drawingTruck == null) return; boolean result = false; switch ((((JButton)(event.getSource())).getName())) { case "buttonUp": - result = canvasGasolineTanker._gasolineTanker.MoveTransport(DirectionType.Up); + result = canvasGasolineTanker._drawingTruck.MoveTransport(DirectionType.Up); break; case "buttonDown": - result = canvasGasolineTanker._gasolineTanker.MoveTransport(DirectionType.Down); + result = canvasGasolineTanker._drawingTruck.MoveTransport(DirectionType.Down); break; case "buttonLeft": - result = canvasGasolineTanker._gasolineTanker.MoveTransport(DirectionType.Left); + result = canvasGasolineTanker._drawingTruck.MoveTransport(DirectionType.Left); break; case "buttonRight": - result = canvasGasolineTanker._gasolineTanker.MoveTransport(DirectionType.Right); + result = canvasGasolineTanker._drawingTruck.MoveTransport(DirectionType.Right); break; } if (result) { @@ -93,34 +161,47 @@ public class FormGasolineTanker extends JFrame{ setLayout(null); canvasGasolineTanker.setBounds(0,0, getWidth(), getHeight()); - buttonCreate.setBounds(15, getHeight() - 95, 200, 35); - buttonUp.setBounds(getWidth() - 140, getHeight() - 160, 45, 45); + buttonCreateTruck.setBounds(10, getHeight() - 90, 150, 40); + buttonCreateGasolineTanker.setBounds(170, getHeight() - 90, 150, 40); + + buttonUp.setBounds(getWidth() - 200, getHeight() - 160, 45, 45); buttonDown.setBounds(getWidth() - 140, getHeight() - 100, 45, 45); buttonRight.setBounds(getWidth() - 80, getHeight() - 100, 45, 45); buttonLeft.setBounds(getWidth() - 200, getHeight() - 100, 45, 45); - add(buttonCreate); + comboBoxStrategy.setBounds(getWidth() - 170, 10, 140, 35); + buttonStrategy.setBounds(getWidth() - 130, 55, 100, 25); + + add(buttonCreateTruck); + add(buttonCreateGasolineTanker); add(buttonUp); add(buttonDown); add(buttonRight); add(buttonLeft); add(canvasGasolineTanker); + add(buttonStrategy); + add(comboBoxStrategy); setVisible(true); addComponentListener(new ComponentAdapter() { public void componentResized(ComponentEvent e) { Width = getWidth() - 15; Height = getHeight() - 35; - if (canvasGasolineTanker._gasolineTanker != null) - canvasGasolineTanker._gasolineTanker.SetPictureSize(Width, Height); + if (canvasGasolineTanker._drawingTruck != null) + canvasGasolineTanker._drawingTruck.SetPictureSize(Width, Height); canvasGasolineTanker.setBounds(0,0, getWidth(), getHeight()); - buttonCreate.setBounds(15, getHeight() - 95, 200, 35); + buttonCreateTruck.setBounds(10, getHeight() - 90, 150, 40); + buttonCreateGasolineTanker.setBounds(170, getHeight() - 90, 150, 40); buttonUp.setBounds(getWidth() - 140, getHeight() - 160, 45, 45); buttonDown.setBounds(getWidth() - 140, getHeight() - 100, 45, 45); buttonRight.setBounds(getWidth() - 80, getHeight() - 100, 45, 45); buttonLeft.setBounds(getWidth() - 200, getHeight() - 100, 45, 45); + comboBoxStrategy.setBounds(getWidth() - 170, 10, 140, 35); + buttonStrategy.setBounds(getWidth() - 130, 55, 100, 25); } }); } + + } diff --git a/src/src/MovementStrategy/AbstractStrategy.java b/src/src/MovementStrategy/AbstractStrategy.java new file mode 100644 index 0000000..28013b5 --- /dev/null +++ b/src/src/MovementStrategy/AbstractStrategy.java @@ -0,0 +1,63 @@ +package MovementStrategy; + +public abstract class AbstractStrategy { + private IMoveableObjects _moveableObject; + private StrategyStatus _state = StrategyStatus.NotInit; + public int FieldWidth; + public int FieldHeight; + + public StrategyStatus GetStatus() { + return _state; + } + + public void SetData(IMoveableObjects moveableObjects, int width, int height) { + if (moveableObjects == null) { + _state = StrategyStatus.NotInit; + return; + } + _state = StrategyStatus.InProgress; + _moveableObject = moveableObjects; + FieldWidth = width; + FieldHeight = height; + } + + public void MakeStep() { + if (_state != StrategyStatus.InProgress) { + return; + } + if (IsTargetDestinaion()) { + _state = StrategyStatus.Finish; + return; + } + MoveToTarget(); + } + protected boolean MoveLeft() {return MoveTo(MovementDirection.Left);}; + protected boolean MoveRight() {return MoveTo(MovementDirection.Right);}; + protected boolean MoveUp() {return MoveTo(MovementDirection.Up);}; + protected boolean MoveDown() {return MoveTo(MovementDirection.Down);}; + protected ObjectParameters GetObjectParameters() {return _moveableObject.GetObjectPosition();}; + protected Integer GetStep() + { + if (_state != StrategyStatus.InProgress) + { + return null; + } + return _moveableObject.GetStep(); + } + protected abstract void MoveToTarget(); + protected abstract boolean IsTargetDestinaion(); + private boolean MoveTo(MovementDirection movementDirection) + { + if (_state != StrategyStatus.InProgress) + { + return false; + } + boolean stateTryMoveObject = _moveableObject.TryMoveObject(movementDirection); + if (stateTryMoveObject) + { + return stateTryMoveObject; + } + return false; + } + +} diff --git a/src/src/MovementStrategy/IMoveableObjects.java b/src/src/MovementStrategy/IMoveableObjects.java new file mode 100644 index 0000000..15e2a32 --- /dev/null +++ b/src/src/MovementStrategy/IMoveableObjects.java @@ -0,0 +1,7 @@ +package MovementStrategy; +// только объявляются методы +public interface IMoveableObjects { + ObjectParameters GetObjectPosition(); + int GetStep(); + boolean TryMoveObject(MovementDirection direction); +} diff --git a/src/src/MovementStrategy/MoveToBorder.java b/src/src/MovementStrategy/MoveToBorder.java new file mode 100644 index 0000000..8596fab --- /dev/null +++ b/src/src/MovementStrategy/MoveToBorder.java @@ -0,0 +1,47 @@ +package MovementStrategy; + +public class MoveToBorder extends AbstractStrategy { + @Override + protected boolean IsTargetDestinaion() { + ObjectParameters 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() { + ObjectParameters objParams = GetObjectParameters(); + if (objParams == null) + { + return; + } + int diffX = objParams.RightBorder - FieldWidth; + if (Math.abs(diffX) > GetStep()) + { + if (diffX > 0) + { + MoveLeft(); + } + else + { + MoveRight(); + } + } + + int diffY = objParams.DownBorder - FieldHeight; + if (Math.abs(diffY) > GetStep()) + { + if (diffY > 0) + { + MoveUp(); + } + else + { + MoveDown(); + } + } + } +} diff --git a/src/src/MovementStrategy/MoveToCenter.java b/src/src/MovementStrategy/MoveToCenter.java new file mode 100644 index 0000000..8323ce8 --- /dev/null +++ b/src/src/MovementStrategy/MoveToCenter.java @@ -0,0 +1,40 @@ +package MovementStrategy; + +public class MoveToCenter extends AbstractStrategy{ + @Override + protected boolean IsTargetDestinaion() { + ObjectParameters objParams = GetObjectParameters(); + if (objParams == null) { + return false; + } + return objParams.ObjectMiddleHorizontal - GetStep() <= FieldWidth / 2 + && objParams.ObjectMiddleHorizontal + GetStep() >= FieldWidth / 2 && + objParams.ObjectMiddleVertical - GetStep() <= FieldHeight / 2 + && objParams.ObjectMiddleVertical + GetStep() >= FieldHeight / 2; + } + + @Override + protected void MoveToTarget() { + ObjectParameters objParams = GetObjectParameters(); + if (objParams == null) { + return; + } + int diffX = objParams.ObjectMiddleHorizontal - FieldWidth / 2; + if (Math.abs(diffX) > GetStep()) { + if (diffX > 0) { + MoveLeft(); + } else { + MoveRight(); + } + } + int diffY = objParams.ObjectMiddleVertical - FieldHeight / 2; + if (Math.abs(diffY) > GetStep()) { + if (diffY > 0) { + MoveUp(); + } else { + MoveDown(); + } + } + + } +} diff --git a/src/src/MovementStrategy/MoveableTruck.java b/src/src/MovementStrategy/MoveableTruck.java new file mode 100644 index 0000000..2910a27 --- /dev/null +++ b/src/src/MovementStrategy/MoveableTruck.java @@ -0,0 +1,44 @@ +package MovementStrategy; +import Drawings.CanvasGasolineTanker; +import Drawings.DirectionType; +import Drawings.DrawingTruck; + +public class MoveableTruck implements IMoveableObjects{ + private CanvasGasolineTanker canvas = new CanvasGasolineTanker(); + public MoveableTruck(DrawingTruck drawingTruck) + { + canvas._drawingTruck = drawingTruck; + } + @Override + public ObjectParameters GetObjectPosition() { + if (canvas._drawingTruck == null || canvas._drawingTruck.EntityTruck == null || + canvas._drawingTruck.GetPosX() == null || canvas._drawingTruck.GetPosY() == null) + { + return null; + } + return new ObjectParameters(canvas._drawingTruck.GetPosX(), canvas._drawingTruck.GetPosY(), + canvas._drawingTruck.GetWidth(), canvas._drawingTruck.GetHeight()); + } + @Override + public int GetStep() { + return (int)(canvas._drawingTruck.EntityTruck.Step); + } + @Override + public boolean TryMoveObject(MovementDirection direction) { + if (canvas._drawingTruck == null || canvas._drawingTruck.EntityTruck == null) + { + return false; + } + return canvas._drawingTruck.MoveTransport(GetDirectionType(direction)); + } + private static DirectionType GetDirectionType(MovementDirection direction) + { + switch (direction) { + case Left: return DirectionType.Left; + case Right: return DirectionType.Right; + case Up: return DirectionType.Up; + case Down: return DirectionType.Down; + default: return DirectionType.Unknow; + } + } +} diff --git a/src/src/MovementStrategy/MovementDirection.java b/src/src/MovementStrategy/MovementDirection.java new file mode 100644 index 0000000..c52f124 --- /dev/null +++ b/src/src/MovementStrategy/MovementDirection.java @@ -0,0 +1,8 @@ +package MovementStrategy; + +public enum MovementDirection { + Up, + Down, + Left, + Right +} diff --git a/src/src/MovementStrategy/ObjectParameters.java b/src/src/MovementStrategy/ObjectParameters.java new file mode 100644 index 0000000..b68fe75 --- /dev/null +++ b/src/src/MovementStrategy/ObjectParameters.java @@ -0,0 +1,27 @@ +package MovementStrategy; + +public class ObjectParameters { + private int _x; + private int _y; + private int _width; + private int _height; + public int LeftBorder = _x; + public int TopBorder = _y; + public int RightBorder = _x + _width; + public int DownBorder = _y + _height; + public int ObjectMiddleHorizontal = _x + _width / 2; + public int ObjectMiddleVertical = _y + _height / 2; + 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/src/MovementStrategy/StrategyStatus.java b/src/src/MovementStrategy/StrategyStatus.java new file mode 100644 index 0000000..4f087ea --- /dev/null +++ b/src/src/MovementStrategy/StrategyStatus.java @@ -0,0 +1,7 @@ +package MovementStrategy; + +public enum StrategyStatus { + NotInit, + InProgress, + Finish +} diff --git a/src/src/Wheels/DrawingOrnamentHeart.java b/src/src/Wheels/DrawingOrnamentHeart.java new file mode 100644 index 0000000..adffd30 --- /dev/null +++ b/src/src/Wheels/DrawingOrnamentHeart.java @@ -0,0 +1,82 @@ +package Wheels; +import java.awt.*; +public class DrawingOrnamentHeart implements IDrawingWheels{ + private NumWheels numWheels; + + @Override + public NumWheels getNumWheels() { + return numWheels; + } + + @Override + public void setNumWheels(int number) { + switch (number) { + case 1: + numWheels = NumWheels.Two; + break; + case 2: + numWheels = NumWheels.Three; + break; + case 3: + numWheels = NumWheels.Four; + break; + default: + numWheels = NumWheels.Three; + } + } + + @Override + public void drawWheels(Graphics2D g2D, Color color, int _startPosX, int _startPosY) { + switch (numWheels) { + case Two: + drawTwoWheels(g2D, color, _startPosX, _startPosY); + break; + case Three: + drawThreeWheels(g2D, color, _startPosX, _startPosY); + break; + case Four: + drawFourWheels(g2D, color, _startPosX, _startPosY); + break; + } + } + + private void drawTwoWheels(Graphics2D g2D, Color color, int _startPosX, int _startPosY) { + g2D.setColor(color); + g2D.fillOval(_startPosX + 5, _startPosY + 50, 20, 20); + g2D.fillOval(_startPosX + 85, _startPosY + 50, 20, 20); + drawOrnament(g2D, _startPosX + 5, _startPosY + 50); + drawOrnament(g2D, _startPosX + 85, _startPosY + 50); + } + + private void drawThreeWheels(Graphics2D g2D, Color color, int _startPosX, int _startPosY) { + g2D.setColor(color); + g2D.fillOval(_startPosX + 5, _startPosY + 50, 20, 20); + g2D.fillOval(_startPosX + 25, _startPosY + 50, 20, 20); + g2D.fillOval(_startPosX + 85, _startPosY + 50, 20, 20); + drawOrnament(g2D, _startPosX + 5, _startPosY + 50); + drawOrnament(g2D, _startPosX + 25, _startPosY + 50); + drawOrnament(g2D, _startPosX + 85, _startPosY + 50); + } + + private void drawFourWheels(Graphics2D g2D, Color color, int _startPosX, int _startPosY) { + g2D.setColor(color); + g2D.fillOval(_startPosX + 5, _startPosY + 50, 20, 20); + g2D.fillOval(_startPosX + 25, _startPosY + 50, 20, 20); + g2D.fillOval(_startPosX + 65, _startPosY + 50, 20, 20); + g2D.fillOval(_startPosX + 85, _startPosY + 50, 20, 20); + drawOrnament(g2D, _startPosX + 5, _startPosY + 50); + drawOrnament(g2D, _startPosX + 25, _startPosY + 50); + drawOrnament(g2D, _startPosX + 65, _startPosY + 50); + drawOrnament(g2D, _startPosX + 85, _startPosY + 50); + } + + private void drawOrnament(Graphics2D g2D, int _startPosX, int _startPosY) { + int[] X = {_startPosX + 2, _startPosX + 5, _startPosX + 9,_startPosX + 12, _startPosX + 15, _startPosX + 15, _startPosX + 9, _startPosX + 2}; + int[] Y = {_startPosY + 5, _startPosY + 5, _startPosY+ 8, _startPosY + 5, _startPosY + 5, _startPosY + 10, _startPosY + 15, _startPosY + 10}; + g2D.setColor(Color.GREEN); + g2D.fillPolygon(X, Y, X.length); + g2D.setColor(Color.BLACK); + g2D.drawPolygon(X, Y, X.length); + } + +} diff --git a/src/src/Wheels/DrawingOrnamentSquare.java b/src/src/Wheels/DrawingOrnamentSquare.java new file mode 100644 index 0000000..c697ed2 --- /dev/null +++ b/src/src/Wheels/DrawingOrnamentSquare.java @@ -0,0 +1,82 @@ +package Wheels; +import java.awt.*; + +public class DrawingOrnamentSquare implements IDrawingWheels { + private NumWheels numWheels; + + @Override + public NumWheels getNumWheels() { + return numWheels; + } + + @Override + public void setNumWheels(int number) { + switch (number) { + case 1: + numWheels = NumWheels.Two; + break; + case 2: + numWheels = NumWheels.Three; + break; + case 3: + numWheels = NumWheels.Four; + break; + default: + numWheels = NumWheels.Three; + } + } + + @Override + public void drawWheels(Graphics2D g2D, Color color, int _startPosX, int _startPosY) { + switch (numWheels) { + case Two: + drawTwoWheels(g2D, color, _startPosX, _startPosY); + break; + case Three: + drawThreeWheels(g2D, color, _startPosX, _startPosY); + break; + case Four: + drawFourWheels(g2D, color, _startPosX, _startPosY); + break; + } + } + + private void drawTwoWheels(Graphics2D g2D, Color color, int _startPosX, int _startPosY) { + g2D.setColor(color); + g2D.fillOval(_startPosX + 5, _startPosY + 50, 20, 20); + g2D.fillOval(_startPosX + 85, _startPosY + 50, 20, 20); + drawOrnament(g2D, _startPosX + 5, _startPosY + 50); + drawOrnament(g2D, _startPosX + 85, _startPosY + 50); + } + + private void drawThreeWheels(Graphics2D g2D, Color color, int _startPosX, int _startPosY) { + g2D.setColor(color); + g2D.fillOval(_startPosX + 5, _startPosY + 50, 20, 20); + g2D.fillOval(_startPosX + 25, _startPosY + 50, 20, 20); + g2D.fillOval(_startPosX + 85, _startPosY + 50, 20, 20); + drawOrnament(g2D, _startPosX + 5, _startPosY + 50); + drawOrnament(g2D, _startPosX + 25, _startPosY + 50); + drawOrnament(g2D, _startPosX + 85, _startPosY + 50); + } + + private void drawFourWheels(Graphics2D g2D, Color color, int _startPosX, int _startPosY) { + g2D.setColor(color); + g2D.fillOval(_startPosX + 5, _startPosY + 50, 20, 20); + g2D.fillOval(_startPosX + 25, _startPosY + 50, 20, 20); + g2D.fillOval(_startPosX + 65, _startPosY + 50, 20, 20); + g2D.fillOval(_startPosX + 85, _startPosY + 50, 20, 20); + drawOrnament(g2D, _startPosX + 5, _startPosY + 50); + drawOrnament(g2D, _startPosX + 25, _startPosY + 50); + drawOrnament(g2D, _startPosX + 65, _startPosY + 50); + drawOrnament(g2D, _startPosX + 85, _startPosY + 50); + } + + private void drawOrnament(Graphics2D g2D, int _startPosX, int _startPosY) { + g2D.setColor(Color.ORANGE); + g2D.fillRect(_startPosX+5, _startPosY+4, 9, 9); + g2D.setColor(Color.BLACK); + g2D.drawRect(_startPosX+5, _startPosY+4, 9, 9); + } + } + + diff --git a/src/src/DrawingWheels.java b/src/src/Wheels/DrawingWheels.java similarity index 91% rename from src/src/DrawingWheels.java rename to src/src/Wheels/DrawingWheels.java index 157a009..82154b6 100644 --- a/src/src/DrawingWheels.java +++ b/src/src/Wheels/DrawingWheels.java @@ -1,9 +1,15 @@ +package Wheels; import java.awt.*; -public class DrawingWheels { +public class DrawingWheels implements IDrawingWheels{ private NumWheels numWheels; - //определяет количество колес + @Override + public NumWheels getNumWheels() { + return numWheels; + } + + @Override public void setNumWheels(int number) { switch (number) { case 1: @@ -20,6 +26,7 @@ public class DrawingWheels { } } + @Override public void drawWheels(Graphics2D g2D, Color color, int _startPosX, int _startPosY) { switch (numWheels) { case Two: @@ -55,3 +62,4 @@ public class DrawingWheels { g2D.fillOval(_startPosX + 85, _startPosY + 50, 20, 20); } } + diff --git a/src/src/Wheels/IDrawingWheels.java b/src/src/Wheels/IDrawingWheels.java new file mode 100644 index 0000000..7588155 --- /dev/null +++ b/src/src/Wheels/IDrawingWheels.java @@ -0,0 +1,7 @@ +package Wheels; +import java.awt.*; +public interface IDrawingWheels { + void setNumWheels(int number); + NumWheels getNumWheels(); + void drawWheels(Graphics2D g2d, Color color, int _startPosX, int _startPosY); // +} diff --git a/src/src/NumWheels.java b/src/src/Wheels/NumWheels.java similarity index 76% rename from src/src/NumWheels.java rename to src/src/Wheels/NumWheels.java index abadda7..d140a05 100644 --- a/src/src/NumWheels.java +++ b/src/src/Wheels/NumWheels.java @@ -1,3 +1,5 @@ +package Wheels; + public enum NumWheels { Two, Three,