diff --git a/ProjectCatamaran/src/DirectionType.java b/ProjectCatamaran/src/DirectionType.java
deleted file mode 100644
index 35657f0..0000000
--- a/ProjectCatamaran/src/DirectionType.java
+++ /dev/null
@@ -1,6 +0,0 @@
-public enum DirectionType {
- Up,
- Down,
- Left,
- Right
-}
diff --git a/ProjectCatamaran/src/DrawningBoat.java b/ProjectCatamaran/src/Drawnings/DrawningBoat.java
similarity index 65%
rename from ProjectCatamaran/src/DrawningBoat.java
rename to ProjectCatamaran/src/Drawnings/DrawningBoat.java
index b70efcb..f58c2af 100644
--- a/ProjectCatamaran/src/DrawningBoat.java
+++ b/ProjectCatamaran/src/Drawnings/DrawningBoat.java
@@ -1,10 +1,12 @@
-import Entities.*;
+package Drawnings;
+import Entities.*;
+import MovementStrategy.*;
import java.awt.*;
import java.util.Random;
public class DrawningBoat {
- private EntityBoat entityBoat;
+ private final EntityBoat entityBoat;
public EntityBoat getEntityBoat() {
return entityBoat;
}
@@ -13,25 +15,38 @@ public class DrawningBoat {
protected Integer _startPosX;
protected Integer _startPosY;
private int _drawingBoatWidth = 107;
- private int _drawingBoatHeight = 55;
- public DrawningCatamaranPaddle _drawingCatamaranPaddle;
+ private int _drawingBoatHeight = 68;
+ public int GetPosX(){return _startPosX;}
+ public int GetPosY(){return _startPosY;}
+ public int GetWidth(){return _drawingBoatWidth;}
+ public int GetHeight(){return _drawingBoatHeight;}
+ private IDrawPaddles drawPaddles;
- public DrawningBoat(int speed, float weight, Color bodyColor) {
+ public DrawningBoat(int speed, float weight, Color bodyColor, int paddlesType) {
entityBoat = new EntityBoat(speed, weight, bodyColor);
_startPosY = null;
_startPosX = null;
_pictureWidth = null;
_pictureHeight = null;
-
- _drawingCatamaranPaddle = new DrawningCatamaranPaddle();
+ switch (paddlesType) {
+ case 0:
+ drawPaddles = new DrawningPaddles();
+ break;
+ case 1:
+ drawPaddles = new DrawningOvalPaddles();
+ break;
+ case 2:
+ drawPaddles = new DrawningRectanglePaddles();
+ break;
+ }
Random random = new Random();
int paddlesCount = random.nextInt(1,4);
- _drawingCatamaranPaddle.setEnumNumber(paddlesCount);
+ drawPaddles.setNumber(paddlesCount);
}
- protected DrawningBoat(int speed, float weight, Color bodyColor, int boatWidth, int boatHeight) {
- this(speed, weight, bodyColor);
+ protected DrawningBoat(int speed, float weight, Color bodyColor, int paddlesType, int boatWidth, int boatHeight) {
+ this(speed, weight, bodyColor, paddlesType);
_drawingBoatHeight = boatHeight;
_drawingBoatWidth = boatWidth;
@@ -69,25 +84,25 @@ public class DrawningBoat {
}
- public boolean moveTransport(DirectionType direction) {
+ public boolean moveTransport(MovementDirection direction) {
if (entityBoat == null || _pictureWidth == null || _pictureHeight == null)
return false;
switch (direction) {
- case Left:
- if (_startPosX - entityBoat.Step() > 0)
- _startPosX -= (int) entityBoat.Step();
+ case MovementDirection.Left:
+ if (_startPosX - entityBoat.getStep() > 0)
+ _startPosX -= (int) entityBoat.getStep();
return true;
- case Up:
- if (_startPosY - entityBoat.Step() > 0)
- _startPosY -= (int) entityBoat.Step();
+ case MovementDirection.Up:
+ if (_startPosY - entityBoat.getStep() > 0)
+ _startPosY -= (int) entityBoat.getStep();
return true;
- case Right:
- if (_startPosX + entityBoat.Step() < _pictureWidth - _drawingBoatWidth)
- _startPosX += (int) entityBoat.Step();
+ case MovementDirection.Right:
+ if (_startPosX + entityBoat.getStep() < _pictureWidth - _drawingBoatWidth)
+ _startPosX += (int) entityBoat.getStep();
return true;
- case Down:
- if (_startPosY + entityBoat.Step() < _pictureHeight - _drawingBoatHeight)
- _startPosY += (int) entityBoat.Step();
+ case MovementDirection.Down:
+ if (_startPosY + entityBoat.getStep() < _pictureHeight - _drawingBoatHeight)
+ _startPosY += (int) entityBoat.getStep();
return true;
default:
return false;
@@ -127,6 +142,6 @@ public class DrawningBoat {
g2d.setColor(Color.WHITE);
g2d.fillOval(ellipseX, ellipseY, ellipseWidth, ellipseHeight);
- _drawingCatamaranPaddle.drawCatamaranPaddles(g2d, entityBoat.getBodyColor(), _startPosX, _startPosY);
+ drawPaddles.drawPaddles(g2d, entityBoat.getBodyColor(), _startPosX, _startPosY);
}
}
diff --git a/ProjectCatamaran/src/DrawningCatamaran.java b/ProjectCatamaran/src/Drawnings/DrawningCatamaran.java
similarity index 91%
rename from ProjectCatamaran/src/DrawningCatamaran.java
rename to ProjectCatamaran/src/Drawnings/DrawningCatamaran.java
index 6a91e22..221a0f3 100644
--- a/ProjectCatamaran/src/DrawningCatamaran.java
+++ b/ProjectCatamaran/src/Drawnings/DrawningCatamaran.java
@@ -1,11 +1,14 @@
+package Drawnings;
+
+import Drawnings.DrawningBoat;
import Entities.*;
import java.awt.*;
public class DrawningCatamaran extends DrawningBoat {
EntityCatamaran EntityBoat;
- public DrawningCatamaran(int speed, float weight, Color bodyColor, Color additionalColor, boolean sail, boolean floaters) {
- super(speed, weight, bodyColor, 110, 58);
+ public DrawningCatamaran(int speed, float weight, Color bodyColor, int paddlesType, Color additionalColor, boolean sail, boolean floaters) {
+ super(speed, weight, bodyColor, paddlesType, 110, 68);
EntityBoat = new EntityCatamaran(speed, weight, bodyColor, additionalColor, floaters, sail);
}
@@ -15,9 +18,10 @@ public class DrawningCatamaran extends DrawningBoat {
- private void drawFloater(int y0, Color additionalColor, Graphics g2d)
+ private void drawFloater(int y0, Color additionalColor, Graphics2D g2d)
{
g2d.setColor(additionalColor);
+ g2d.setStroke(new BasicStroke(2));
Point[] floater = new Point[]
{
new Point(_startPosX + 10, _startPosY + y0 + 6),
diff --git a/ProjectCatamaran/src/Drawnings/DrawningOvalPaddles.java b/ProjectCatamaran/src/Drawnings/DrawningOvalPaddles.java
new file mode 100644
index 0000000..ea1a030
--- /dev/null
+++ b/ProjectCatamaran/src/Drawnings/DrawningOvalPaddles.java
@@ -0,0 +1,38 @@
+package Drawnings;
+import java.awt.*;
+
+public class DrawningOvalPaddles implements IDrawPaddles {
+ private PaddlesCount _paddlesCount;
+
+ @Override
+ public void setNumber(int paddlesCount) {
+ for (PaddlesCount value : PaddlesCount.values()) {
+ if (value.getEnumNumber() == paddlesCount) {
+ _paddlesCount = value;
+ return;
+ }
+ }
+ }
+
+ @Override
+ public void drawPaddles(Graphics2D g2d, Color color, int _startX, int _startY) {
+ g2d.setColor(color);
+ g2d.setStroke(new BasicStroke(4));
+ int distanceBetweenPaddles = 27;
+ for (int i = 0; i < _paddlesCount.getEnumNumber(); i++) {
+ int posX = (int)(_startX + i * distanceBetweenPaddles); // Позиция X для текущей пары весел
+ drawPaddlePair(g2d, posX, (int)_startY + 5);
+ }
+
+ }
+ private void drawPaddlePair(Graphics2D g2d, int posX, int posY) {
+ g2d.drawLine(posX + 20, posY + 15, posX + 9, posY - 3); // Рисуем левое весло
+ g2d.drawLine(posX + 20, posY + 50, posX + 9, posY + 68); // Рисуем правое весло
+
+ // Добавляем овалы на концы весел
+ int ovalSize = 10; // Размер овала
+ int halfStrokeWidth = 2; // Половина толщины линии
+ g2d.fillOval(posX + 9 - halfStrokeWidth - ovalSize / 2, posY + 68 - ovalSize / 2, ovalSize, ovalSize);
+ g2d.fillOval(posX + 9 - halfStrokeWidth - ovalSize / 2, posY - 3 - ovalSize / 2, ovalSize, ovalSize);
+ }
+}
diff --git a/ProjectCatamaran/src/DrawningCatamaranPaddle.java b/ProjectCatamaran/src/Drawnings/DrawningPaddles.java
similarity index 50%
rename from ProjectCatamaran/src/DrawningCatamaranPaddle.java
rename to ProjectCatamaran/src/Drawnings/DrawningPaddles.java
index e7e1eb1..0245683 100644
--- a/ProjectCatamaran/src/DrawningCatamaranPaddle.java
+++ b/ProjectCatamaran/src/Drawnings/DrawningPaddles.java
@@ -1,34 +1,35 @@
+package Drawnings;
+
import java.awt.*;
-public class DrawningCatamaranPaddle {
+public class DrawningPaddles implements IDrawPaddles {
private PaddlesCount _paddlesCount;
-
- public void setEnumNumber(int paddlesCount) {
+ @Override
+ public void setNumber(int paddlesCount) {
for (PaddlesCount value : PaddlesCount.values()) {
if (value.getEnumNumber() == paddlesCount) {
_paddlesCount = value;
return;
}
}
+
}
- public void drawCatamaranPaddles(Graphics g, Color color, float startPosX, float startPosY) {
-
- Graphics2D g2d = (Graphics2D) g;
+ @Override
+ public void drawPaddles(Graphics2D g2d, Color color, int _startX, int _startY) {
g2d.setColor(color);
g2d.setStroke(new BasicStroke(4));
int distanceBetweenPaddles = 27;
for (int i = 0; i < _paddlesCount.getEnumNumber(); i++) {
- int posX = (int)(startPosX + i * distanceBetweenPaddles); // Позиция X для текущей пары весел
- drawPaddlePair(g2d, posX, (int)startPosY + 5);
-
+ int posX = (int)(_startX + i * distanceBetweenPaddles); // Позиция X для текущей пары весел
+ drawPaddlePair(g2d, posX, (int)_startY + 5);
}
}
private void drawPaddlePair(Graphics2D g2d, int posX, int posY) {
- g2d.drawLine(posX + 20, posY + 15, posX + 5, posY); // Рисуем левое весло
- g2d.drawLine(posX + 20, posY + 50, posX + 5, posY + 65); // Рисуем правое весло
+ g2d.drawLine(posX + 20, posY + 15, posX + 9, posY - 3); // Рисуем левое весло
+ g2d.drawLine(posX + 20, posY + 50, posX + 9, posY + 68); // Рисуем правое весло
}
-}
+}
\ No newline at end of file
diff --git a/ProjectCatamaran/src/Drawnings/DrawningRectanglePaddles.java b/ProjectCatamaran/src/Drawnings/DrawningRectanglePaddles.java
new file mode 100644
index 0000000..0e4e1e2
--- /dev/null
+++ b/ProjectCatamaran/src/Drawnings/DrawningRectanglePaddles.java
@@ -0,0 +1,39 @@
+package Drawnings;
+
+import java.awt.*;
+
+public class DrawningRectanglePaddles implements IDrawPaddles {
+ private PaddlesCount _paddlesCount;
+
+ @Override
+ public void setNumber(int paddlesCount) {
+ for (PaddlesCount value : PaddlesCount.values()) {
+ if (value.getEnumNumber() == paddlesCount) {
+ _paddlesCount = value;
+ return;
+ }
+ }
+ }
+
+ @Override
+ public void drawPaddles(Graphics2D g2d, Color color, int _startX, int _startY) {
+ g2d.setColor(color);
+ g2d.setStroke(new BasicStroke(4));
+ int distanceBetweenPaddles = 27;
+ for (int i = 0; i < _paddlesCount.getEnumNumber(); i++) {
+ int posX = (int)(_startX + i * distanceBetweenPaddles); // Позиция X для текущей пары весел
+ drawPaddlePair(g2d, posX, (int)_startY + 5);
+ }
+ }
+
+ private void drawPaddlePair(Graphics2D g2d, int posX, int posY) {
+ g2d.drawLine(posX + 20, posY + 15, posX + 9, posY - 3); // Рисуем левое весло
+ g2d.drawLine(posX + 20, posY + 50, posX + 9, posY + 68); // Рисуем правое весло
+
+ int rectangleSize = 8; // Размер прямоугольника
+ int halfStrokeWidth = 2; // Половина толщины линии
+ // Добавляем прямоугольники на концы весел
+ g2d.fillRect(posX + 9 - halfStrokeWidth - rectangleSize / 2, posY + 68 - rectangleSize / 2, rectangleSize, rectangleSize);
+ g2d.fillRect(posX + 9 - halfStrokeWidth - rectangleSize / 2, posY - 3 - rectangleSize / 2, rectangleSize, rectangleSize);
+ }
+}
diff --git a/ProjectCatamaran/src/Drawnings/IDrawPaddles.java b/ProjectCatamaran/src/Drawnings/IDrawPaddles.java
new file mode 100644
index 0000000..5c64b2d
--- /dev/null
+++ b/ProjectCatamaran/src/Drawnings/IDrawPaddles.java
@@ -0,0 +1,8 @@
+package Drawnings;
+
+import java.awt.*;
+
+public interface IDrawPaddles {
+ void setNumber(int x);
+ void drawPaddles(Graphics2D graphics2D, Color color, int _startX, int _startY);
+}
diff --git a/ProjectCatamaran/src/PaddlesCount.java b/ProjectCatamaran/src/Drawnings/PaddlesCount.java
similarity index 92%
rename from ProjectCatamaran/src/PaddlesCount.java
rename to ProjectCatamaran/src/Drawnings/PaddlesCount.java
index 5ab5d2b..ae60f0e 100644
--- a/ProjectCatamaran/src/PaddlesCount.java
+++ b/ProjectCatamaran/src/Drawnings/PaddlesCount.java
@@ -1,3 +1,5 @@
+package Drawnings;
+
public enum PaddlesCount {
One(1),
Two(2),
diff --git a/ProjectCatamaran/src/Entities/EntityBoat.java b/ProjectCatamaran/src/Entities/EntityBoat.java
index 4731a45..d3457d3 100644
--- a/ProjectCatamaran/src/Entities/EntityBoat.java
+++ b/ProjectCatamaran/src/Entities/EntityBoat.java
@@ -15,7 +15,8 @@ public class EntityBoat {
public Color getBodyColor() {
return BodyColor;
}
- public double Step() {
+ private double Step;
+ public double getStep() {
return Speed*100/Weight;
}
diff --git a/ProjectCatamaran/src/FormCatamaran.form b/ProjectCatamaran/src/FormCatamaran.form
index ab58961..d015bef 100644
--- a/ProjectCatamaran/src/FormCatamaran.form
+++ b/ProjectCatamaran/src/FormCatamaran.form
@@ -8,17 +8,89 @@
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -31,7 +103,7 @@
-
+
@@ -42,66 +114,14 @@
-
+
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
diff --git a/ProjectCatamaran/src/FormCatamaran.java b/ProjectCatamaran/src/FormCatamaran.java
index fd50c2d..67e9c86 100644
--- a/ProjectCatamaran/src/FormCatamaran.java
+++ b/ProjectCatamaran/src/FormCatamaran.java
@@ -1,3 +1,5 @@
+import Drawnings.*;
+import MovementStrategy.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
@@ -16,17 +18,21 @@ public class FormCatamaran extends JFrame {
private JButton buttonLeft;
private JButton buttonUp;
private JButton buttonCreateBoat;
+ private JComboBox comboBoxStrategy;
+ private JButton buttonStrategyStep;
+ private AbstractStrategy _strategy;
private List controls;
private void createObject(String type) {
Random random = new Random();
switch (type) {
- case "DrawningBoat":
- _drawningBoat = new DrawningBoat(random.nextInt(100 - 30) + 30, random.nextInt(500 - 100) + 100, new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
+ case "Drawnings.DrawningBoat":
+ _drawningBoat = new DrawningBoat(random.nextInt(100 - 30) + 30, random.nextInt(500 - 100) + 100,
+ new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)), random.nextInt(3));
break;
- case "DrawningCatamaran":
+ case "Drawnings.DrawningCatamaran":
_drawningBoat = new DrawningCatamaran(random.nextInt(100 - 30) + 30, random.nextInt(500 - 100) + 100,
- new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)),
+ new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)), random.nextInt(3),
new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)),
random.nextBoolean(), random.nextBoolean());
break;
@@ -36,6 +42,9 @@ public class FormCatamaran extends JFrame {
_drawningBoat.setPictureSize(PictureBox.getWidth(), PictureBox.getHeight());
_drawningBoat.setPosition(random.nextInt(25, 100),
random.nextInt(25, 100));
+ _strategy = null;
+ comboBoxStrategy.setEnabled(true);
+
Draw();
}
@@ -47,20 +56,17 @@ public class FormCatamaran extends JFrame {
InitializeControlsRepaintList();
-
buttonCreateCatamaran.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
- createObject("DrawningCatamaran");
-
-
+ createObject("Drawnings.DrawningCatamaran");
}
});
buttonCreateBoat.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
- createObject("DrawningBoat");
+ createObject("Drawnings.DrawningBoat");
}
});
ActionListener buttonMoveClickedListener = new ActionListener() {
@@ -71,19 +77,19 @@ public class FormCatamaran extends JFrame {
switch (buttonName) {
case "buttonUp": {
- result = _drawningBoat.moveTransport(DirectionType.Up);
+ result = _drawningBoat.moveTransport(MovementDirection.Up);
}
break;
case "buttonDown": {
- result = _drawningBoat.moveTransport(DirectionType.Down);
+ result = _drawningBoat.moveTransport(MovementDirection.Down);
}
break;
case "buttonLeft": {
- result = _drawningBoat.moveTransport(DirectionType.Left);
+ result = _drawningBoat.moveTransport(MovementDirection.Left);
}
break;
case "buttonRight": {
- result = _drawningBoat.moveTransport(DirectionType.Right);
+ result = _drawningBoat.moveTransport(MovementDirection.Right);
}
break;
@@ -98,8 +104,53 @@ public class FormCatamaran extends JFrame {
buttonLeft.addActionListener(buttonMoveClickedListener);
buttonUp.addActionListener(buttonMoveClickedListener);
+ String[] itemsComboBox = {
+ "К центру",
+ "К краю"
+ };
+ for (String item: itemsComboBox) {
+ comboBoxStrategy.addItem(item);
+ }
+ buttonStrategyStep.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (_drawningBoat == null)
+ return;
+ if (comboBoxStrategy.isEnabled()) {
+ switch (comboBoxStrategy.getSelectedIndex()) {
+ case 0:
+ _strategy = new MoveToCenter();
+ break;
+ case 1:
+ _strategy = new MoveToBorder();
+ break;
+ default:
+ _strategy = null;
+ break;
+
+ }
+ if (_strategy == null) {
+ return;
+ }
+ _strategy.SetData(new MoveableBoat(_drawningBoat), PictureBox.getWidth(), PictureBox.getHeight());
+ }
+ if (_strategy == null) {
+ return;
+ }
+ _strategy.MakeStep();
+ Draw();
+
+ if (_strategy.GetStatus() == StrategyStatus.Finish) {
+ comboBoxStrategy.setEnabled(true);
+ _strategy = null;
+ }
+ }
+ });
}
+
+
+
private void Draw() {
if (_drawningBoat.getEntityBoat() == null)
return;
@@ -120,7 +171,6 @@ public class FormCatamaran extends JFrame {
}
}
-
private void InitializeControlsRepaintList() {
controls = new LinkedList<>();
controls.add(buttonCreateCatamaran);
@@ -129,6 +179,8 @@ public class FormCatamaran extends JFrame {
controls.add(buttonDown);
controls.add(buttonLeft);
controls.add(buttonRight);
+ controls.add(comboBoxStrategy);
+ controls.add(buttonStrategyStep);
}
diff --git a/ProjectCatamaran/src/Main.java b/ProjectCatamaran/src/Main.java
index c243058..843e4bb 100644
--- a/ProjectCatamaran/src/Main.java
+++ b/ProjectCatamaran/src/Main.java
@@ -1,7 +1,5 @@
import javax.swing.*;
-//TIP To Run code, press or
-// click the icon in the gutter.
public class Main {
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(false);
@@ -12,8 +10,5 @@ public class Main {
frame.pack();
frame.setSize(700, 500);
frame.setVisible(true);
- //TIP Press with your caret at the highlighted text
- // to see how IntelliJ IDEA suggests fixing it.
-
}
}
\ No newline at end of file
diff --git a/ProjectCatamaran/src/MovementStrategy/AbstractStrategy.java b/ProjectCatamaran/src/MovementStrategy/AbstractStrategy.java
new file mode 100644
index 0000000..e6bb51f
--- /dev/null
+++ b/ProjectCatamaran/src/MovementStrategy/AbstractStrategy.java
@@ -0,0 +1,76 @@
+package MovementStrategy;
+
+public abstract class AbstractStrategy {
+ private IMoveableObject _moveableObject;
+ private StrategyStatus _state = StrategyStatus.NotInit;
+ protected int FieldWidth;
+ protected int FieldHeight;
+ public StrategyStatus GetStatus() { return _state; }
+
+ // Изменить статус, установить поля
+ public void SetData(IMoveableObject moveableObject, int width, int height)
+ {
+ if (moveableObject == null)
+ {
+ _state = StrategyStatus.NotInit;
+ return;
+ }
+ _state = StrategyStatus.InProgress;
+ _moveableObject = moveableObject;
+ FieldWidth = width;
+ FieldHeight = height;
+ }
+
+ // сделать шаг
+ public void MakeStep()
+ {
+ if (_state != StrategyStatus.InProgress)
+ {
+ return;
+ }
+ if (IsTargetDestination())
+ {
+ _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 int GetStep()
+ {
+ if (_state != StrategyStatus.InProgress)
+ {
+ return 0;
+ }
+ return _moveableObject.GetStep();
+ }
+ // перемещение
+ protected abstract void MoveToTarget();
+
+ // достигнута ли цель
+ protected abstract boolean IsTargetDestination();
+
+ // попытка перемещения по направлению
+ private boolean MoveTo(MovementDirection directionType)
+ {
+ if (_state != StrategyStatus.InProgress)
+ {
+ return false;
+ }
+ if (_moveableObject.TryMoveObject(directionType))
+ {
+ _moveableObject.MoveObject(directionType);
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/ProjectCatamaran/src/MovementStrategy/IMoveableObject.java b/ProjectCatamaran/src/MovementStrategy/IMoveableObject.java
new file mode 100644
index 0000000..df158de
--- /dev/null
+++ b/ProjectCatamaran/src/MovementStrategy/IMoveableObject.java
@@ -0,0 +1,8 @@
+package MovementStrategy;
+
+public interface IMoveableObject {
+ ObjectParameters GetObjectPosition();
+ int GetStep();
+ boolean TryMoveObject(MovementDirection direction);
+ void MoveObject(MovementDirection direction);
+}
diff --git a/ProjectCatamaran/src/MovementStrategy/MoveToBorder.java b/ProjectCatamaran/src/MovementStrategy/MoveToBorder.java
new file mode 100644
index 0000000..24ed166
--- /dev/null
+++ b/ProjectCatamaran/src/MovementStrategy/MoveToBorder.java
@@ -0,0 +1,37 @@
+package MovementStrategy;
+
+public class MoveToBorder extends AbstractStrategy {
+ protected boolean IsTargetDestination()
+ {
+ var objParams = GetObjectParameters();
+ if (objParams == null) {
+ return false;
+ }
+ return objParams.RightBorder() <= FieldWidth &&
+ objParams.RightBorder() + GetStep() >= FieldWidth &&
+ objParams.DownBorder() <= FieldHeight &&
+ objParams.DownBorder() + GetStep() >= FieldHeight;
+ }
+
+ protected void MoveToTarget()
+ {
+
+ var objParams = GetObjectParameters();
+ if (objParams == null) {
+ return;
+ }
+
+ var diffX = FieldWidth - objParams.ObjectMiddleHorizontal();
+ if (Math.abs(diffX) > GetStep()) {
+
+ MoveRight();
+
+ }
+ var diffY = FieldHeight - objParams.ObjectMiddleVertical();
+ if (Math.abs(diffY) > GetStep()) {
+
+ MoveDown();
+
+ }
+ }
+}
diff --git a/ProjectCatamaran/src/MovementStrategy/MoveToCenter.java b/ProjectCatamaran/src/MovementStrategy/MoveToCenter.java
new file mode 100644
index 0000000..3da1f0a
--- /dev/null
+++ b/ProjectCatamaran/src/MovementStrategy/MoveToCenter.java
@@ -0,0 +1,47 @@
+package MovementStrategy;
+
+public class MoveToCenter extends AbstractStrategy {
+ protected boolean IsTargetDestination()
+ {
+ var objParams = GetObjectParameters();
+ if (objParams == null) {
+ return false;
+ }
+ return (objParams.ObjectMiddleHorizontal() <= FieldWidth / 2 &&
+ objParams.ObjectMiddleHorizontal() + GetStep() >= FieldWidth / 2 &&
+ objParams.ObjectMiddleVertical() <= FieldHeight / 2 &&
+ objParams.ObjectMiddleVertical() + GetStep() >= FieldHeight / 2);
+ }
+
+ protected void MoveToTarget()
+ {
+
+ var objParams = GetObjectParameters();
+ if (objParams == null) {
+ return;
+ }
+
+ var diffX = objParams.ObjectMiddleHorizontal() - FieldWidth / 2;
+ if (Math.abs(diffX) > GetStep()) {
+ if (diffX > 0)
+ {
+ MoveLeft();
+ }
+ else
+ {
+ MoveRight();
+ }
+ }
+ var diffY = objParams.ObjectMiddleVertical() - FieldHeight / 2;
+ if (Math.abs(diffY) > GetStep()) {
+ if (diffY > 0)
+ {
+ MoveUp();
+ }
+ else
+ {
+ MoveDown();
+ }
+ }
+ }
+}
diff --git a/ProjectCatamaran/src/MovementStrategy/MoveableBoat.java b/ProjectCatamaran/src/MovementStrategy/MoveableBoat.java
new file mode 100644
index 0000000..dfa19ea
--- /dev/null
+++ b/ProjectCatamaran/src/MovementStrategy/MoveableBoat.java
@@ -0,0 +1,28 @@
+package MovementStrategy;
+import Drawnings.*;
+import Entities.EntityBoat;
+
+
+public class MoveableBoat implements IMoveableObject {
+ private DrawningBoat _boat = null;
+
+
+ public MoveableBoat(DrawningBoat drawningBoat)
+ {
+ _boat = drawningBoat;
+ }
+
+ public ObjectParameters GetObjectPosition()
+ {
+ if (_boat == null || _boat.getEntityBoat() == null)
+ {
+ return null;
+ }
+ return new ObjectParameters(_boat.GetPosX(), _boat.GetPosY(), _boat.GetWidth(), _boat.GetHeight());
+ }
+
+ public int GetStep() { return (int) _boat.getEntityBoat().getStep(); }
+ public boolean TryMoveObject(MovementDirection direction) { return _boat.moveTransport(direction); }
+ public void MoveObject(MovementDirection direction) { _boat.moveTransport(direction); }
+
+}
diff --git a/ProjectCatamaran/src/MovementStrategy/MovementDirection.java b/ProjectCatamaran/src/MovementStrategy/MovementDirection.java
new file mode 100644
index 0000000..52d7b1b
--- /dev/null
+++ b/ProjectCatamaran/src/MovementStrategy/MovementDirection.java
@@ -0,0 +1,8 @@
+package MovementStrategy;
+
+public enum MovementDirection {
+ Up,
+ Down,
+ Left,
+ Right;
+}
diff --git a/ProjectCatamaran/src/MovementStrategy/ObjectParameters.java b/ProjectCatamaran/src/MovementStrategy/ObjectParameters.java
new file mode 100644
index 0000000..a741f5a
--- /dev/null
+++ b/ProjectCatamaran/src/MovementStrategy/ObjectParameters.java
@@ -0,0 +1,25 @@
+package MovementStrategy;
+
+public class ObjectParameters {
+ private int _x;
+ private int _y;
+ private int _width;
+ private 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)
+ {
+ _x = x;
+ _y = y;
+ _width = width;
+ _height = height;
+ }
+}
diff --git a/ProjectCatamaran/src/MovementStrategy/StrategyStatus.java b/ProjectCatamaran/src/MovementStrategy/StrategyStatus.java
new file mode 100644
index 0000000..4f087ea
--- /dev/null
+++ b/ProjectCatamaran/src/MovementStrategy/StrategyStatus.java
@@ -0,0 +1,7 @@
+package MovementStrategy;
+
+public enum StrategyStatus {
+ NotInit,
+ InProgress,
+ Finish
+}