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 +}