From b1d21a1556d5ba138edfc25b6907b2b243043f78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9=20=D0=9A=D1=80?= =?UTF-8?q?=D1=8E=D0=BA=D0=BE=D0=B2?= Date: Sat, 16 Dec 2023 23:46:37 +0400 Subject: [PATCH 1/3] =?UTF-8?q?=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=B0=D1=8F?= =?UTF-8?q?=20=D0=BB=D0=B0=D0=B1=D0=B0=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/DrawningExcavator.java | 57 +++++++++++++++++++++++++++ src/DrawningRollers.java | 10 ++--- src/DrawningTracktor.java | 81 +++++++++++++++++++++++++++----------- src/EntityTracktor.java | 13 +++--- src/FormTracktor.form | 16 ++++++-- src/FormTracktor.java | 34 +++++++++++----- src/IDrawningRollers.java | 6 +++ 7 files changed, 165 insertions(+), 52 deletions(-) create mode 100644 src/DrawningExcavator.java create mode 100644 src/IDrawningRollers.java diff --git a/src/DrawningExcavator.java b/src/DrawningExcavator.java new file mode 100644 index 0000000..1f3c823 --- /dev/null +++ b/src/DrawningExcavator.java @@ -0,0 +1,57 @@ +import java.awt.*; + +public class DrawningExcavator extends DrawningTracktor { + public DrawningExcavator(int speed, float weight, Color bodyColor, int countRollers, Color dopColor, boolean bucket, boolean supports){ + super(speed, weight, bodyColor, countRollers, 130, 87); + entityTracktor = new EntityExcavator(speed, weight, bodyColor, dopColor, bucket, supports); + } + + @Override + public void DrawTransport(Graphics2D g){ + if (!(entityTracktor instanceof EntityExcavator excavator)) + { + return; + } + Color pen; + Color dopBrush = excavator.getDopColor(); + if (excavator.getBucket()) + { + pen = excavator.getDopColor(); + g.setStroke(new BasicStroke(5)); + g.setColor(pen); + g.drawLine((int)_startPosX + 1, (int)_startPosY + 90, (int)_startPosX + 15, (int)_startPosY + 70); + g.drawLine((int)_startPosX + 15, (int)_startPosY + 72, (int)_startPosX + 15, (int)_startPosY + 50); + g.drawLine((int)_startPosX + 15, (int)_startPosY + 52, (int)_startPosX + 10, (int)_startPosY + 45); + g.drawLine((int)_startPosX + 15, (int)_startPosY + 60, (int)_startPosX + 40, (int)_startPosY + 50); + g.setStroke(new BasicStroke(1)); + } + _startPosX += 20; + _startPosY += 5; + super.DrawTransport(g); + _startPosX -= 20; + _startPosY -= 5; + if (excavator.getSupports()) + { + pen = Color.BLACK; + g.setColor(dopBrush); + g.fillRect((int)_startPosX + 100, (int)_startPosY + 50, 10, 42); + g.setColor(pen); + g.drawRect((int)_startPosX + 100, (int)_startPosY + 50, 10, 42); + + g.setColor(dopBrush); + g.fillRect((int)_startPosX + 90, (int)_startPosY + 82, 30, 10); + g.setColor(pen); + g.drawRect((int)_startPosX + 90, (int)_startPosY + 82, 30, 10); + + g.setColor(dopBrush); + g.fillRect((int)_startPosX + 45, (int)_startPosY + 50, 10, 42); + g.setColor(pen); + g.drawRect((int)_startPosX + 45, (int)_startPosY + 50, 10, 42); + + g.setColor(dopBrush); + g.fillRect((int)_startPosX + 35, (int)_startPosY + 82, 30, 10); + g.setColor(pen); + g.drawRect((int)_startPosX + 35, (int)_startPosY + 82, 30, 10); + } + } +} diff --git a/src/DrawningRollers.java b/src/DrawningRollers.java index 5b0064d..8d314e6 100644 --- a/src/DrawningRollers.java +++ b/src/DrawningRollers.java @@ -1,11 +1,10 @@ import java.awt.*; import java.util.Random; -public class DrawningRollers { +public class DrawningRollers implements IDrawningRollers { private RollersCount rollersCount; private Color colorRollers; - - void setRollersCount(int count){ + public void setRollersCount(int count){ switch (count) { case 4 -> rollersCount = RollersCount.Four; case 5 -> rollersCount = RollersCount.Five; @@ -13,13 +12,12 @@ public class DrawningRollers { default -> rollersCount = RollersCount.Four; } } - - public void Init(int count, Color colorRollers){ + public DrawningRollers(int count, Color colorRollers){ setRollersCount(count); this.colorRollers = colorRollers; } - public void DrawRollers(Graphics g, float _startPosX, float _startPosY){ + public void DrawRollers(Graphics2D g, float _startPosX, float _startPosY){ Color penColor = Color.BLACK; Color mainColor = colorRollers==null ? Color.LIGHT_GRAY : colorRollers; diff --git a/src/DrawningTracktor.java b/src/DrawningTracktor.java index 6038bc7..e700248 100644 --- a/src/DrawningTracktor.java +++ b/src/DrawningTracktor.java @@ -1,24 +1,53 @@ import java.awt.*; +import java.util.Random; // Класс, отвечающий за прорисовку и перемещение объекта-сущности public class DrawningTracktor { - private EntityTracktor Tracktor; // Класс-сущность - private float _startPosX; // Левая координата отрисовки трактора - private float _startPosY; // Верхняя кооридната отрисовки трактора - private Integer _pictureWidth = null; // Ширина окна отрисовки - private Integer _pictureHeight = null; // Высота окна отрисовки - private final int _tracktorWidth = 110; // Ширина отрисовки трактора - private final int _tracktorHeight = 87; // Высота отрисовки трактора - - private DrawningRollers drawningRollers; + protected EntityTracktor entityTracktor; // Класс-сущность + public EntityTracktor getTracktor(){ + return entityTracktor; + } + protected int _startPosX; // Левая координата отрисовки трактора + protected int _startPosY; // Верхняя кооридната отрисовки трактора + private Integer _pictureWidth; // Ширина окна отрисовки + private Integer _pictureHeight; // Высота окна отрисовки + protected int _tracktorWidth = 110; // Ширина отрисовки трактора + protected int _tracktorHeight = 87; // Высота отрисовки трактора + public int getPosX(){ + return _startPosX; + } + public int getPosY(){ + return _startPosY; + } + public int getWidth(){ + return _tracktorWidth; + } + public int getHeight(){ + return _tracktorHeight; + } + private IDrawningRollers drawningRollers; // Инициализация свойств - public void Init(int speed, float weight, Color bodyColor, int countRollers) + public DrawningTracktor(int speed, float weight, Color bodyColor, int countRollers) { - Tracktor = new EntityTracktor(); - Tracktor.Init(speed, weight, bodyColor); - drawningRollers = new DrawningRollers(); - drawningRollers.Init(countRollers, bodyColor); + entityTracktor = new EntityTracktor(speed, weight, bodyColor); + drawningRollers = RollersType.random(countRollers, bodyColor); + } + protected DrawningTracktor(int speed, float weight, Color bodyColor, int countRollers, int tracktorWidth, int tracktorHeight){ + this(speed, weight, bodyColor, countRollers); + _tracktorWidth = tracktorWidth; + _tracktorHeight = tracktorHeight; + } + public boolean CanMove(Direction direction){ + if(entityTracktor == null) + return false; + return switch (direction){ + case Left -> _startPosY - entityTracktor.getStep() > 0; + case Up -> _startPosY - entityTracktor.getStep() > 0; + case Right -> _startPosX + _tracktorHeight + entityTracktor.getStep() < _pictureWidth; + case Down -> _startPosX + _tracktorWidth + entityTracktor.getStep() < _pictureHeight; + default -> false; + }; } // Установка позиции Трактора @@ -48,37 +77,37 @@ public class DrawningTracktor { { // вправо case Right: - if (_startPosX + _tracktorWidth + Tracktor.getStep() < _pictureWidth) + if (_startPosX + _tracktorWidth + entityTracktor.getStep() < _pictureWidth) { - _startPosX += Tracktor.getStep(); + _startPosX += entityTracktor.getStep(); } break; //влево case Left: - if (_startPosX - Tracktor.getStep() > 0) + if (_startPosX - entityTracktor.getStep() > 0) { - _startPosX -= Tracktor.getStep(); + _startPosX -= entityTracktor.getStep(); } break; //вверх case Up: - if (_startPosY - Tracktor.getStep() > 0) + if (_startPosY - entityTracktor.getStep() > 0) { - _startPosY -= Tracktor.getStep(); + _startPosY -= entityTracktor.getStep(); } break; //вниз case Down: - if (_startPosY + _tracktorHeight + Tracktor.getStep() < _pictureHeight) + if (_startPosY + _tracktorHeight + entityTracktor.getStep() < _pictureHeight) { - _startPosY += Tracktor.getStep(); + _startPosY += entityTracktor.getStep(); } break; } } // Отрисовка Трактора - public void DrawTransport(Graphics g) + public void DrawTransport(Graphics2D g) { if (_startPosX < 0 || _startPosY < 0 || _pictureHeight == null || _pictureWidth == null) { @@ -87,7 +116,7 @@ public class DrawningTracktor { Color penColor = Color.BLACK; // корпус - Color br = Tracktor!=null ? Tracktor.getBodyColor() : Color.GRAY ; + Color br = entityTracktor!=null ? entityTracktor.getBodyColor() : Color.GRAY ; g.setColor(br); g.fillRect((int)_startPosX + 10, (int)_startPosY + 30, 90, 25); g.setColor(penColor); @@ -134,6 +163,7 @@ public class DrawningTracktor { drawningRollers.DrawRollers(g,_startPosX, _startPosY); } + // Смена границ формы отрисовки public void ChangeBorders(int width, int height) { @@ -154,4 +184,7 @@ public class DrawningTracktor { _startPosY = _pictureHeight - _tracktorHeight; } } + public int[] getCurrentPosition(){ + return new int[]{_startPosX,_startPosX + _tracktorWidth - 1, _startPosY, _startPosY - _tracktorHeight -1}; + } } diff --git a/src/EntityTracktor.java b/src/EntityTracktor.java index f6c85e9..40de20a 100644 --- a/src/EntityTracktor.java +++ b/src/EntityTracktor.java @@ -1,6 +1,4 @@ import java.awt.*; -import java.util.Random; - // Класс-сущность "Трактор" public class EntityTracktor { private int Speed; @@ -16,16 +14,15 @@ public class EntityTracktor { public Color getBodyColor(){ return BodyColor; } - public float getStep(){ - return Speed * 100 / Weight; + public double getStep(){ + return (double) Speed * 100 / Weight; } // Инициализация полей объекта-класса Трактора - public void Init(int speed, float weight, Color bodyColor) + public EntityTracktor(int speed, float weight, Color bodyColor) { - Random rnd = new Random(); - Speed = speed <= 0 ? rnd.nextInt(50, 150) : speed; - Weight = weight <= 0 ? rnd.nextInt(40, 70) : weight; + Speed = speed; + Weight = weight; BodyColor = bodyColor; } } diff --git a/src/FormTracktor.form b/src/FormTracktor.form index 89d74f5..9ecac6a 100644 --- a/src/FormTracktor.form +++ b/src/FormTracktor.form @@ -8,9 +8,17 @@ + + + + + + + + - + @@ -70,12 +78,12 @@ - + - + - + diff --git a/src/FormTracktor.java b/src/FormTracktor.java index fc244fb..ee39a91 100644 --- a/src/FormTracktor.java +++ b/src/FormTracktor.java @@ -15,6 +15,7 @@ public class FormTracktor extends JFrame { private JButton buttonRight; private JButton buttonUp; private JPanel pictureBox; + private JButton buttonCreateModif; private DrawningTracktor _tracktor; @@ -26,21 +27,28 @@ public class FormTracktor extends JFrame { // Обработка нажатия кнопки "Создать" buttonCreate.addActionListener(e->{ Random rnd = new Random(); - _tracktor = new DrawningTracktor(); - - _tracktor.Init( + _tracktor = new DrawningTracktor( rnd.nextInt(100, 300), rnd.nextInt(1000, 2000), new Color(rnd.nextInt(0, 256), rnd.nextInt(0, 256), rnd.nextInt(0, 256)), rnd.nextInt(3,8) ); + setData(); + }); - _tracktor.SetPosition( - rnd.nextInt(10, 100), - rnd.nextInt(10, 100), - pictureBox.getWidth(), pictureBox.getHeight() + // Обработка нажатия кнопки "Модификация" + buttonCreateModif.addActionListener(e->{ + Random rnd = new Random(); + _tracktor = new DrawningExcavator( + rnd.nextInt(100, 300), + rnd.nextInt(1000, 2000), + new Color(rnd.nextInt(0, 256), rnd.nextInt(0, 256), rnd.nextInt(0, 256)), + rnd.nextInt(3,8), + new Color(rnd.nextInt(0, 256), rnd.nextInt(0, 256), rnd.nextInt(0, 256)), + rnd.nextBoolean(), + rnd.nextBoolean() ); - repaint(); + setData(); }); buttonUp.addActionListener(e->{ @@ -83,12 +91,18 @@ public class FormTracktor extends JFrame { }); } + private void setData() { + Random rnd = new Random(); + _tracktor.SetPosition(rnd.nextInt(10, 100), rnd.nextInt(10, 100), pictureBox.getWidth(), pictureBox.getHeight()); + repaint(); + } + @Override public void paint(Graphics g){ super.paint(g); - g = pictureBox.getGraphics(); + Graphics2D g2d = (Graphics2D)pictureBox.getGraphics(); if (_tracktor != null){ - _tracktor.DrawTransport(g); + _tracktor.DrawTransport(g2d); } } } diff --git a/src/IDrawningRollers.java b/src/IDrawningRollers.java new file mode 100644 index 0000000..7a739d2 --- /dev/null +++ b/src/IDrawningRollers.java @@ -0,0 +1,6 @@ +import java.awt.*; + +public interface IDrawningRollers { + void setRollersCount(int count); + void DrawRollers(Graphics2D g, float _startPosX, float _startPosY); +} -- 2.25.1 From b54203910b8e8eab85551a05e4dd6ba200bf2857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9=20=D0=9A=D1=80?= =?UTF-8?q?=D1=8E=D0=BA=D0=BE=D0=B2?= Date: Sat, 16 Dec 2023 23:47:39 +0400 Subject: [PATCH 2/3] =?UTF-8?q?=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=B0=D1=8F?= =?UTF-8?q?=20=D0=BB=D0=B0=D0=B1=D0=B0=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/AbstractStrategy.java | 95 +++++++++++++++++++++++ src/DrawningCrossRollers.java | 94 +++++++++++++++++++++++ src/DrawningObjectExcavator.java | 37 +++++++++ src/DrawningSquaredRollers.java | 125 +++++++++++++++++++++++++++++++ src/EntityExcavator.java | 28 +++++++ src/IMoveableObject.java | 6 ++ src/ObjectParameters.java | 25 +++++++ src/RollersType.java | 17 +++++ src/Status.java | 5 ++ 9 files changed, 432 insertions(+) create mode 100644 src/AbstractStrategy.java create mode 100644 src/DrawningCrossRollers.java create mode 100644 src/DrawningObjectExcavator.java create mode 100644 src/DrawningSquaredRollers.java create mode 100644 src/EntityExcavator.java create mode 100644 src/IMoveableObject.java create mode 100644 src/ObjectParameters.java create mode 100644 src/RollersType.java create mode 100644 src/Status.java diff --git a/src/AbstractStrategy.java b/src/AbstractStrategy.java new file mode 100644 index 0000000..c2747c1 --- /dev/null +++ b/src/AbstractStrategy.java @@ -0,0 +1,95 @@ +public abstract class AbstractStrategy { + + private IMoveableObject moveableObject; + + private Status state = Status.NotInit; + + private int fieldWidth; + + protected int getFieldWidth() { + return fieldWidth; + } + + private int fieldHeight; + + protected int getFieldHeight() { + 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; + this.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(Direction.Left); + } + + protected boolean moveRight() { + return moveTo(Direction.Right); + } + + protected boolean moveUp() { + return moveTo(Direction.Up); + } + + protected boolean moveDown() { + return moveTo(Direction.Down); + } + + protected ObjectParameters getObjectParameters() { + if (moveableObject == null) { + return null; + } + return moveableObject.getObjectPosition(); + } + + protected Integer getStep() { + if (state != Status.InProgress) { + return null; + } + if (moveableObject == null) { + return null; + } + return moveableObject.getStep(); + } + + protected abstract void moveToTarget(); + + protected abstract boolean isTargetDestination(); + + private boolean moveTo(Direction direction) { + if (state != Status.InProgress) { + return false; + } + if (moveableObject == null) { + return false; + } + if (moveableObject.checkCanMove(direction)) { + moveableObject.moveObject(direction); + return true; + } + return false; + } +} diff --git a/src/DrawningCrossRollers.java b/src/DrawningCrossRollers.java new file mode 100644 index 0000000..22bd26e --- /dev/null +++ b/src/DrawningCrossRollers.java @@ -0,0 +1,94 @@ +import java.awt.*; + +public class DrawningCrossRollers implements IDrawningRollers{ + private RollersCount rollersCount; + private Color colorRollers; + + public void setRollersCount(int count){ + switch (count) { + case 4 -> rollersCount = RollersCount.Four; + case 5 -> rollersCount = RollersCount.Five; + case 6 -> rollersCount = RollersCount.Six; + default -> rollersCount = RollersCount.Four; + } + } + + public DrawningCrossRollers(int count, Color colorRollers){ + setRollersCount(count); + this.colorRollers = colorRollers; + } + + public void DrawRollers(Graphics2D g, float _startPosX, float _startPosY){ + Color penColor = Color.BLACK; + Color mainColor = colorRollers==null ? Color.LIGHT_GRAY : colorRollers; + + // Крупные катки - всегда + // 1 + g.setColor(mainColor); + g.fillOval((int)_startPosX + 5, (int)_startPosY + 60, 22, 22); + g.setColor(penColor); + g.drawOval((int)_startPosX + 5, (int)_startPosY + 60, 22, 22); + // вертикальное перекрестие + g.fillRect((int)_startPosX + 14, (int)_startPosY + 65, 5, 14); + // горизонтальное перекрестие + g.fillRect((int)_startPosX + 10, (int)_startPosY + 69, 13, 5); + // 2 + g.setColor(mainColor); + g.fillOval((int)_startPosX + 83, (int)_startPosY + 60, 22, 22); + g.setColor(penColor); + g.drawOval((int)_startPosX + 83, (int)_startPosY + 60, 22, 22); + // вертикальное перекрестие + g.fillRect((int)_startPosX + 92, (int)_startPosY + 65, 5, 14); + // горизонтальное перекрестие + g.fillRect((int)_startPosX + 88, (int)_startPosY + 69, 13, 5); + + // Малые катки - всегда + // 1 + g.setColor(mainColor); + g.fillOval((int)_startPosX + 43, (int)_startPosY + 58, 6, 6); + g.setColor(penColor); + g.drawOval((int)_startPosX + 43, (int)_startPosY + 58, 6, 6); + // вертикальное перекрестие + g.fillRect((int)_startPosX + 46, (int)_startPosY + 60, 1, 3); + // горизонтальное перекрестие + g.fillRect((int)_startPosX + 45, (int)_startPosY + 61, 3, 1); + // 2 + g.setColor(mainColor); + g.fillOval((int)_startPosX + 61, (int)_startPosY + 58, 6, 6); + g.setColor(penColor); + g.drawOval((int)_startPosX + 61, (int)_startPosY + 58, 6, 6); + // вертикальное перекрестие + g.fillRect((int)_startPosX + 64, (int)_startPosY + 60, 1, 3); + // горизонтальное перекрестие + g.fillRect((int)_startPosX + 63, (int)_startPosY + 61, 3, 1); + + // Средние катки - не всегда + switch (rollersCount){ + case Six: + // 1 + g.setColor(mainColor); + g.fillOval((int)_startPosX + 33, (int)_startPosY + 73, 10, 10); + g.setColor(penColor); + g.drawOval((int)_startPosX + 33, (int)_startPosY + 73, 10, 10); + // вертикальное перекрестие + g.fillRect((int)_startPosX + 37, (int)_startPosY + 75, 2, 6); + // горизонтальное перекрестие + g.fillRect((int)_startPosX + 35, (int)_startPosY + 77, 6, 2); + case Five: + // 2 + g.setColor(mainColor); + g.fillOval((int)_startPosX + 68, (int)_startPosY + 73, 10, 10); + g.setColor(penColor); + g.drawOval((int)_startPosX + 68, (int)_startPosY + 73, 10, 10); + // вертикальное перекрестие + g.fillRect((int)_startPosX + 72, (int)_startPosY + 75, 2, 6); + // горизонтальное перекрестие + g.fillRect((int)_startPosX + 70, (int)_startPosY + 77, 6, 2); + } + + // Центры крупных катков + g.setColor(Color.BLACK); + g.fillOval((int)_startPosX + 13, (int)_startPosY + 68, 6, 6); + g.fillOval((int)_startPosX + 91, (int)_startPosY + 68, 6, 6); + } +} diff --git a/src/DrawningObjectExcavator.java b/src/DrawningObjectExcavator.java new file mode 100644 index 0000000..efa1cb9 --- /dev/null +++ b/src/DrawningObjectExcavator.java @@ -0,0 +1,37 @@ +import java.awt.*; + +public class DrawningObjectExcavator implements IMoveableObject{ + private DrawningTracktor _tracktor = null; + + public DrawningObjectExcavator(DrawningTracktor tracktor) { + this._tracktor = tracktor; + } + + @Override + public ObjectParameters getObjectPosition(){ + if(_tracktor == null || _tracktor.getTracktor() == null){ + return null; + } + return new ObjectParameters(_tracktor.getPosX(), _tracktor.getPosY(),_tracktor.getWidth(), _tracktor.getHeight()); + } + @Override + public int getStep() { + if (_tracktor == null) { + return 0; + } + return (int)((_tracktor.getTracktor() != null)? _tracktor.getTracktor().getStep() : 0); + } + @Override + public boolean checkCanMove(Direction direction){ + if(_tracktor == null){ + return false; + } + return _tracktor.CanMove(direction); + } + @Override + public void moveObject(Direction direction) { + if (_tracktor != null) { + _tracktor.MoveTransport(direction); + } + } +} diff --git a/src/DrawningSquaredRollers.java b/src/DrawningSquaredRollers.java new file mode 100644 index 0000000..192dbe9 --- /dev/null +++ b/src/DrawningSquaredRollers.java @@ -0,0 +1,125 @@ +import java.awt.*; + +public class DrawningSquaredRollers implements IDrawningRollers { + private RollersCount rollersCount; + private Color colorRollers; + + public void setRollersCount(int count){ + switch (count) { + case 4 -> rollersCount = RollersCount.Four; + case 5 -> rollersCount = RollersCount.Five; + case 6 -> rollersCount = RollersCount.Six; + default -> rollersCount = RollersCount.Four; + } + } + + public DrawningSquaredRollers(int count, Color colorRollers){ + setRollersCount(count); + this.colorRollers = colorRollers; + } + + public void DrawRollers(Graphics2D g, float _startPosX, float _startPosY){ + Color penColor = Color.BLACK; + Color mainColor = colorRollers==null ? Color.LIGHT_GRAY : colorRollers; + + // Крупные катки - всегда + // Узор для больших катков + Polygon bigRomb = new Polygon( + new int[]{(int)_startPosX + 5, (int)_startPosX + 16, (int)_startPosX + 27, (int)_startPosX + 16}, + new int[]{(int)_startPosY + 71, (int)_startPosY + 60, (int)_startPosY + 71, (int)_startPosY + 82}, + 4 + ); + Polygon bigCube = new Polygon( + new int[]{(int)_startPosX + 10, (int)_startPosX + 22, (int)_startPosX + 22, (int)_startPosX + 10}, + new int[]{(int)_startPosY + 65, (int)_startPosY + 65, (int)_startPosY + 77, (int)_startPosY + 77}, + 4 + ); + // 1 + g.setColor(mainColor); + g.fillOval((int)_startPosX + 5, (int)_startPosY + 60, 22, 22); + g.setColor(penColor); + g.drawOval((int)_startPosX + 5, (int)_startPosY + 60, 22, 22); + g.drawPolygon(bigRomb); + g.drawPolygon(bigCube); + // Сдвиг + bigRomb.translate(78,0); + bigCube.translate(78,0); + // 2 + g.setColor(mainColor); + g.fillOval((int)_startPosX + 83, (int)_startPosY + 60, 22, 22); + g.setColor(penColor); + g.drawOval((int)_startPosX + 83, (int)_startPosY + 60, 22, 22); + g.drawPolygon(bigRomb); + g.drawPolygon(bigCube); + + // Малые катки - всегда + // Узор + Polygon smallRomb = new Polygon( + new int[]{(int)_startPosX + 43, (int)_startPosX + 46, (int)_startPosX + 49, (int)_startPosX + 46}, + new int[]{(int)_startPosY + 61, (int)_startPosY + 58, (int)_startPosY + 61, (int)_startPosY + 64}, + 4 + ); + Polygon smallCube = new Polygon( + new int[]{(int)_startPosX + 44, (int)_startPosX + 48, (int)_startPosX + 48, (int)_startPosX + 44}, + new int[]{(int)_startPosY + 59, (int)_startPosY + 63, (int)_startPosY + 63, (int)_startPosY + 59}, + 4 + ); + // 1 + g.setColor(mainColor); + g.fillOval((int)_startPosX + 43, (int)_startPosY + 58, 6, 6); + g.setColor(penColor); + g.drawOval((int)_startPosX + 43, (int)_startPosY + 58, 6, 6); + g.drawPolygon(smallRomb); + g.drawPolygon(smallCube); + // Сдвиг + smallRomb.translate(18,0); + smallCube.translate(18,0); + // 2 + g.setColor(mainColor); + g.fillOval((int)_startPosX + 61, (int)_startPosY + 58, 6, 6); + g.setColor(penColor); + g.drawOval((int)_startPosX + 61, (int)_startPosY + 58, 6, 6); + g.drawPolygon(smallRomb); + g.drawPolygon(smallCube); + + // Средние катки - не всегда + // Узор + Polygon middleRomb = new Polygon( + new int[]{(int)_startPosX + 33, (int)_startPosX + 38, (int)_startPosX + 43, (int)_startPosX + 38}, + new int[]{(int)_startPosY + 78, (int)_startPosY + 73, (int)_startPosY + 78, (int)_startPosY + 83}, + 4 + ); + Polygon middleCube = new Polygon( + new int[]{(int)_startPosX + 35, (int)_startPosX + 41, (int)_startPosX + 41, (int)_startPosX + 35}, + new int[]{(int)_startPosY + 75, (int)_startPosY + 75, (int)_startPosY + 81, (int)_startPosY + 81}, + 4 + ); + switch (rollersCount){ + case Six: + // 1 + g.setColor(mainColor); + g.fillOval((int)_startPosX + 33, (int)_startPosY + 73, 10, 10); + g.setColor(penColor); + g.drawOval((int)_startPosX + 33, (int)_startPosY + 73, 10, 10); + g.drawPolygon(middleRomb); + g.drawPolygon(middleCube); + + case Five: + // Сдвиг + middleRomb.translate(35,0); + middleCube.translate(35,0); + // 2 + g.setColor(mainColor); + g.fillOval((int)_startPosX + 68, (int)_startPosY + 73, 10, 10); + g.setColor(penColor); + g.drawOval((int)_startPosX + 68, (int)_startPosY + 73, 10, 10); + g.drawPolygon(middleRomb); + g.drawPolygon(middleCube); + } + + // Центры крупных катков + g.setColor(Color.BLACK); + g.fillOval((int)_startPosX + 13, (int)_startPosY + 68, 6, 6); + g.fillOval((int)_startPosX + 91, (int)_startPosY + 68, 6, 6); + } +} diff --git a/src/EntityExcavator.java b/src/EntityExcavator.java new file mode 100644 index 0000000..a0eb803 --- /dev/null +++ b/src/EntityExcavator.java @@ -0,0 +1,28 @@ +import java.awt.*; +public class EntityExcavator extends EntityTracktor{ + // Дополнительный цвет + private Color dopColor; + // Признак наличия ковша + private boolean bucket; + // Признак наличия опор + private boolean supports; + + public EntityExcavator(int speed, float weight, Color bodyColor, Color dopColor, boolean bucket, boolean supports){ + super(speed, weight, bodyColor); + this.dopColor = dopColor; + this.bucket = bucket; + this.supports = supports; + } + + public Color getDopColor(){ + return dopColor; + } + + public boolean getBucket(){ + return bucket; + } + + public boolean getSupports(){ + return supports; + } +} diff --git a/src/IMoveableObject.java b/src/IMoveableObject.java new file mode 100644 index 0000000..8271e32 --- /dev/null +++ b/src/IMoveableObject.java @@ -0,0 +1,6 @@ +public interface IMoveableObject { + ObjectParameters getObjectPosition(); + int getStep(); + boolean checkCanMove(Direction direction); + void moveObject(Direction direction); +} diff --git a/src/ObjectParameters.java b/src/ObjectParameters.java new file mode 100644 index 0000000..b1b2def --- /dev/null +++ b/src/ObjectParameters.java @@ -0,0 +1,25 @@ +public class ObjectParameters { + private final int x; + private final int y; + private final int width; + private final int height; + public int leftBorder(){ + return x; + } + public int topBorde(){ + return y; + } + public int rightBorder(){ + return x+width/2; + } + public int downBorder(){ + return y + height/2; + } + public ObjectParameters(int x, int y, int width,int height){ + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } +} + diff --git a/src/RollersType.java b/src/RollersType.java new file mode 100644 index 0000000..4890c43 --- /dev/null +++ b/src/RollersType.java @@ -0,0 +1,17 @@ +import java.awt.*; +import java.util.Random; + +public enum RollersType { + Standard, + Squared, + Cross; + + public static IDrawningRollers random(int rollersCount, Color bodyColor) { + return switch (new Random().nextInt(RollersType.values().length)) { + case 0 -> new DrawningRollers(rollersCount, bodyColor); + case 1 -> new DrawningSquaredRollers(rollersCount, bodyColor); + case 2 -> new DrawningCrossRollers(rollersCount, bodyColor); + default -> null; + }; + } +} diff --git a/src/Status.java b/src/Status.java new file mode 100644 index 0000000..6467ed7 --- /dev/null +++ b/src/Status.java @@ -0,0 +1,5 @@ +public enum Status { + NotInit, + InProgress, + Finish +} -- 2.25.1 From aad0dc3598acdbfd945dc77b23772bd91dab85ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9=20=D0=9A=D1=80?= =?UTF-8?q?=D1=8E=D0=BA=D0=BE=D0=B2?= Date: Sun, 17 Dec 2023 02:27:54 +0400 Subject: [PATCH 3/3] =?UTF-8?q?=D0=BF=D0=BE=D1=87=D1=82=D0=B8=20=D0=B3?= =?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=B2=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/DrawningExcavator.java | 2 +- src/DrawningTracktor.java | 2 +- src/EntityExcavator.java | 2 +- src/FormTracktor.form | 38 ++++++++++++++++++++++++++++++++++++-- src/FormTracktor.java | 38 +++++++++++++++++++++++++++++++++----- src/MoveToBorder.java | 27 +++++++++++++++++++++++++++ src/MoveToCenter.java | 35 +++++++++++++++++++++++++++++++++++ src/ObjectParameters.java | 11 +++++++++-- 8 files changed, 143 insertions(+), 12 deletions(-) create mode 100644 src/MoveToBorder.java create mode 100644 src/MoveToCenter.java diff --git a/src/DrawningExcavator.java b/src/DrawningExcavator.java index 1f3c823..09e4b15 100644 --- a/src/DrawningExcavator.java +++ b/src/DrawningExcavator.java @@ -54,4 +54,4 @@ public class DrawningExcavator extends DrawningTracktor { g.drawRect((int)_startPosX + 35, (int)_startPosY + 82, 30, 10); } } -} +} \ No newline at end of file diff --git a/src/DrawningTracktor.java b/src/DrawningTracktor.java index e700248..bca4658 100644 --- a/src/DrawningTracktor.java +++ b/src/DrawningTracktor.java @@ -187,4 +187,4 @@ public class DrawningTracktor { public int[] getCurrentPosition(){ return new int[]{_startPosX,_startPosX + _tracktorWidth - 1, _startPosY, _startPosY - _tracktorHeight -1}; } -} +} \ No newline at end of file diff --git a/src/EntityExcavator.java b/src/EntityExcavator.java index a0eb803..171775e 100644 --- a/src/EntityExcavator.java +++ b/src/EntityExcavator.java @@ -25,4 +25,4 @@ public class EntityExcavator extends EntityTracktor{ public boolean getSupports(){ return supports; } -} +} \ No newline at end of file diff --git a/src/FormTracktor.form b/src/FormTracktor.form index 9ecac6a..f591611 100644 --- a/src/FormTracktor.form +++ b/src/FormTracktor.form @@ -21,14 +21,25 @@ - + - + + + + + + + + + + + + @@ -86,6 +97,29 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/FormTracktor.java b/src/FormTracktor.java index ee39a91..395928d 100644 --- a/src/FormTracktor.java +++ b/src/FormTracktor.java @@ -7,17 +7,17 @@ import java.util.Random; public class FormTracktor extends JFrame { private JPanel ContentPanel; private JButton buttonCreate; - private JLabel speedLabel; - private JLabel weightLabel; - private JLabel colorLabel; private JButton buttonLeft; private JButton buttonDown; private JButton buttonRight; private JButton buttonUp; private JPanel pictureBox; private JButton buttonCreateModif; - + private JComboBox comboBoxStrategy; + private JButton buttonMakeStep; + private AbstractStrategy abstractStrategy; private DrawningTracktor _tracktor; + private DrawningExcavator _excavator; public FormTracktor(){ setTitle("Трактор"); @@ -44,7 +44,7 @@ public class FormTracktor extends JFrame { rnd.nextInt(1000, 2000), new Color(rnd.nextInt(0, 256), rnd.nextInt(0, 256), rnd.nextInt(0, 256)), rnd.nextInt(3,8), - new Color(rnd.nextInt(0, 256), rnd.nextInt(0, 256), rnd.nextInt(0, 256)), + new Color(rnd.nextInt(0,256),rnd.nextInt(0,256),rnd.nextInt(0,256)), rnd.nextBoolean(), rnd.nextBoolean() ); @@ -79,6 +79,7 @@ public class FormTracktor extends JFrame { } }); + pictureBox.addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { @@ -89,6 +90,33 @@ public class FormTracktor extends JFrame { } } }); + + buttonMakeStep.addActionListener(e -> { + if (_tracktor == null ) { + return; + } + if(comboBoxStrategy.isEditable()) { + abstractStrategy = switch (comboBoxStrategy.getSelectedIndex()){ + case 0 -> new MoveToCenter(); + case 1 -> new MoveToBorder(); + default -> null; + }; + if(abstractStrategy == null){ + return; + } + abstractStrategy.setData(new DrawningObjectExcavator(_excavator),this.getWidth(),this.getHeight()); + } + if(abstractStrategy == null){ + return; + } + comboBoxStrategy.setEditable(false); + abstractStrategy.makeStep(); + repaint(); + if(abstractStrategy.getStatus() == Status.Finish){ + comboBoxStrategy.setEditable(true); + abstractStrategy = null; + } + }); } private void setData() { diff --git a/src/MoveToBorder.java b/src/MoveToBorder.java new file mode 100644 index 0000000..7fa52ad --- /dev/null +++ b/src/MoveToBorder.java @@ -0,0 +1,27 @@ +public class MoveToBorder extends AbstractStrategy { + @Override + protected boolean isTargetDestination(){ + var objParams = getObjectParameters(); + if (objParams == null) { + return false; + } + return objParams.rightBorder() <= getFieldWidth() && + objParams.rightBorder() + getStep() >= getFieldWidth() && + objParams.downBorder() <= getFieldHeight() && + objParams.downBorder() +getStep() >= getFieldHeight(); + } + @Override + protected void moveToTarget(){ + var objParams = getObjectParameters(); + if (objParams == null) + return; + var diffX = objParams.objectMiddleHorizontal() - getFieldWidth(); + if(Math.abs(diffX) > getStep()) + if(diffX < 0) + moveRight(); + var diffY = objParams.objectMiddleVertical() - getFieldHeight(); + if (Math.abs(diffY) > getStep()) + if(diffY < 0) + moveDown(); + } +} diff --git a/src/MoveToCenter.java b/src/MoveToCenter.java new file mode 100644 index 0000000..b257701 --- /dev/null +++ b/src/MoveToCenter.java @@ -0,0 +1,35 @@ +public class MoveToCenter extends AbstractStrategy{ + @Override + protected boolean isTargetDestination(){ + var objParams = getObjectParameters(); + if(objParams == null){ + return false; + } + return objParams.objectMiddleHorizontal() <= getFieldWidth() / 2 && + objParams.objectMiddleHorizontal() + getStep() <= getFieldWidth() / 2 && + objParams.objectMiddleVertical() <= getFieldHeight() / 2 && + objParams.objectMiddleVertical() + getStep() <= getFieldHeight() / 2; + + } + @Override + protected void moveToTarget(){ + var objParams = getObjectParameters(); + if(objParams == null) + return; + var diffX = objParams.objectMiddleHorizontal() - getFieldWidth() / 2; + if(Math.abs(diffX) > getStep()) { + if (diffX > 0) + moveLeft(); + else + moveRight(); + } + var diffY = objParams.objectMiddleVertical() + getFieldHeight() / 2; + if (Math.abs(diffY) > getStep()){ + if (diffY > 0) + moveUp(); + else + moveDown(); + } + } +} + diff --git a/src/ObjectParameters.java b/src/ObjectParameters.java index b1b2def..2b99f2b 100644 --- a/src/ObjectParameters.java +++ b/src/ObjectParameters.java @@ -6,15 +6,22 @@ public class ObjectParameters { public int leftBorder(){ return x; } - public int topBorde(){ + public int topBorder(){ return y; } public int rightBorder(){ - return x+width/2; + return x + width; } public int downBorder(){ + return y + height; + } + public int objectMiddleHorizontal(){ + return x+width/2; + } + public int objectMiddleVertical(){ return y + height/2; } + public ObjectParameters(int x, int y, int width,int height){ this.x = x; this.y = y; -- 2.25.1