diff --git a/src/DrawingLiner.java b/src/DrawingLiner.java
deleted file mode 100644
index 1330ada..0000000
--- a/src/DrawingLiner.java
+++ /dev/null
@@ -1,98 +0,0 @@
-import java.awt.*;
-import java.awt.geom.Ellipse2D;
-import java.util.*;
-
-public class DrawingLiner {
- private EntityLiner EntityLiner; //Класс-сущность
- public EntityLiner GetLiner(){return EntityLiner;}
- public int _startPosX; //Координаты отрисовки по оси x
- public int _startPosY; //Координаты отрисовки по оси y
- private Integer _pictureWidth = null; //Ширина окна
- private Integer _pictureHeight = null; //Высота окна
- private final int _linerWidth = 120; //Ширина отрисовки лайнера
- private int _linerHeight = 60; //Высота отрисовки лайнера
- private DrawingDeck drawingDeck = new DrawingDeck();
-
- //Инициализация
- public void Init(int speed, float weight, Color bottomColor, boolean swimmingPool, boolean deck)
- {
- EntityLiner = new EntityLiner();
- EntityLiner.Init(speed,weight,bottomColor, swimmingPool, deck);
- Random random = new Random();
- int rd = random.nextInt(0, 3);
- _linerHeight += rd*20;
- drawingDeck.SetAddEnum(rd);
- }
-
- //Начальные коордитанты
- public void SetPosition(int x, int y, int width, int height)
- {
- if (width < _linerWidth || height < _linerHeight) return;
- Random random = new Random();
- _startPosX = x < 0 || x + _linerWidth > width ? random.nextInt(0, width - _linerWidth) : x;
- _startPosY = y < 0 || y + _linerHeight > height ? random.nextInt(0, height - _linerHeight) : y;
- _pictureWidth = width;
- _pictureHeight = height;
- }
-
- //Движение транспорта по координатам
- public void MoveTransport(Direction direction)
- {
- if (GetLiner() == null) {
- return;
- }
- switch (direction.GetDirect()) {
- case 1:
- if (_startPosY - EntityLiner.GetStep() > 0) {
- _startPosY -= EntityLiner.GetStep();
- }
- break;
- case 2:
- if (_startPosY + _linerHeight + EntityLiner.GetStep() < _pictureHeight) {
- _startPosY += EntityLiner.GetStep();
- }
- break;
- case 3:
- if (_startPosX - EntityLiner.GetStep() > 0) {
- _startPosX -= EntityLiner.GetStep();
- }
- break;
- case 4:
- if (_startPosX + _linerWidth + EntityLiner.GetStep() < _pictureWidth) {
- _startPosX += EntityLiner.GetStep();
- }
- break;
- }
- }
-
- //Отрисовка транспорта
- public void DrawLiner(Graphics g) {
- if (GetLiner() == null) {
- return;
- }
- if (_startPosX < 0 || _startPosY < 0) {
- return;
- }
- int yDiff = drawingDeck.DrawDeck(Color.YELLOW, g, _startPosX, _startPosY)+20;//+1 основная палуба, желтая по умолчанию для обычног ообьекта
- Graphics2D g2d = (Graphics2D) g;
- g2d.setPaint(EntityLiner.GetBottomColor());
- //корпус
- int[] xBottom = {_startPosX, _startPosX + 100, _startPosX + 80, _startPosX + 20};
- int[] yBottom = {_startPosY + yDiff, _startPosY + yDiff, _startPosY + 40 + yDiff, _startPosY + 40 + yDiff};
- g2d.fillPolygon(xBottom, yBottom, 4);
- g2d.setPaint(Color.BLACK);
- g2d.drawPolygon(xBottom, yBottom, 4);
- }
- public boolean CanMove(Direction direction) {
- if (EntityLiner == null) {
- return false;
- }
-
- return switch (direction) {
- case Left -> _startPosX - EntityLiner.GetStep() > 0;
- case Up -> _startPosY - EntityLiner.GetStep() > 0;
- case Right -> _startPosX + _linerWidth + EntityLiner.GetStep() < _pictureWidth;
- case Down -> _startPosY + _linerHeight + EntityLiner.GetStep() < _pictureHeight;
- };
- }
-}
\ No newline at end of file
diff --git a/src/EntityLiner.java b/src/EntityLiner.java
deleted file mode 100644
index f62e562..0000000
--- a/src/EntityLiner.java
+++ /dev/null
@@ -1,31 +0,0 @@
-import java.awt.*;
-import java.util.*;
-
-public class EntityLiner {
- private int Speed; //Скорость
- private float Weight; //Вес
- private Color BottomColor; //Цвет
- private float Step; //Шаг при перемещении
- private boolean Deck; //Наличие доп палубы
- private boolean SwimmingPool; //Наличие бассейна
-
- //Инициализация
- public void Init(int speed, float weight, Color bodyColor, boolean swimmingPool, boolean deck)
- {
- Random random = new Random();
- Speed = speed <= 0 ? random.nextInt(50, 150) : speed;
- Weight = weight <= 0 ? random.nextInt(50, 150) : weight;
- BottomColor = bodyColor;
- SwimmingPool = swimmingPool;
- Deck = deck;
- Step = Speed * 100 / Weight;
- }
- public boolean GetDeck() {return Deck;}
- public boolean GetSwimmingPool() {return SwimmingPool;}
- public Color GetBottomColor(){
- return BottomColor;
- }
- public float GetStep(){
- return Step;
- }
-}
diff --git a/src/FormLiner.java b/src/FormLiner.java
deleted file mode 100644
index 709710a..0000000
--- a/src/FormLiner.java
+++ /dev/null
@@ -1,110 +0,0 @@
-import javax.swing.*;
-import java.awt.*;
-import java.awt.Graphics;
-import java.awt.event.ActionListener;
-import java.util.*;
-
-public class FormLiner{
- private DrawingLiner _drawingLiner;
- Canvas canv;
- public void Draw(){
- canv.repaint();
- }
- public FormLiner(){
- JFrame frame = new JFrame("Liner");
- JButton buttonCreate = new JButton("Создать");
- buttonCreate.setFocusPainted(false);
- buttonCreate.setContentAreaFilled(false);
- JButton buttonUp = new JButton();
- buttonUp.setFocusPainted(false);
- buttonUp.setContentAreaFilled(false);
- buttonUp.setName("up");
- buttonUp.setIcon(new ImageIcon(((new ImageIcon("src/Images/arrowUp.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("src/Images/arrowDown.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("src/Images/arrowLeft.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("src/Images/arrowRight.png")).getImage()).getScaledInstance(35, 35, java.awt.Image.SCALE_SMOOTH)));
- buttonCreate.addActionListener(
- e -> {
- Random random = new Random();
- _drawingLiner = new DrawingLiner();
- _drawingLiner.Init(
- random.nextInt(200) + 100,
- random.nextInt(2000) + 1000,
- new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)),
- random.nextBoolean(), random.nextBoolean());
- _drawingLiner.SetPosition(random.nextInt(100-30+1)+30, //начальные и конечные значения для рандома
- random.nextInt(90-20+1)+20 //начальные и конечные значения для рандома
- ,this.canv.getWidth(), this.canv.getHeight());
- canv._drawingLiner = _drawingLiner;
- Draw();
- }
- );
- ActionListener actionListener = e -> {
- if (_drawingLiner == null){
- return;
- }
- switch ((((JButton)(e.getSource())).getName())){
- case "up":
- _drawingLiner.MoveTransport(Direction.Up);
- break;
- case "down":
- _drawingLiner.MoveTransport(Direction.Down);
- break;
- case "left":
- _drawingLiner.MoveTransport(Direction.Left);
- break;
- case "right":
- _drawingLiner.MoveTransport(Direction.Right);
- break;
- }
- Draw();
- };
- buttonUp.addActionListener(actionListener);
- buttonDown.addActionListener(actionListener);
- buttonLeft.addActionListener(actionListener);
- buttonRight.addActionListener(actionListener);
- 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, высота панели сверху
- buttonCreate.setBounds(20, 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);
- frame.add(canv);
- frame.add(buttonCreate);
- frame.add(buttonUp);
- frame.add(buttonDown);
- frame.add(buttonLeft);
- frame.add(buttonRight);
- frame.setVisible(true);
- }
- class Canvas extends JComponent{
- public DrawingLiner _drawingLiner;
- public Canvas(){}
-
- public void paintComponent(Graphics g){
- if (_drawingLiner == null){
- return;
- }
- super.paintComponents(g);
- Graphics2D g2d = (Graphics2D)g;
- _drawingLiner.DrawLiner(g2d);
- super.repaint();
- }
- }
-}
\ No newline at end of file
diff --git a/src/Direction.java b/src/LinerHard/Direction.java
similarity index 91%
rename from src/Direction.java
rename to src/LinerHard/Direction.java
index ac5e0ba..6d37533 100644
--- a/src/Direction.java
+++ b/src/LinerHard/Direction.java
@@ -1,3 +1,5 @@
+package LinerHard;
+
public enum Direction {
Up(1),
Down(2),
@@ -11,4 +13,4 @@ public enum Direction {
public int GetDirect() {
return Direct;
}
-}
+}
\ No newline at end of file
diff --git a/src/LinerHard/DrawingObjects/DrawingBigLiner.java b/src/LinerHard/DrawingObjects/DrawingBigLiner.java
new file mode 100644
index 0000000..7e4db59
--- /dev/null
+++ b/src/LinerHard/DrawingObjects/DrawingBigLiner.java
@@ -0,0 +1,47 @@
+package LinerHard.DrawingObjects;
+
+import LinerHard.ExtraThings.AdditionalEnum;
+import LinerHard.Entities.*;
+import LinerHard.ExtraThings.*;
+
+import java.awt.*;
+import java.util.Random;
+public class DrawingBigLiner extends DrawingLiner {
+ public DrawingBigLiner(int speed, float weight, Color bottomColor, int width, int height,Color bodyColor, boolean swimmingPool, boolean deck,int deckNum) {
+ super(speed,weight,bottomColor,width,height,deckNum);
+ if (width < _linerWidth || height < _linerHeight) {
+ return;
+ }
+ if(EntityLiner != null) {
+ EntityLiner = new EntityBigLiner(speed, weight, bottomColor, bodyColor, swimmingPool, deck);
+ }
+ }
+ @Override
+ public void DrawLiner(Graphics g) {
+ if (GetLiner() == null || !(GetLiner() instanceof EntityBigLiner)) {
+ return;
+ }
+ if (_startPosX < 0 || _startPosY < 0) {
+ return;
+ }
+ EntityBigLiner liner = (EntityBigLiner)EntityLiner;
+ int yDiff = Deck.DrawDeck(liner.GetBodyColor(), g, _startPosX, _startPosY) + 20;//+1 основная палуба
+ Graphics2D g2d = (Graphics2D) g;
+ g2d.setPaint(liner.GetBottomColor());
+ //корпус
+ int[] xBottom = {_startPosX,_startPosX + 100, _startPosX + 80, _startPosX + 20};
+ int[] yBottom = {_startPosY + yDiff,_startPosY + yDiff,_startPosY + 40 + yDiff, _startPosY + 40 + yDiff};
+ //бассейн
+ int[] xPool = {_startPosX + 10, _startPosX + 30, _startPosX + 30, _startPosX + 10};
+ int[] yPool = {_startPosY + yDiff,_startPosY + yDiff,_startPosY + 10 + yDiff,_startPosY + 10 + yDiff};
+ g2d.fillPolygon(xBottom,yBottom,4);
+ g2d.setPaint(Color.BLACK);
+ g2d.drawPolygon(xBottom,yBottom,4);
+ if(liner.GetSwimmingPool()) {
+ g2d.setPaint(Color.BLUE);
+ g2d.fillPolygon(xPool, yPool, 4);
+ g2d.setPaint(Color.BLACK);
+ g2d.drawPolygon(xPool, yPool, 4);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/LinerHard/DrawingObjects/DrawingLiner.java b/src/LinerHard/DrawingObjects/DrawingLiner.java
new file mode 100644
index 0000000..5bb8017
--- /dev/null
+++ b/src/LinerHard/DrawingObjects/DrawingLiner.java
@@ -0,0 +1,106 @@
+package LinerHard.DrawingObjects;
+import LinerHard.ExtraThings.*;
+import LinerHard.Direction;
+import LinerHard.Entities.EntityLiner;
+import java.awt.*;
+import java.util.Random;
+
+public class DrawingLiner{
+ public EntityLiner EntityLiner;
+ public IDrawingDeck Deck;
+ public EntityLiner GetLiner() {
+ return EntityLiner;
+ }
+ protected int _startPosX;
+ protected int _startPosY;
+ protected Integer _pictureWidth = null;
+ protected Integer _pictureHeight = null;
+ protected final int _linerWidth = 100;
+ protected int _linerHeight = 60;
+ public int GetWidth(){return _linerWidth;}
+ public int GetHeight(){return _linerHeight;}
+ public int GetPosX(){return _startPosX;}
+ public int GetPosY(){return _startPosY;}
+ public DrawingLiner(int speed, float weight, Color bottomColor,int width,int height,int deckNumber) {
+ if (width < _linerWidth || height < _linerHeight) {
+ return;
+ }
+ EntityLiner = new EntityLiner(speed,weight,bottomColor);
+ _pictureWidth = width;
+ _pictureHeight = height;
+ Random rand = new Random();
+ Deck = switch (rand.nextInt(0, 3)) {
+ case 0 -> new DrawingDeck();
+ case 1 -> new DrawingOvalDeck();
+ case 2 -> new DrawingTriangleDeck();
+ default -> new DrawingDeck();
+ };
+ Deck.SetAddEnum(deckNumber);
+ }
+ public void SetPosition(int x, int y) {
+ if(x < 0 || y < 0 || x > _pictureWidth - _linerWidth || y > _pictureHeight - _linerHeight){
+ _startPosX = 0;
+ _startPosY = 0;
+ return;
+ }
+ _startPosX = x;
+ _startPosY = y;
+ }
+
+ public void MoveTransport(Direction direction) {
+ if (GetLiner() == null) {
+ return;
+ }
+ switch (direction.GetDirect()) {
+ case 1:
+ if (_startPosY - EntityLiner.GetStep() > 0) {
+ _startPosY -= EntityLiner.GetStep();
+ }
+ break;
+ case 2:
+ if (_startPosY + _linerHeight + EntityLiner.GetStep() < _pictureHeight) {
+ _startPosY += EntityLiner.GetStep();
+ }
+ break;
+ case 3:
+ if (_startPosX - EntityLiner.GetStep() > 0) {
+ _startPosX -= EntityLiner.GetStep();
+ }
+ break;
+ case 4:
+ if (_startPosX + _linerWidth + EntityLiner.GetStep() < _pictureWidth) {
+ _startPosX += EntityLiner.GetStep();
+ }
+ break;
+ }
+ }
+ public void DrawLiner(Graphics g) {
+ if (GetLiner() == null) {
+ return;
+ }
+ if (_startPosX < 0 || _startPosY < 0) {
+ return;
+ }
+ int yDiff = Deck.DrawDeck(Color.YELLOW, g, _startPosX, _startPosY)+20;//+1 основная палуба, желтая по умолчанию для обычног ообьекта
+ Graphics2D g2d = (Graphics2D) g;
+ g2d.setPaint(EntityLiner.GetBottomColor());
+ //корпус
+ int[] xBottom = {_startPosX, _startPosX + 100, _startPosX + 80, _startPosX + 20};
+ int[] yBottom = {_startPosY + yDiff, _startPosY + yDiff, _startPosY + 40 + yDiff, _startPosY + 40 + yDiff};
+ g2d.fillPolygon(xBottom, yBottom, 4);
+ g2d.setPaint(Color.BLACK);
+ g2d.drawPolygon(xBottom, yBottom, 4);
+ }
+ public boolean CanMove(Direction direction) {
+ if (EntityLiner == null) {
+ return false;
+ }
+
+ return switch (direction) {
+ case Left -> _startPosX - EntityLiner.GetStep() > 0;
+ case Up -> _startPosY - EntityLiner.GetStep() > 0;
+ case Right -> _startPosX + _linerWidth + EntityLiner.GetStep() < _pictureWidth;
+ case Down -> _startPosY + _linerHeight + EntityLiner.GetStep() < _pictureHeight;
+ };
+ }
+}
diff --git a/src/LinerHard/Entities/EntityBigLiner.java b/src/LinerHard/Entities/EntityBigLiner.java
new file mode 100644
index 0000000..baa8ecd
--- /dev/null
+++ b/src/LinerHard/Entities/EntityBigLiner.java
@@ -0,0 +1,33 @@
+package LinerHard.Entities;
+
+import java.awt.*;
+
+public class EntityBigLiner extends EntityLiner
+{
+ public Color BodyColor;
+ public Color GetBodyColor(){
+ return BodyColor;
+ }
+ ///
+ /// Признак (опция) наличия бассейна
+ ///
+ public boolean SwimmingPool;
+ public boolean GetSwimmingPool(){
+ return SwimmingPool;
+ }
+ ///
+ /// Признак (опция) наличия доп палубы
+ ///
+ public boolean Deck;
+ public boolean GetDeck(){
+ return Deck;
+ }
+ public EntityBigLiner(int speed, float weight, Color bodyColor, Color bottomColor, boolean swimmingPool, boolean deck)
+ {
+ super(speed,weight,bottomColor);
+ BodyColor = bodyColor;
+ SwimmingPool = swimmingPool;
+ Deck = deck;
+ }
+}
+
diff --git a/src/LinerHard/Entities/EntityLiner.java b/src/LinerHard/Entities/EntityLiner.java
new file mode 100644
index 0000000..07add90
--- /dev/null
+++ b/src/LinerHard/Entities/EntityLiner.java
@@ -0,0 +1,46 @@
+package LinerHard.Entities;
+
+import java.awt.*;
+public class EntityLiner
+{
+ ///
+ /// Скорость
+ ///
+ private int Speed;
+ public int GetSpeed(){
+ return Speed;
+ }
+ ///
+ /// Вес
+ ///
+ private float Weight;
+ public float GetWeight(){
+ return Weight;
+ }
+ ///
+ /// Основной цвет
+ ///
+ private Color BottomColor;
+ public Color GetBottomColor(){
+ return BottomColor;
+ }
+ ///
+ /// Шаг
+ ///
+ public float GetStep(){
+ return (float)Speed*100 / Weight;
+ }
+ ///
+ /// Инициализация полей объекта-класса лайнера
+ ///
+ /// Скорость
+ /// Вес лайнера
+ /// Основной цвет
+ public EntityLiner(int speed, float weight, Color bottomColor)
+ {
+ Speed = speed;
+ Weight = weight;
+ BottomColor = bottomColor;
+ }
+}
+
diff --git a/src/AdditionalEnum.java b/src/LinerHard/ExtraThings/AdditionalEnum.java
similarity index 87%
rename from src/AdditionalEnum.java
rename to src/LinerHard/ExtraThings/AdditionalEnum.java
index 9f037d8..6d4ad02 100644
--- a/src/AdditionalEnum.java
+++ b/src/LinerHard/ExtraThings/AdditionalEnum.java
@@ -1,3 +1,5 @@
+package LinerHard.ExtraThings;
+
public enum AdditionalEnum {
One(1),
Two(2),
diff --git a/src/DrawingDeck.java b/src/LinerHard/ExtraThings/DrawingDeck.java
similarity index 92%
rename from src/DrawingDeck.java
rename to src/LinerHard/ExtraThings/DrawingDeck.java
index 7a4ea09..2be3c6f 100644
--- a/src/DrawingDeck.java
+++ b/src/LinerHard/ExtraThings/DrawingDeck.java
@@ -1,6 +1,9 @@
+package LinerHard.ExtraThings;
+
import java.awt.*;
-public class DrawingDeck {
+public class DrawingDeck implements IDrawingDeck{
private AdditionalEnum deckNumber;
+ @Override
public void SetAddEnum(int num){
switch (num){
case 1:
@@ -13,9 +16,11 @@ public class DrawingDeck {
deckNumber = AdditionalEnum.Three;
}
};
+ @Override
public AdditionalEnum GetDeckNumber() {
return deckNumber;
}
+ @Override
public int DrawDeck(Color colorDeck, Graphics g, int _startPosX, int _startPosY) {
Graphics2D g2d = (Graphics2D) g;
//Переделана логика вариативной отрисовки для снижения повторяющегося кода
@@ -38,4 +43,4 @@ public class DrawingDeck {
DrawNumDeck(g2d,numOfDecks-1,_startPosX,_startPosY,colorDeck);
}
}
-}
\ No newline at end of file
+}
diff --git a/src/LinerHard/ExtraThings/DrawingOvalDeck.java b/src/LinerHard/ExtraThings/DrawingOvalDeck.java
new file mode 100644
index 0000000..ae37063
--- /dev/null
+++ b/src/LinerHard/ExtraThings/DrawingOvalDeck.java
@@ -0,0 +1,44 @@
+package LinerHard.ExtraThings;
+
+import java.awt.*;
+public class DrawingOvalDeck implements IDrawingDeck{
+ private AdditionalEnum deckNumber;
+ @Override
+ public void SetAddEnum(int num){
+ switch (num){
+ case 1:
+ deckNumber = AdditionalEnum.One;
+ break;
+ case 2:
+ deckNumber = AdditionalEnum.Two;
+ break;
+ default:
+ deckNumber = AdditionalEnum.Three;
+ }
+ };
+ @Override
+ public AdditionalEnum GetDeckNumber() {
+ return deckNumber;
+ }
+ @Override
+ public int DrawDeck(Color colorDeck, Graphics g, int _startPosX, int _startPosY) {
+ Graphics2D g2d = (Graphics2D) g;
+ //Переделана логика вариативной отрисовки для снижения повторяющегося кода
+ int k = deckNumber.GetAddEnum();
+ if(k > 0){
+ DrawNumDeck(g2d,k-1,_startPosX,_startPosY,colorDeck);
+ return (k-1)*20; //20-высота одной палубы
+ }
+ return 0;
+ }
+ public void DrawNumDeck(Graphics2D g2d, int numOfDecks,int _startPosX,int _startPosY,Color colorDeck){
+ int yDiff = numOfDecks * 20;
+ g2d.setPaint(colorDeck);
+ g2d.fillOval(_startPosX+10,_startPosY+yDiff,90,20);
+ g2d.setPaint(Color.BLACK);
+ g2d.drawOval(_startPosX+10,_startPosY+yDiff,90,20);
+ if(numOfDecks > 0){
+ DrawNumDeck(g2d,numOfDecks-1,_startPosX,_startPosY,colorDeck);
+ }
+ }
+}
diff --git a/src/LinerHard/ExtraThings/DrawingTriangleDeck.java b/src/LinerHard/ExtraThings/DrawingTriangleDeck.java
new file mode 100644
index 0000000..7637184
--- /dev/null
+++ b/src/LinerHard/ExtraThings/DrawingTriangleDeck.java
@@ -0,0 +1,46 @@
+package LinerHard.ExtraThings;
+
+import java.awt.*;
+public class DrawingTriangleDeck implements IDrawingDeck{
+ private AdditionalEnum deckNumber;
+ @Override
+ public void SetAddEnum(int num){
+ switch (num){
+ case 1:
+ deckNumber = AdditionalEnum.One;
+ break;
+ case 2:
+ deckNumber = AdditionalEnum.Two;
+ break;
+ default:
+ deckNumber = AdditionalEnum.Three;
+ }
+ };
+ @Override
+ public AdditionalEnum GetDeckNumber() {
+ return deckNumber;
+ }
+ @Override
+ public int DrawDeck(Color colorDeck, Graphics g, int _startPosX, int _startPosY) {
+ Graphics2D g2d = (Graphics2D) g;
+ //Переделана логика вариативной отрисовки для снижения повторяющегося кода
+ int k = deckNumber.GetAddEnum();
+ if(k > 0){
+ DrawNumDeck(g2d,k-1,_startPosX,_startPosY,colorDeck);
+ return (k-1)*20; //20-высота одной палубы
+ }
+ return 0;
+ }
+ public void DrawNumDeck(Graphics2D g2d, int numOfDecks,int _startPosX,int _startPosY,Color colorDeck){
+ int yDiff = numOfDecks * 20;
+ int[] xDeck = {_startPosX+30,_startPosX+60,_startPosX + 30 + 60};
+ int[] yDeck = {_startPosY + 20 + yDiff,_startPosY+ yDiff,_startPosY + 20 + yDiff};
+ g2d.setPaint(colorDeck);
+ g2d.fillPolygon(xDeck,yDeck,3);
+ g2d.setPaint(Color.BLACK);
+ g2d.drawPolygon(xDeck,yDeck,3);
+ if(numOfDecks > 0){
+ DrawNumDeck(g2d,numOfDecks-1,_startPosX,_startPosY,colorDeck);
+ }
+ }
+}
diff --git a/src/LinerHard/ExtraThings/IDrawingDeck.java b/src/LinerHard/ExtraThings/IDrawingDeck.java
new file mode 100644
index 0000000..17f42e5
--- /dev/null
+++ b/src/LinerHard/ExtraThings/IDrawingDeck.java
@@ -0,0 +1,7 @@
+package LinerHard.ExtraThings;
+import java.awt.*;
+public interface IDrawingDeck {
+ void SetAddEnum(int num);
+ AdditionalEnum GetDeckNumber();
+ int DrawDeck(Color color, Graphics g,int startPosX, int startPosY);
+}
diff --git a/src/LinerHard/FormLiner.java b/src/LinerHard/FormLiner.java
new file mode 100644
index 0000000..0fc5033
--- /dev/null
+++ b/src/LinerHard/FormLiner.java
@@ -0,0 +1,171 @@
+package LinerHard;
+import javax.swing.*;
+import java.awt.*;
+import java.awt.Graphics;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.*;
+import LinerHard.DrawingObjects.*;
+import LinerHard.Entities.*;
+import LinerHard.MovementStrategies.*;
+
+public class FormLiner{
+ private DrawingLiner _drawingLiner;
+ private AbstractStrategy _abstractStrategy;
+ Canvas canv;
+ public void Draw(){
+ canv.repaint();
+ }
+ public FormLiner(){
+ JFrame frame = new JFrame("LinerHard");
+ JButton buttonCreateLiner = new JButton("Создать Лайнер");
+ buttonCreateLiner.setFocusPainted(false);
+ buttonCreateLiner.setContentAreaFilled(false);
+ JButton buttonCreateBigLiner = new JButton("Создать Большой Лайнер");
+ buttonCreateBigLiner.setFocusPainted(false);
+ buttonCreateBigLiner.setContentAreaFilled(false);
+ String[] items = {
+ "Form center",
+ "Form border"
+ };
+ 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("src/Images/arrowUp.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("src/Images/arrowDown.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("src/Images/arrowLeft.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("src/Images/arrowRight.png")).getImage()).getScaledInstance(35, 35, java.awt.Image.SCALE_SMOOTH)));
+ buttonCreateLiner.addActionListener(
+ e -> {
+ Random random = new Random();
+ _drawingLiner = new DrawingLiner(random.nextInt(20) + 10,//для удобства скорость больше
+ random.nextInt(200)+50,
+ new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)),
+ this.canv.getWidth(), this.canv.getHeight(), 1);// 1 палуба у обычного лайнера
+ _drawingLiner.SetPosition(random.nextInt(100), random.nextInt(90));
+ canv._drawingLiner = _drawingLiner;
+ Draw();
+ }
+ );
+ buttonCreateBigLiner.addActionListener(
+ e -> {
+ Random random = new Random();
+ _drawingLiner= new DrawingBigLiner(random.nextInt(20) + 10,//для удобства скорость больше
+ random.nextInt(200)+50,
+ new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)),
+ this.canv.getWidth(), this.canv.getHeight(),
+ new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)),
+ random.nextBoolean(),random.nextBoolean(), random.nextInt(0,3));
+ _drawingLiner.SetPosition(random.nextInt(100), random.nextInt(90));
+ canv._drawingLiner = _drawingLiner;
+ Draw();
+ }
+ );
+ ActionListener actionListener = e -> {
+ if (_drawingLiner == null){
+ return;
+ }
+ switch ((((JButton)(e.getSource())).getName())){
+ case "up":
+ _drawingLiner.MoveTransport(Direction.Up);
+ break;
+ case "down":
+ _drawingLiner.MoveTransport(Direction.Down);
+ break;
+ case "left":
+ _drawingLiner.MoveTransport(Direction.Left);
+ break;
+ case "right":
+ _drawingLiner.MoveTransport(Direction.Right);
+ break;
+ }
+ Draw();
+ };
+ buttonUp.addActionListener(actionListener);
+ buttonDown.addActionListener(actionListener);
+ buttonLeft.addActionListener(actionListener);
+ buttonRight.addActionListener(actionListener);
+ buttonStep.addActionListener(e -> {
+ if (_drawingLiner == 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 DrawingObjectLiner(_drawingLiner), 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);
+ buttonCreateLiner.setBounds(20, 420, 100, 40);
+ buttonCreateBigLiner.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);
+ canv = new Canvas();
+ canv.setBounds(0, 0, frame.getWidth()-15,frame.getHeight()-38);//отнимаем высоту доп частей фрейма (число выведенно опытным путем)
+ frame.add(canv);
+ frame.add(buttonCreateLiner);
+ frame.add(buttonCreateBigLiner);
+ 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 DrawingLiner _drawingLiner;
+ public Canvas(){}
+ public void paintComponent(Graphics g){
+ if (_drawingLiner == null){
+ return;
+ }
+ super.paintComponents(g);
+ Graphics2D g2d = (Graphics2D)g;
+ _drawingLiner.DrawLiner(g2d);
+ super.repaint();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Main.java b/src/LinerHard/Main.java
similarity index 84%
rename from src/Main.java
rename to src/LinerHard/Main.java
index 78b3151..f6a7260 100644
--- a/src/Main.java
+++ b/src/LinerHard/Main.java
@@ -1,5 +1,6 @@
+package LinerHard;
public class Main {
public static void main(String[] args) {
FormLiner fm = new FormLiner();
}
-}
\ No newline at end of file
+}
diff --git a/src/LinerHard/MovementStrategies/AbstractStrategy.java b/src/LinerHard/MovementStrategies/AbstractStrategy.java
new file mode 100644
index 0000000..e0677f3
--- /dev/null
+++ b/src/LinerHard/MovementStrategies/AbstractStrategy.java
@@ -0,0 +1,80 @@
+package LinerHard.MovementStrategies;
+
+import LinerHard.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/LinerHard/MovementStrategies/DrawingObjectLiner.java b/src/LinerHard/MovementStrategies/DrawingObjectLiner.java
new file mode 100644
index 0000000..9f927bf
--- /dev/null
+++ b/src/LinerHard/MovementStrategies/DrawingObjectLiner.java
@@ -0,0 +1,37 @@
+package LinerHard.MovementStrategies;
+
+import LinerHard.Direction;
+import LinerHard.DrawingObjects.*;
+
+public class DrawingObjectLiner implements IMoveableObject{
+ private DrawingLiner _drawingLiner = null;
+ public DrawingObjectLiner (DrawingLiner drawingLiner)
+ {
+ _drawingLiner = drawingLiner;
+ }
+ @Override
+ public ObjectParameters GetObjectPosition() {
+ if (_drawingLiner == null || _drawingLiner.EntityLiner == null) {
+ return null;
+ }
+ return new ObjectParameters(_drawingLiner.GetPosX(), _drawingLiner.GetPosY(),
+ _drawingLiner.GetWidth(), _drawingLiner.GetHeight());
+ }
+ @Override
+ public int GetStep() {
+ if (_drawingLiner != null && _drawingLiner.EntityLiner!=null)
+ return (int)(_drawingLiner.EntityLiner.GetStep());
+ return 0;
+ }
+ @Override
+ public boolean CheckCanMove(Direction direction) {
+ if (_drawingLiner != null)
+ return _drawingLiner.CanMove(direction);
+ return false;
+ }
+ @Override
+ public void MoveObject(Direction direction) {
+ if (_drawingLiner != null)
+ _drawingLiner.MoveTransport(direction);
+ }
+}
diff --git a/src/LinerHard/MovementStrategies/IMoveableObject.java b/src/LinerHard/MovementStrategies/IMoveableObject.java
new file mode 100644
index 0000000..6ad03cf
--- /dev/null
+++ b/src/LinerHard/MovementStrategies/IMoveableObject.java
@@ -0,0 +1,11 @@
+package LinerHard.MovementStrategies;
+import LinerHard.Direction;
+public interface IMoveableObject{
+ ObjectParameters GetObjectPosition();
+
+ int GetStep();
+
+ boolean CheckCanMove(Direction direction);
+
+ void MoveObject(Direction direction);
+}
diff --git a/src/LinerHard/MovementStrategies/MoveToBorder.java b/src/LinerHard/MovementStrategies/MoveToBorder.java
new file mode 100644
index 0000000..315483f
--- /dev/null
+++ b/src/LinerHard/MovementStrategies/MoveToBorder.java
@@ -0,0 +1,34 @@
+package LinerHard.MovementStrategies;
+
+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/LinerHard/MovementStrategies/MoveToCenter.java b/src/LinerHard/MovementStrategies/MoveToCenter.java
new file mode 100644
index 0000000..a05860a
--- /dev/null
+++ b/src/LinerHard/MovementStrategies/MoveToCenter.java
@@ -0,0 +1,38 @@
+package LinerHard.MovementStrategies;
+
+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();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/LinerHard/MovementStrategies/ObjectParameters.java b/src/LinerHard/MovementStrategies/ObjectParameters.java
new file mode 100644
index 0000000..bb98492
--- /dev/null
+++ b/src/LinerHard/MovementStrategies/ObjectParameters.java
@@ -0,0 +1,42 @@
+package LinerHard.MovementStrategies;
+
+public class ObjectParameters {
+ private final int _x;
+
+ private final int _y;
+
+ private final int _width;
+
+ private final int _height;
+
+ public int LeftBorder() {
+ return _x;
+ }
+
+ public int TopBorder() {
+ return _y;
+ }
+
+ public int RightBorder() {
+ return _x + _width;
+ }
+
+ public int DownBorder() {
+ return _y + _height;
+ }
+
+ public int ObjectMiddleHorizontal() {
+ return _x + _width / 2;
+ }
+
+ public int ObjectMiddleVertical() {
+ return _y + _height / 2;
+ }
+
+ public ObjectParameters(int x, int y, int width, int height) {
+ _x = x;
+ _y = y;
+ _width = width;
+ _height = height;
+ }
+}
diff --git a/src/LinerHard/MovementStrategies/Status.java b/src/LinerHard/MovementStrategies/Status.java
new file mode 100644
index 0000000..b9b8935
--- /dev/null
+++ b/src/LinerHard/MovementStrategies/Status.java
@@ -0,0 +1,7 @@
+package LinerHard.MovementStrategies;
+
+public enum Status {
+ NotInit,
+ InProgress,
+ Finish
+}