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