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/DrawningExcavator.java b/src/DrawningExcavator.java
new file mode 100644
index 0000000..09e4b15
--- /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);
+ }
+ }
+}
\ No newline at end of file
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/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/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/DrawningTracktor.java b/src/DrawningTracktor.java
index 6038bc7..bca4658 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};
+ }
+}
\ No newline at end of file
diff --git a/src/EntityExcavator.java b/src/EntityExcavator.java
new file mode 100644
index 0000000..171775e
--- /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;
+ }
+}
\ No newline at end of file
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..f591611 100644
--- a/src/FormTracktor.form
+++ b/src/FormTracktor.form
@@ -8,19 +8,38 @@
+
+
+
+
+
+
+
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -70,14 +89,37 @@
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/FormTracktor.java b/src/FormTracktor.java
index fc244fb..395928d 100644
--- a/src/FormTracktor.java
+++ b/src/FormTracktor.java
@@ -7,16 +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("Трактор");
@@ -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->{
@@ -71,6 +79,7 @@ public class FormTracktor extends JFrame {
}
});
+
pictureBox.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
@@ -81,14 +90,47 @@ 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() {
+ 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);
+}
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/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
new file mode 100644
index 0000000..2b99f2b
--- /dev/null
+++ b/src/ObjectParameters.java
@@ -0,0 +1,32 @@
+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 topBorder(){
+ return y;
+ }
+ public int rightBorder(){
+ 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;
+ 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
+}