diff --git a/src/AdditionalEnum.java b/src/AdditionalEnum.java new file mode 100644 index 0000000..9f037d8 --- /dev/null +++ b/src/AdditionalEnum.java @@ -0,0 +1,13 @@ +public enum AdditionalEnum { + One(1), + Two(2), + Three(3), + ; + private final int addEnum; + AdditionalEnum(int i) { + this.addEnum=i; + } + public int GetAddEnum() { + return addEnum; + } +} \ No newline at end of file diff --git a/src/Direction.java b/src/Direction.java new file mode 100644 index 0000000..ac5e0ba --- /dev/null +++ b/src/Direction.java @@ -0,0 +1,14 @@ +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/DrawingDeck.java b/src/DrawingDeck.java new file mode 100644 index 0000000..7a4ea09 --- /dev/null +++ b/src/DrawingDeck.java @@ -0,0 +1,41 @@ +import java.awt.*; +public class DrawingDeck { + private AdditionalEnum deckNumber; + public void SetAddEnum(int num){ + switch (num){ + case 1: + deckNumber = AdditionalEnum.One; + break; + case 2: + deckNumber = AdditionalEnum.Two; + break; + default: + deckNumber = AdditionalEnum.Three; + } + }; + public AdditionalEnum GetDeckNumber() { + return deckNumber; + } + 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 + 30 + 60, _startPosX + 30 + 60, _startPosX+30}; + int[] yDeck = {_startPosY + yDiff, _startPosY + yDiff, _startPosY + 20 + yDiff, _startPosY + 20 + yDiff}; + g2d.setPaint(colorDeck); + g2d.fillPolygon(xDeck,yDeck,4); + g2d.setPaint(Color.BLACK); + g2d.drawPolygon(xDeck,yDeck,4); + if(numOfDecks > 0){ + DrawNumDeck(g2d,numOfDecks-1,_startPosX,_startPosY,colorDeck); + } + } +} \ No newline at end of file diff --git a/src/DrawingLiner.java b/src/DrawingLiner.java new file mode 100644 index 0000000..1330ada --- /dev/null +++ b/src/DrawingLiner.java @@ -0,0 +1,98 @@ +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 new file mode 100644 index 0000000..f62e562 --- /dev/null +++ b/src/EntityLiner.java @@ -0,0 +1,31 @@ +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 new file mode 100644 index 0000000..709710a --- /dev/null +++ b/src/FormLiner.java @@ -0,0 +1,110 @@ +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/Images/arrowDown.png b/src/Images/arrowDown.png new file mode 100644 index 0000000..6f2438f Binary files /dev/null and b/src/Images/arrowDown.png differ diff --git a/src/Images/arrowLeft.png b/src/Images/arrowLeft.png new file mode 100644 index 0000000..4ce0e4f Binary files /dev/null and b/src/Images/arrowLeft.png differ diff --git a/src/Images/arrowRight.png b/src/Images/arrowRight.png new file mode 100644 index 0000000..69bd44f Binary files /dev/null and b/src/Images/arrowRight.png differ diff --git a/src/Images/arrowUp.png b/src/Images/arrowUp.png new file mode 100644 index 0000000..54e5abe Binary files /dev/null and b/src/Images/arrowUp.png differ diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000..78b3151 --- /dev/null +++ b/src/Main.java @@ -0,0 +1,5 @@ +public class Main { + public static void main(String[] args) { + FormLiner fm = new FormLiner(); + } +} \ No newline at end of file