diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/PIbd-21_Yakovlev_M.G_Parusnik_Harder.iml b/.idea/PIbd-21_Yakovlev_M.G_Parusnik_Harder.iml
new file mode 100644
index 0000000..c90834f
--- /dev/null
+++ b/.idea/PIbd-21_Yakovlev_M.G_Parusnik_Harder.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..432b646
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..4242dd8
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
new file mode 100644
index 0000000..2b63946
--- /dev/null
+++ b/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/CountPaddles.java b/src/CountPaddles.java
deleted file mode 100644
index e7d0704..0000000
--- a/src/CountPaddles.java
+++ /dev/null
@@ -1,13 +0,0 @@
-public enum CountPaddles {
- One(1),
- Two(2),
- Three(3);
-
- private final int Value;
- CountPaddles(int Count) {
- Value = Count;
- }
- public int getCountPaddles(){
- return Value;
- }
-}
diff --git a/src/Direction.java b/src/Direction.java
deleted file mode 100644
index a641b80..0000000
--- a/src/Direction.java
+++ /dev/null
@@ -1,6 +0,0 @@
-public enum Direction {
- Up,
- Down,
- Left,
- Right
-}
diff --git a/src/DrawingBoat.java b/src/DrawingBoat.java
deleted file mode 100644
index 6575909..0000000
--- a/src/DrawingBoat.java
+++ /dev/null
@@ -1,95 +0,0 @@
-import java.awt.*;
-public class DrawingBoat {
- public EntityBoat Boat;
-
- public DrawingPaddles Paddles;
- private int _startPosX;
- private int _startPosY;
- private Integer _pictureWidth = null;
- private Integer _pictureHeight = null;
- private final int _BoatWidth = 180;
- private final int _BoatHeight = 160;
-
- public void Init(int speed, float weight, Color bodyColor){
- Boat = new EntityBoat();
- Boat.Init(speed, weight, bodyColor);
- Paddles = new DrawingPaddles();
- Paddles.SetCountPaddles((int)(1+Math.random()+Math.random()*2));
- }
-
- public void SetPosition(int x, int y, int width, int height){
- if(x >= 0 && x+_BoatWidth <= width && y+_BoatHeight <= height){
- _startPosX = x;
- _startPosY = y;
- _pictureWidth = width;
- _pictureHeight = height;
- }
- }
-
- public void MoveTransport(Direction direction){
- if(_pictureWidth == null || _pictureHeight == null){
- return;
- }
-
- switch(direction){
- case Right:
- if(_startPosX + _BoatWidth + Boat.Step < _pictureWidth){
- _startPosX += Boat.Step;
- }
- break;
- case Left:
- if(_startPosX - Boat.Step >= 0){
- _startPosX -= Boat.Step;
- }
- break;
- case Up:
- if (_startPosY - Boat.Step >= 0)
- {
- _startPosY -= Boat.Step;
- }
- break;
-
- case Down:
- if (_startPosY + _BoatHeight + Boat.Step < _pictureHeight)
- {
- _startPosY += Boat.Step;
- }
- break;
- }
- }
-
- public void DrawTransport(Graphics g){
- if (_startPosX < 0 || _startPosY < 0 || _pictureHeight== null || _pictureWidth== null)
- {
- return;
- }
-
- Graphics2D g2 = (Graphics2D)g;
-
- g2.setColor(Color.BLACK);
-
- g2.drawLine(_startPosX + 10, _startPosY + 60, _startPosX + 110, _startPosY + 60);
- g2.drawLine( _startPosX + 110, _startPosY + 60, _startPosX + 180, _startPosY + 90);
- g2.drawLine( _startPosX + 180, _startPosY + 90, _startPosX + 110, _startPosY + 120);
- g2.drawLine( _startPosX + 110, _startPosY + 120, _startPosX + 10, _startPosY + 120);
- g2.drawLine(_startPosX + 10, _startPosY + 120, _startPosX + 10, _startPosY + 60);
- g2.drawOval( _startPosX + 15, _startPosY + 65, 95, 50);
-
- Paddles.DrawPaddles(g2, _startPosX, _startPosY);
-
- g2.setColor(Color.GRAY);
-
- g2.fillRect( _startPosX + 2, _startPosY + 65, 10, 50);
- g2.fillRect( _startPosX + 15, _startPosY + 53, 90, 10);
- g2.fillRect( _startPosX + 15, _startPosY + 118, 90, 10);
-
- g2.setColor(Color.BLACK);
-
- g2.drawRect( _startPosX + 60, _startPosY , 4, 90);
- g2.drawRect( _startPosX + 60, _startPosY , 4, 90);
- g2.drawLine( _startPosX + 25, _startPosY + 20, _startPosX + 100, _startPosY);
- g2.drawLine( _startPosX + 100, _startPosY, _startPosX + 100, _startPosY + 50);
- g2.drawLine( _startPosX + 25, _startPosY + 70, _startPosX + 100, _startPosY + 50);
- g2.drawLine( _startPosX + 25, _startPosY + 70, _startPosX + 25, _startPosY + 20);
- }
-}
diff --git a/src/DrawingField.java b/src/DrawingField.java
deleted file mode 100644
index 6e40815..0000000
--- a/src/DrawingField.java
+++ /dev/null
@@ -1,52 +0,0 @@
-import javax.swing.*;
-import java.awt.*;
-import java.util.Random;
-public class DrawingField extends JPanel{
- private final FormBoat field;
- DrawingBoat _Boat;
- public DrawingField(FormBoat field){
- this.field = field;
- }
- @Override
- protected void paintComponent(Graphics g){
- super.paintComponent(g);
- Graphics2D g2 = (Graphics2D)g;
- if(_Boat != null){
- _Boat.DrawTransport(g2);
- }
- else return;
- }
- public void UpButtonAction(){
- if(_Boat != null){
- _Boat.MoveTransport(Direction.Up);
- } else return;
- }
- public void DownButtonAction(){
- if (_Boat!=null){
- _Boat.MoveTransport(Direction.Down);
- }
- else
- return;
- }
- public void RightButtonAction(){
- if (_Boat!=null){
- _Boat.MoveTransport(Direction.Right);
- }
- else
- return;
- }
- public void LeftButtonAction(){
- if (_Boat!=null){
- _Boat.MoveTransport(Direction.Left);
- }
- else
- return;
- }
-
- public void CreateButtonAction(){
- Random r = new Random();
- _Boat = new DrawingBoat();
- _Boat.Init(r.nextInt(50)+10,r.nextInt(100)+500,new Color(r.nextInt(256),r.nextInt(256),r.nextInt(256)));
- _Boat.SetPosition(r.nextInt(100)+10,r.nextInt(100)+10,getWidth(),getHeight());
- }
-}
diff --git a/src/DrawingPaddles.java b/src/DrawingPaddles.java
deleted file mode 100644
index 9787a3c..0000000
--- a/src/DrawingPaddles.java
+++ /dev/null
@@ -1,43 +0,0 @@
-import java.awt.*;
-public class DrawingPaddles {
- private CountPaddles _paddles;
-
- private int step = 0;
-
- public void SetCountPaddles(int Count){
- for(CountPaddles temp : CountPaddles.values())
- if(temp.getCountPaddles() == Count){
- _paddles = temp;
- return;
- }
- }
-
- public void DrawPaddles(Graphics2D g, int _startPosX, int _startPosY){
- step = 0;
- switch(_paddles.getCountPaddles()){
- case 1:
- drawPaddle(g,_startPosX,_startPosY);
- break;
- case 2:
- for(int i = 0;i<2;i++){
- drawPaddle(g,_startPosX,_startPosY);
- step+=25;
- }
- break;
- case 3:
- for(int i = 0;i<3;i++){
- drawPaddle(g,_startPosX,_startPosY);
- step+=25;
- }
- break;
- }
- }
-
- private void drawPaddle(Graphics2D g, int _startPosX, int _startPosY){
- g.setColor(Color.BLACK);
- g.drawLine(_startPosX + 20+step, _startPosY + 60, _startPosX + 35+step, _startPosY + 27);
- g.drawOval(_startPosX+32+step, _startPosY+13, 10, 15);
- g.drawLine(_startPosX + 20+step, _startPosY + 120, _startPosX + 35+step, _startPosY + 150);
- g.drawOval(_startPosX+32+step, _startPosY+150, 10, 15);
- }
-}
diff --git a/src/EntityBoat.java b/src/EntityBoat.java
deleted file mode 100644
index 653e3f9..0000000
--- a/src/EntityBoat.java
+++ /dev/null
@@ -1,17 +0,0 @@
-import java.awt.*;
-import java.util.Random;
-public class EntityBoat {
- private int Speed;
-
- private float Weight;
- private Color BodyColor;
- public float Step;
-
- public void Init(int speed, float weight, Color bodyColor){
- Random r = new Random();
- Speed = speed <= 0 ? r.nextInt(50)+10 : speed;
- Weight = weight <= 0 ? r.nextInt(100)+500:weight;
- BodyColor = bodyColor;
- Step = Speed * 600 / (int)Weight;
- }
-}
diff --git a/src/FormBoat.java b/src/FormBoat.java
deleted file mode 100644
index bdb2ed5..0000000
--- a/src/FormBoat.java
+++ /dev/null
@@ -1,123 +0,0 @@
-import javax.swing.*;
-import java.awt.*;
-
-public class FormBoat extends JFrame{
- private final int Width;
- private final int Height;
-
- JPanel BottomPanel = new JPanel();
- JPanel CreatePanel = new JPanel();
- JPanel BottomAndCreatePanel = new JPanel();
- JPanel DimentionPanel = new JPanel();
- JPanel UpPanel = new JPanel();
- JPanel DownPanel = new JPanel();
- JPanel LRPanel = new JPanel();
-
- DrawingField field = new DrawingField(this);
-
- JButton ButtonCreate = new JButton("Создать");
-
- Icon arrowUp = new ImageIcon("Resources/up.png");
- JButton ButtonUp = new JButton(arrowUp);
-
- Icon arrowLeft = new ImageIcon("Resources/left.png");
- JButton ButtonLeft = new JButton(arrowLeft);
-
- Icon arrowDown = new ImageIcon("Resources/down.png");
- JButton ButtonDown = new JButton(arrowDown);
-
- Icon arrowRight = new ImageIcon("Resources/right.png");
- JButton ButtonRight = new JButton(arrowRight);
-
- public FormBoat(){
- super("Boat");
- setSize(800, 600);
- Width = getWidth();
- Height = getHeight();
- ShowWindow();
- RefreshWindow();
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- setVisible(true);
- }
-
- private void ShowWindow() {
- Dimension dimen = new Dimension(35,35);
-
- // Обработка нажатия кнопки
- ButtonUp.setPreferredSize(dimen);
- ButtonUp.addActionListener(e->{
- field.UpButtonAction();
- repaint();
- });
-
- // Обработка нажатия кнопки
- ButtonDown.setPreferredSize(dimen);
- ButtonDown.addActionListener(e->{
- field.DownButtonAction();
- repaint();
- });
-
- // Обработка нажатия кнопки
- ButtonRight.setPreferredSize(dimen);
- ButtonRight.addActionListener(e->{
- field.RightButtonAction();
- repaint();
- });
-
- // Обработка нажатия кнопки
- ButtonLeft.setPreferredSize(dimen);
- ButtonLeft.addActionListener(e->{
- field.LeftButtonAction();
- repaint();
- });
-
- // Добавление кнопок на панель (Левая и правая стрелки)
- LRPanel.setLayout(new FlowLayout(FlowLayout.CENTER,50,0));
- LRPanel.setBackground(new Color(0,0,0,0));
- LRPanel.add(ButtonLeft);
- LRPanel.add(ButtonRight);
-
- // Добавление кнопки (Стрелка вверх)
- UpPanel.setLayout(new FlowLayout());
- UpPanel.setBackground(new Color(0,0,0,0));
- UpPanel.add(ButtonUp);
-
- // Добавление кнопки (Стрелка вниз)
- DownPanel.setLayout(new FlowLayout());
- DownPanel.setBackground(new Color(0,0,0,0));
- DownPanel.add(ButtonDown);
-
- DimentionPanel.setLayout(new BoxLayout(DimentionPanel,BoxLayout.Y_AXIS));
- DimentionPanel.setBackground(new Color(0,0,0,0));
- DimentionPanel.add(UpPanel);
- DimentionPanel.add(LRPanel);
- DimentionPanel.add(DownPanel);
- add(DimentionPanel);
-
- //нажатие кнопки
- CreatePanel.setLayout(new FlowLayout());
- CreatePanel.setBackground(new Color(0,0,0,0));
- CreatePanel.add(ButtonCreate);
- ButtonCreate.addActionListener(e->{
- field.CreateButtonAction();
- repaint();
- });
-
- BottomPanel.setLayout(new FlowLayout());
- BottomPanel.setBackground(new Color(0,0,0,0));
-
- BottomAndCreatePanel.setLayout(new BoxLayout(BottomAndCreatePanel,BoxLayout.Y_AXIS));
- BottomAndCreatePanel.setBackground(new Color(0,0,0,0));
- BottomAndCreatePanel.add(CreatePanel);
- BottomAndCreatePanel.add(BottomPanel);
-
- add(BottomAndCreatePanel);
- add(field);
-
- }
- public void RefreshWindow(){
- field.setBounds(0,0,Width,Height);
- BottomAndCreatePanel.setBounds(-320,Height-110,Width,80);
- DimentionPanel.setBounds(Width-170,Height-170,190,140);
- }
-}
diff --git a/src/SailBoatHard/Complication/DrawPaddle.java b/src/SailBoatHard/Complication/DrawPaddle.java
new file mode 100644
index 0000000..277b9fe
--- /dev/null
+++ b/src/SailBoatHard/Complication/DrawPaddle.java
@@ -0,0 +1,53 @@
+package SailBoatHard.Complication;
+import java.awt.*;
+public class DrawPaddle implements IDrawPaddle {
+ private Paddle paddleCount;
+ @Override
+ public void SetPaddleCount(int num) {
+ switch (num){
+ case 1:
+ paddleCount = Paddle.One;
+ break;
+ case 2:
+ paddleCount = Paddle.Two;
+ break;
+ default:
+ paddleCount = Paddle.Three;
+ }
+ }
+ @Override
+ public Paddle GetPaddleCount() {
+ return paddleCount;
+ }
+ public void DrawPaddles(int _startPosX, int _startPosY,Graphics g2d){
+ switch (paddleCount)
+ {
+ case One:
+ break;
+
+ case Two:
+ DrawFirstDop(_startPosX,_startPosY,g2d);
+ break;
+
+ case Three:
+ DrawSecondDop(_startPosX,_startPosY,g2d);
+ break;
+ }
+ }
+ public void DrawFirstDop(int _startPosX, int _startPosY, Graphics g) {
+ g.setColor(Color.BLACK);
+ g.drawLine(_startPosX + 30, _startPosY + 60, _startPosX + 45, _startPosY + 27);
+ g.drawOval(_startPosX+42, _startPosY+13, 10, 15);
+ g.drawLine(_startPosX + 30, _startPosY + 120, _startPosX + 45, _startPosY + 150);
+ g.drawOval(_startPosX+42, _startPosY+150, 10, 15);
+ }
+ public void DrawSecondDop(int _startPosX, int _startPosY, Graphics g) {
+ DrawFirstDop(_startPosX,_startPosY,g);
+ g.setColor(Color.BLACK);
+ g.drawLine(_startPosX + 75, _startPosY + 60, _startPosX + 90, _startPosY + 27);
+ g.drawOval(_startPosX+87, _startPosY+13, 10, 15);
+ g.drawLine(_startPosX + 75, _startPosY + 120, _startPosX + 90, _startPosY + 150);
+ g.drawOval(_startPosX+87, _startPosY+150, 10, 15);
+ }
+
+}
\ No newline at end of file
diff --git a/src/SailBoatHard/Complication/DrawPaddleRectangle.java b/src/SailBoatHard/Complication/DrawPaddleRectangle.java
new file mode 100644
index 0000000..2a08b79
--- /dev/null
+++ b/src/SailBoatHard/Complication/DrawPaddleRectangle.java
@@ -0,0 +1,56 @@
+package SailBoatHard.Complication;
+import java.awt.*;
+
+public class DrawPaddleRectangle implements IDrawPaddle {
+ private Paddle paddleCount;
+ @Override
+ public void SetPaddleCount(int num) {
+ switch (num){
+ case 1:
+ paddleCount = Paddle.One;
+ break;
+ case 2:
+ paddleCount = Paddle.Two;
+ break;
+ default:
+ paddleCount = Paddle.Three;
+ }
+ }
+
+ @Override
+ public Paddle GetPaddleCount() {
+ return paddleCount;
+ }
+
+ @Override
+ public void DrawPaddles(int _startPosX, int _startPosY,Graphics g2d) {
+ switch (paddleCount)
+ {
+ case One:
+ break;
+
+ case Two:
+ DrawFirstDopRect(_startPosX,_startPosY,g2d);
+ break;
+
+ case Three:
+ DrawSecondDopRect(_startPosX,_startPosY,g2d);
+ break;
+ }
+ }
+ public void DrawFirstDopRect(int _startPosX, int _startPosY, Graphics g) {
+ g.setColor(Color.BLACK);
+ g.drawLine(_startPosX + 30, _startPosY + 60, _startPosX + 45, _startPosY + 27);
+ g.drawRect(_startPosX+42, _startPosY+13, 10, 15);
+ g.drawLine(_startPosX + 30, _startPosY + 120, _startPosX + 45, _startPosY + 150);
+ g.drawRect(_startPosX+42, _startPosY+150, 10, 15);
+ }
+ public void DrawSecondDopRect(int _startPosX, int _startPosY, Graphics g) {
+ DrawFirstDopRect(_startPosX,_startPosY,g);
+ g.setColor(Color.BLACK);
+ g.drawLine(_startPosX + 75, _startPosY + 60, _startPosX + 90, _startPosY + 27);
+ g.drawRect(_startPosX+87, _startPosY+13, 10, 15);
+ g.drawLine(_startPosX + 75, _startPosY + 120, _startPosX + 90, _startPosY + 150);
+ g.drawRect(_startPosX+87, _startPosY+150, 10, 15);
+ }
+}
\ No newline at end of file
diff --git a/src/SailBoatHard/Complication/DrawPaddleTriangle.java b/src/SailBoatHard/Complication/DrawPaddleTriangle.java
new file mode 100644
index 0000000..f711bc5
--- /dev/null
+++ b/src/SailBoatHard/Complication/DrawPaddleTriangle.java
@@ -0,0 +1,77 @@
+package SailBoatHard.Complication;
+
+import java.awt.*;
+
+public class DrawPaddleTriangle implements IDrawPaddle {
+ private Paddle paddleCount;
+
+ @Override
+ public void SetPaddleCount(int num) {
+ switch (num) {
+ case 1:
+ paddleCount = Paddle.One;
+ break;
+ case 2:
+ paddleCount = Paddle.Two;
+ break;
+ default:
+ paddleCount = Paddle.Three;
+ }
+ }
+
+ @Override
+ public Paddle GetPaddleCount() {
+ return paddleCount;
+ }
+
+ @Override
+ public void DrawPaddles(int _startPosX, int _startPosY, Graphics g2d) {
+ switch (paddleCount) {
+ case One:
+ break;
+
+ case Two:
+ DrawFirstDopTriangle(_startPosX, _startPosY, g2d);
+ break;
+
+ case Three:
+ DrawSecondDopTriangle(_startPosX, _startPosY, g2d);
+ break;
+ }
+ }
+
+ public void DrawFirstDopTriangle(int _startPosX, int _startPosY, Graphics g) {
+ g.setColor(Color.BLACK);
+ g.drawLine(_startPosX + 30, _startPosY + 60, _startPosX + 45, _startPosY + 27);
+ g.drawLine(_startPosX + 30, _startPosY + 120, _startPosX + 45, _startPosY + 150);
+ Polygon elementsSec = new Polygon();
+ elementsSec.addPoint(_startPosX + 45, _startPosY + 13);
+ elementsSec.addPoint(_startPosX + 52, _startPosY + 35);
+ elementsSec.addPoint(_startPosX + 35, _startPosY + 35);
+ g.setColor(Color.BLACK);
+ g.fillPolygon(elementsSec);
+ elementsSec = new Polygon();
+ elementsSec.addPoint(_startPosX + 45, _startPosY + 163);
+ elementsSec.addPoint(_startPosX + 52, _startPosY + 145);
+ elementsSec.addPoint(_startPosX + 35, _startPosY + 145);
+ g.fillPolygon(elementsSec);
+ }
+
+ public void DrawSecondDopTriangle(int _startPosX, int _startPosY, Graphics g) {
+ DrawFirstDopTriangle(_startPosX, _startPosY, g);
+ g.setColor(Color.BLACK);
+ g.drawLine(_startPosX + 75, _startPosY + 60, _startPosX + 90, _startPosY + 27);
+ g.drawLine(_startPosX + 75, _startPosY + 120, _startPosX + 90, _startPosY + 150);
+ Polygon elementsThree = new Polygon();
+ elementsThree.addPoint(_startPosX + 90, _startPosY + 13);
+ elementsThree.addPoint(_startPosX + 97, _startPosY + 35);
+ elementsThree.addPoint(_startPosX + 80, _startPosY + 35);
+ g.setColor(Color.BLACK);
+ g.fillPolygon(elementsThree);
+ elementsThree = new Polygon();
+ elementsThree.addPoint(_startPosX + 90, _startPosY + 163);
+ elementsThree.addPoint(_startPosX + 97, _startPosY + 145);
+ elementsThree.addPoint(_startPosX + 80, _startPosY + 145);
+ g.fillPolygon(elementsThree);
+ }
+}
\ No newline at end of file
diff --git a/src/SailBoatHard/Complication/IDrawPaddle.java b/src/SailBoatHard/Complication/IDrawPaddle.java
new file mode 100644
index 0000000..9b0c1da
--- /dev/null
+++ b/src/SailBoatHard/Complication/IDrawPaddle.java
@@ -0,0 +1,7 @@
+package SailBoatHard.Complication;
+import java.awt.*;
+public interface IDrawPaddle {
+ void SetPaddleCount(int number);
+ Paddle GetPaddleCount();
+ void DrawPaddles(int _startPosX, int _startPosY,Graphics g2d);
+}
\ No newline at end of file
diff --git a/src/SailBoatHard/Complication/Paddle.java b/src/SailBoatHard/Complication/Paddle.java
new file mode 100644
index 0000000..b13e633
--- /dev/null
+++ b/src/SailBoatHard/Complication/Paddle.java
@@ -0,0 +1,8 @@
+package SailBoatHard.Complication;
+
+public enum Paddle {
+ One(1),
+ Two(2),
+ Three(3);
+ Paddle(int i) {}
+}
diff --git a/src/SailBoatHard/Direction/Direction.java b/src/SailBoatHard/Direction/Direction.java
new file mode 100644
index 0000000..384f4f6
--- /dev/null
+++ b/src/SailBoatHard/Direction/Direction.java
@@ -0,0 +1,16 @@
+package SailBoatHard.Direction;
+
+public enum Direction {
+ Up(1),
+ Down(2),
+ Left (3),
+ Right(4)
+ ;
+ private final int Direct;
+ Direction(int i) {
+ this.Direct=i;
+ }
+ public int GetDirect() {
+ return Direct;
+ }
+}
diff --git a/src/SailBoatHard/Drawing/DrawingBoat.java b/src/SailBoatHard/Drawing/DrawingBoat.java
new file mode 100644
index 0000000..5ddf93f
--- /dev/null
+++ b/src/SailBoatHard/Drawing/DrawingBoat.java
@@ -0,0 +1,107 @@
+package SailBoatHard.Drawing;
+
+import SailBoatHard.Direction.Direction;
+import SailBoatHard.Entity.EntityBoat;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.geom.Ellipse2D;
+import java.util.*;
+
+public class DrawingBoat extends JPanel {
+ public EntityBoat boat; //Класс-сущность
+ public int _startPosX; //Координаты отрисовки по оси x
+ public EntityBoat GetBoat(){return boat;}
+ public int GetStartX() {
+ return _startPosX;
+ }
+ public int _startPosY; //Координаты отрисовки по оси y
+ public int GetStartY() {
+ return _startPosY;
+ }
+ private Integer _pictureWidth = null; //Ширина окна
+ private Integer _pictureHeight = null; //Высота окна
+ private final int _boatWidth = 180; //Ширина отрисовки крейсера
+ public int GetWidth() {
+ return _boatWidth;
+ }
+ private final int _boatHeight = 180; //Высота отрисовки крейсера
+ public int GetHeight() {
+ return _boatHeight;
+ }
+
+ //Инициализация
+ public DrawingBoat(int speed, float weight, Color bodyColor, int width, int height, int blockCount) {
+ boat = new EntityBoat(speed,weight,bodyColor);
+ _pictureWidth = width;
+ _pictureHeight = height;
+
+ }
+
+ //Начальные коордитанты
+ public void SetPosition(int x, int y, int width, int height)
+ {
+ if (width < _boatWidth || height < _boatHeight) return;
+ Random random = new Random();
+ _startPosX = x < 0 || x + _boatWidth > width ? random.nextInt(0, width - _boatWidth) : x;
+ _startPosY = y < 0 || y + _boatHeight > height ? random.nextInt(0, height - _boatHeight) : y;
+ _pictureWidth = width;
+ _pictureHeight = height;
+ }
+
+ //Движение транспорта по координатам
+ public void MoveTransport(Direction direction)
+ {
+ if (_pictureWidth == null || _pictureHeight == null) return;
+ switch (direction)
+ {
+ case Left: //Влево
+ if (_startPosX - boat.GetStep() > 0) _startPosX -= boat.GetStep();
+ break;
+ case Up: //Вверх
+ if (_startPosY - boat.GetStep() > 0) _startPosY -= boat.GetStep();
+ break;
+ case Right: //Вправо
+ if (_startPosX + _boatWidth + boat.GetStep() < _pictureWidth) _startPosX += boat.GetStep();
+ break;
+ case Down: //Вниз
+ if (_startPosY + _boatHeight + boat.GetStep() < _pictureHeight) _startPosY += boat.GetStep();
+ break;
+ }
+ }
+
+ //Отрисовка транспорта
+ public void DrawTransport(Graphics gr)
+ {
+ if (GetBoat() == null) return;
+
+ if (_startPosX < 0 || _startPosY < 0 || _pictureWidth == null || _pictureHeight == null)
+ {
+ return;
+ }
+ Graphics2D g2 = (Graphics2D)gr;
+
+ g2.setColor(Color.BLACK);
+
+ g2.drawLine(_startPosX + 10, _startPosY + 60, _startPosX + 110, _startPosY + 60);
+ g2.drawLine( _startPosX + 110, _startPosY + 60, _startPosX + 180, _startPosY + 90);
+ g2.drawLine( _startPosX + 180, _startPosY + 90, _startPosX + 110, _startPosY + 120);
+ g2.drawLine( _startPosX + 110, _startPosY + 120, _startPosX + 10, _startPosY + 120);
+ g2.drawLine(_startPosX + 10, _startPosY + 120, _startPosX + 10, _startPosY + 60);
+ g2.drawOval( _startPosX + 15, _startPosY + 65, 95, 50);
+
+ }
+
+ //Изменение границ отрисовки
+ public boolean CanMove(Direction direction) {
+ if (boat == null) {
+ return false;
+ }
+ return switch (direction) {
+ case Left -> _startPosX - boat.GetStep() > 0;
+ case Up -> _startPosY - boat.GetStep() > 0;
+ case Right -> _startPosX + _boatWidth + boat.GetStep() < _pictureWidth;
+ case Down -> _startPosY + _boatHeight + boat.GetStep() < _pictureHeight;
+ };
+ }
+}
\ No newline at end of file
diff --git a/src/SailBoatHard/Drawing/DrawingSailBoat.java b/src/SailBoatHard/Drawing/DrawingSailBoat.java
new file mode 100644
index 0000000..dc00cfe
--- /dev/null
+++ b/src/SailBoatHard/Drawing/DrawingSailBoat.java
@@ -0,0 +1,60 @@
+package SailBoatHard.Drawing;
+import java.awt.*;
+import java.util.Random;
+
+import SailBoatHard.Complication.DrawPaddle;
+import SailBoatHard.Complication.DrawPaddleRectangle;
+import SailBoatHard.Complication.DrawPaddleTriangle;
+import SailBoatHard.Complication.IDrawPaddle;
+
+import SailBoatHard.Entity.*;
+
+public class DrawingSailBoat extends DrawingBoat {
+ private IDrawPaddle drawingPaddles;
+ public DrawingSailBoat(int speed, float weight, Color bodyColor, Color
+ elementsColor, boolean rocketMines, boolean helipad, int width, int height, int blockCount)
+ {
+ super(speed, weight, bodyColor, width, height, blockCount);
+ if (boat != null)
+ {
+ boat = new EntitySailBoat(speed, weight, bodyColor,
+ elementsColor, rocketMines, helipad);
+ }
+ Random rand = new Random();
+ drawingPaddles = switch (rand.nextInt(3)) {
+ case 0 -> new DrawPaddle();
+ case 1 -> new DrawPaddleRectangle();
+ case 2 -> new DrawPaddleTriangle();
+ default -> new DrawPaddle();
+ };
+
+ drawingPaddles.SetPaddleCount(blockCount);
+ }
+ @Override
+ public void DrawTransport(Graphics g) {
+ if (!(boat instanceof EntitySailBoat sailBoat)) {
+ return;
+ }
+ super.DrawTransport(g);
+ drawingPaddles.DrawPaddles(_startPosX, _startPosY,g);
+ if (sailBoat.GetRainforcedBody())
+ {
+ g.setColor(Color.GRAY);
+
+ g.fillRect( _startPosX + 2, _startPosY + 65, 10, 50);
+ g.fillRect( _startPosX + 15, _startPosY + 53, 90, 10);
+ g.fillRect( _startPosX + 15, _startPosY + 118, 90, 10);
+ }
+ if (sailBoat.GetSail()){
+ g.setColor(Color.BLACK);
+
+ g.drawRect( _startPosX + 60, _startPosY , 4, 90);
+ g.drawRect( _startPosX + 60, _startPosY , 4, 90);
+ g.drawLine( _startPosX + 25, _startPosY + 20, _startPosX + 100, _startPosY);
+ g.drawLine( _startPosX + 100, _startPosY, _startPosX + 100, _startPosY + 50);
+ g.drawLine( _startPosX + 25, _startPosY + 70, _startPosX + 100, _startPosY + 50);
+ g.drawLine( _startPosX + 25, _startPosY + 70, _startPosX + 25, _startPosY + 20);
+ }
+
+ }
+}
diff --git a/src/SailBoatHard/Entity/EntityBoat.java b/src/SailBoatHard/Entity/EntityBoat.java
new file mode 100644
index 0000000..6319620
--- /dev/null
+++ b/src/SailBoatHard/Entity/EntityBoat.java
@@ -0,0 +1,26 @@
+package SailBoatHard.Entity;
+
+import java.awt.*;
+import java.util.*;
+
+public class EntityBoat {
+ private int Speed; //Скорость
+ private float Weight; //Вес
+ private Color BodyColor; //Цвет
+ private float Step; //Шаг при перемещении
+
+ //Инициализация
+ public EntityBoat(int speed, float weight, Color bodyColor) {
+ Random random = new Random();
+ Speed = speed;
+ Weight = weight;
+ BodyColor = bodyColor;
+ Step = Speed * 100 / Weight;
+ }
+ public Color GetBodyColor(){
+ return BodyColor;
+ }
+ public float GetStep(){
+ return Step;
+ }
+}
diff --git a/src/SailBoatHard/Entity/EntitySailBoat.java b/src/SailBoatHard/Entity/EntitySailBoat.java
new file mode 100644
index 0000000..b8511c0
--- /dev/null
+++ b/src/SailBoatHard/Entity/EntitySailBoat.java
@@ -0,0 +1,23 @@
+package SailBoatHard.Entity;
+import java.awt.*;
+
+public class EntitySailBoat extends EntityBoat {
+ private Color ElementsColor;
+ public Color GetElementsColor() { return ElementsColor; }
+ private boolean Sail;
+ public boolean GetSail(){
+ return Sail;
+ }
+ private boolean RainforcedBody;
+ public boolean GetRainforcedBody(){
+ return RainforcedBody;
+ }
+
+ public EntitySailBoat(int speed, float weight, Color bodyColor, Color
+ elementsColor, boolean sail, boolean rainforcedBody) {
+ super(speed, weight, bodyColor);
+ ElementsColor = elementsColor;
+ Sail = sail;
+ RainforcedBody = rainforcedBody;
+ }
+}
diff --git a/src/SailBoatHard/FormBoat.java b/src/SailBoatHard/FormBoat.java
new file mode 100644
index 0000000..d8eae89
--- /dev/null
+++ b/src/SailBoatHard/FormBoat.java
@@ -0,0 +1,175 @@
+package SailBoatHard;
+import javax.swing.*;
+import java.awt.*;
+import java.awt.Graphics;
+import java.awt.event.ActionListener;
+import java.util.*;
+import SailBoatHard.Drawing.*;
+import SailBoatHard.Direction.*;
+import SailBoatHard.MovementStrategy.*;
+
+public class FormBoat {
+ private DrawingBoat _drawingBoat;
+ private AbstractStrategy _abstractStrategy;
+ Canvas canv;
+ public void Draw(){
+ canv.repaint();
+ }
+ public FormBoat(){
+ JFrame frame = new JFrame("SailBoat");
+ JButton buttonCreateBoat = new JButton("Лодка");
+ buttonCreateBoat.setFocusPainted(false);
+ buttonCreateBoat.setContentAreaFilled(false);
+ JButton buttonCreateSailBoat = new JButton("Парусник ");
+ buttonCreateSailBoat.setFocusPainted(false);
+ buttonCreateSailBoat.setContentAreaFilled(false);
+ String[] items = {
+ "ToCenter",
+ "ToBorder"
+ };
+ JComboBox comboBoxStrategy = new JComboBox(items);
+ JButton buttonStep = new JButton("Шаг");
+ buttonStep.setFocusPainted(false);
+ buttonStep.setContentAreaFilled(false);
+ JButton buttonUp = new JButton();
+ buttonUp.setFocusPainted(false);
+ buttonUp.setContentAreaFilled(false);
+ buttonUp.setName("up");
+ buttonUp.setIcon(new ImageIcon(((new ImageIcon("Resources/up.png")).getImage()).getScaledInstance(35, 35, java.awt.Image.SCALE_SMOOTH)));
+ JButton buttonDown = new JButton();
+ buttonDown.setFocusPainted(false);
+ buttonDown.setContentAreaFilled(false);
+ buttonDown.setName("down");
+ buttonDown.setIcon(new ImageIcon(((new ImageIcon("Resources/down.png")).getImage()).getScaledInstance(35, 35, java.awt.Image.SCALE_SMOOTH)));
+ JButton buttonLeft = new JButton();
+ buttonLeft.setFocusPainted(false);
+ buttonLeft.setContentAreaFilled(false);
+ buttonLeft.setName("left");
+ buttonLeft.setIcon(new ImageIcon(((new ImageIcon("Resources/left.png")).getImage()).getScaledInstance(35, 35, java.awt.Image.SCALE_SMOOTH)));
+ JButton buttonRight = new JButton();
+ buttonRight.setFocusPainted(false);
+ buttonRight.setContentAreaFilled(false);
+ buttonRight.setName("right");
+ buttonRight.setIcon(new ImageIcon(((new ImageIcon("Resources/right.png")).getImage()).getScaledInstance(35, 35, java.awt.Image.SCALE_SMOOTH)));
+ buttonCreateBoat.addActionListener(
+ e -> {
+ Random random = new Random();
+ _drawingBoat = new DrawingBoat(random.nextInt(200) + 100,
+ random.nextInt(2000) + 1000,
+ new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)),
+ this.canv.getWidth(), this.canv.getHeight(), random.nextInt(3-1+1)+1);
+ _drawingBoat.SetPosition(random.nextInt(100-30+1)+30, //начальные и конечные значения для рандома
+ random.nextInt(90-20+1)+20 //начальные и конечные значения для рандома
+ ,this.canv.getWidth(), this.canv.getHeight());
+ canv._drawingBoat = _drawingBoat;
+ Draw();
+ }
+ );
+ buttonCreateSailBoat.addActionListener(
+ e -> {
+ Random random = new Random();
+ _drawingBoat = new DrawingSailBoat(random.nextInt(100) + 50,
+ random.nextInt(1000) + 500,
+ new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)),
+ new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)),
+ random.nextBoolean(), random.nextBoolean(),
+ this.canv.getWidth(), this.canv.getHeight(), random.nextInt(3-1+1)+1);
+ _drawingBoat.SetPosition(random.nextInt(100-30+1)+30, //начальные и конечные значения для рандома
+ random.nextInt(90-20+1)+20 //начальные и конечные значения для рандома
+ ,this.canv.getWidth(), this.canv.getHeight());
+ canv._drawingBoat = _drawingBoat;
+ Draw();
+ }
+ );
+ ActionListener actionListener = e -> {
+ if (_drawingBoat == null){
+ return;
+ }
+ switch ((((JButton)(e.getSource())).getName())){
+ case "up":
+ _drawingBoat.MoveTransport(Direction.Up);
+ break;
+ case "down":
+ _drawingBoat.MoveTransport(Direction.Down);
+ break;
+ case "left":
+ _drawingBoat.MoveTransport(Direction.Left);
+ break;
+ case "right":
+ _drawingBoat.MoveTransport(Direction.Right);
+ break;
+ }
+ Draw();
+ };
+ buttonUp.addActionListener(actionListener);
+ buttonDown.addActionListener(actionListener);
+ buttonLeft.addActionListener(actionListener);
+ buttonRight.addActionListener(actionListener);
+ buttonStep.addActionListener(e -> {
+ if (_drawingBoat == null) {
+ return;
+ }
+ if (comboBoxStrategy.isEnabled()) {
+ _abstractStrategy = switch (comboBoxStrategy.getSelectedIndex()) {
+ case 0 -> new MoveToCenter();
+ case 1 -> new MoveToBorder();
+ default -> null;
+ };
+ if (_abstractStrategy == null)
+ {
+ return;
+ }
+ _abstractStrategy.SetData(new DrawingObjectBoat(_drawingBoat), this.canv.getWidth(), this.canv.getHeight());
+ }
+ if (_abstractStrategy == null)
+ {
+ return;
+ }
+ comboBoxStrategy.setEnabled(false);
+ _abstractStrategy.MakeStep();
+ Draw();
+ if (_abstractStrategy.GetStatus() == Status.Finish)
+ {
+ comboBoxStrategy.setEnabled(true);
+ _abstractStrategy = null;
+ }
+ });
+ frame.setSize(910, 500);
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ frame.setLayout(null);
+ canv = new Canvas();
+ canv.setBounds(0, 0, 895, 500 - 40); // 40 - const, высота панели сверху
+ buttonCreateBoat.setBounds(20, 420, 100, 40);
+ buttonCreateSailBoat.setBounds(140, 420, 100, 40);
+ buttonUp.setBounds(800, 380, 40, 40);
+ buttonDown.setBounds(800, 420, 40, 40);
+ buttonLeft.setBounds(760, 420, 40, 40);
+ buttonRight.setBounds(840, 420, 40, 40);
+ comboBoxStrategy.setBounds(800,10,100,50);
+ buttonStep.setBounds(800,80,100,40);
+ frame.add(canv);
+ frame.add(buttonCreateBoat);
+ frame.add(buttonCreateSailBoat);
+ frame.add(buttonUp);
+ frame.add(buttonDown);
+ frame.add(buttonLeft);
+ frame.add(buttonRight);
+ frame.add(comboBoxStrategy);
+ frame.add(buttonStep);
+ frame.setVisible(true);
+ }
+ class Canvas extends JComponent{
+ public DrawingBoat _drawingBoat;
+ public Canvas(){}
+
+ public void paintComponent(Graphics g){
+ if (_drawingBoat == null){
+ return;
+ }
+ super.paintComponents(g);
+ Graphics2D g2d = (Graphics2D)g;
+ _drawingBoat.DrawTransport(g2d);
+ super.repaint();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Main.java b/src/SailBoatHard/Main.java
similarity index 53%
rename from src/Main.java
rename to src/SailBoatHard/Main.java
index 506164d..9e8e1b3 100644
--- a/src/Main.java
+++ b/src/SailBoatHard/Main.java
@@ -1,5 +1,6 @@
+package SailBoatHard;
public class Main {
public static void main(String[] args) {
- new FormBoat();
+ FormBoat fm = new FormBoat();
}
}
\ No newline at end of file
diff --git a/src/SailBoatHard/MovementStrategy/AbstractStrategy.java b/src/SailBoatHard/MovementStrategy/AbstractStrategy.java
new file mode 100644
index 0000000..ccb7e44
--- /dev/null
+++ b/src/SailBoatHard/MovementStrategy/AbstractStrategy.java
@@ -0,0 +1,91 @@
+package SailBoatHard.MovementStrategy;;
+import SailBoatHard.Direction.*;
+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;
+ }
+ 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/SailBoatHard/MovementStrategy/DrawingObjectBoat.java b/src/SailBoatHard/MovementStrategy/DrawingObjectBoat.java
new file mode 100644
index 0000000..4a9b40a
--- /dev/null
+++ b/src/SailBoatHard/MovementStrategy/DrawingObjectBoat.java
@@ -0,0 +1,39 @@
+package SailBoatHard.MovementStrategy;
+import SailBoatHard.Direction.*;
+import SailBoatHard.Drawing.*;
+
+public class DrawingObjectBoat implements IMoveableObject{
+ private DrawingBoat _drawingBoat = null;
+ public DrawingObjectBoat(DrawingBoat drawingBoat)
+ {
+ _drawingBoat = drawingBoat;
+ }
+ @Override
+ public ObjectParameters GetObjectPosition() {
+ if (_drawingBoat == null || _drawingBoat.boat == null) {
+ return null;
+ }
+ return new ObjectParameters(_drawingBoat.GetStartX(), _drawingBoat.GetStartY(),
+ _drawingBoat.GetWidth(), _drawingBoat.GetHeight());
+ }
+
+ @Override
+ public int GetStep() {
+ if (_drawingBoat != null && _drawingBoat.boat!=null)
+ return (int)(_drawingBoat.boat.GetStep());
+ return 0;
+ }
+
+ @Override
+ public boolean CheckCanMove(Direction direction) {
+ if (_drawingBoat != null)
+ return _drawingBoat.CanMove(direction);
+ return false;
+ }
+
+ @Override
+ public void MoveObject(Direction direction) {
+ if (_drawingBoat != null)
+ _drawingBoat.MoveTransport(direction);
+ }
+}
diff --git a/src/SailBoatHard/MovementStrategy/IMoveableObject.java b/src/SailBoatHard/MovementStrategy/IMoveableObject.java
new file mode 100644
index 0000000..7778147
--- /dev/null
+++ b/src/SailBoatHard/MovementStrategy/IMoveableObject.java
@@ -0,0 +1,12 @@
+package SailBoatHard.MovementStrategy;
+import SailBoatHard.Direction.*;
+
+public interface IMoveableObject{
+ ObjectParameters GetObjectPosition();
+
+ int GetStep();
+
+ boolean CheckCanMove(Direction direction);
+
+ void MoveObject(Direction direction);
+}
diff --git a/src/SailBoatHard/MovementStrategy/MoveToBorder.java b/src/SailBoatHard/MovementStrategy/MoveToBorder.java
new file mode 100644
index 0000000..62b242b
--- /dev/null
+++ b/src/SailBoatHard/MovementStrategy/MoveToBorder.java
@@ -0,0 +1,34 @@
+package SailBoatHard.MovementStrategy;
+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/SailBoatHard/MovementStrategy/MoveToCenter.java b/src/SailBoatHard/MovementStrategy/MoveToCenter.java
new file mode 100644
index 0000000..2d5d7bc
--- /dev/null
+++ b/src/SailBoatHard/MovementStrategy/MoveToCenter.java
@@ -0,0 +1,38 @@
+package SailBoatHard.MovementStrategy;
+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/SailBoatHard/MovementStrategy/ObjectParameters.java b/src/SailBoatHard/MovementStrategy/ObjectParameters.java
new file mode 100644
index 0000000..61d57b3
--- /dev/null
+++ b/src/SailBoatHard/MovementStrategy/ObjectParameters.java
@@ -0,0 +1,33 @@
+package SailBoatHard.MovementStrategy;
+public class ObjectParameters {
+ private final int _x;
+
+ private final int _y;
+
+ private final int _width;
+
+ private final int _height;
+
+ 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/src/SailBoatHard/MovementStrategy/Status.java b/src/SailBoatHard/MovementStrategy/Status.java
new file mode 100644
index 0000000..bdc2284
--- /dev/null
+++ b/src/SailBoatHard/MovementStrategy/Status.java
@@ -0,0 +1,6 @@
+package SailBoatHard.MovementStrategy;
+public enum Status {
+ NotInit,
+ InProgress,
+ Finish
+}