diff --git a/Direction.java b/Direction.java new file mode 100644 index 0000000..a641b80 --- /dev/null +++ b/Direction.java @@ -0,0 +1,6 @@ +public enum Direction { + Up, + Down, + Left, + Right +} diff --git a/DirectionBlocksOnDeck.java b/DirectionBlocksOnDeck.java new file mode 100644 index 0000000..65d9a7e --- /dev/null +++ b/DirectionBlocksOnDeck.java @@ -0,0 +1,5 @@ +public enum DirectionBlocksOnDeck { + Two, + Four, + Six +} diff --git a/DrawningBattleship.java b/DrawningBattleship.java new file mode 100644 index 0000000..3bc4844 --- /dev/null +++ b/DrawningBattleship.java @@ -0,0 +1,167 @@ +import java.awt.*; + +public class DrawningBattleship { + EntityBattleship Battleship; + private DrawningBlocks drawingBlocks; + public EntityBattleship Battleship() + {return Battleship; } + /// + /// Левая координата отрисовки корабля + /// + private float _startPosX; + /// + /// Верхняя кооридната отрисовки корабля + /// + private float _startPosY; + /// + /// Ширина окна отрисовки + /// + private Integer _pictureWidth = null; + /// + /// Высота окна отрисовки + /// + private Integer _pictureHeight = null; + /// + /// Ширина отрисовки корабля + /// + private final int _battleshipWidth = 120; + /// + /// Высота отрисовки корабля + /// + private final int _battleshipHeight = 50; + /// + /// Инициализация свойств + /// + /// Скорость + /// Вес корабля + /// Цвет корпуса + public void Init(int speed, float weight, Color bodyColor, EntityBattleship entityBattleship, int blocks) + { + Battleship = new EntityBattleship(); + Battleship.Init(speed, weight, bodyColor); + drawingBlocks = new DrawningBlocks(); + drawingBlocks.Init(blocks, Color.black); + } + /// + /// Установка позиции корабля + /// + /// Координата X + /// Координата Y + /// Ширина картинки + /// Высота картинки + public void SetPosition(int x, int y, int width, int height) + { + + if ((x > 0 && y > 0) && (_battleshipHeight + y < height) && (_battleshipWidth + x < width)) + { + _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 + _battleshipWidth + Battleship.GetStep() < _pictureWidth) + { + _startPosX += Battleship.GetStep(); + } + break; + //влево + case Left: + if (_startPosX - Battleship.GetStep() >= 0) + { + _startPosX -= Battleship.GetStep(); + } + + break; + + //вверх + case Up: + if (_startPosY - Battleship.GetStep() >= 0) + { + _startPosY -= Battleship.GetStep(); + } + + break; + //вниз + case Down: + if (_startPosY + _battleshipHeight + Battleship.GetStep() < _pictureHeight) + { + _startPosY += Battleship.GetStep(); + } + break; + } + } + /// + /// Отрисовка корабля + /// + /// + public void DrawTransport(Graphics2D g) + { + if (_startPosX < 0 || _startPosY < 0 + || _pictureHeight == null || _pictureWidth == null) + { + return; + } + g.setColor(Color.BLACK); + + //Корпус корабля + g.setColor(Battleship.bodyColor); + g.fillPolygon(new int[]{(int) _startPosX, (int) _startPosX , (int) _startPosX+80, (int) _startPosX + 120, (int)_startPosX + 80, (int)_startPosX}, + new int[]{(int) _startPosY, (int) _startPosY+50 , (int) _startPosY+50, (int) _startPosY + 25, (int)_startPosY, (int)_startPosY}, 6); + //Пушка + g.setColor(Color.BLACK); + g.drawRect((int)_startPosX + 20, (int)_startPosY + 20, 30, 10); + g.drawRect((int)_startPosX + 50,(int) _startPosY + 10, 20, 30); + g.fillRect((int)_startPosX + 20, (int)_startPosY + 20, 30, 10); + g.fillRect((int)_startPosX + 50, (int)_startPosY + 10, 20, 30); + + //Отсек + g.setColor(Color.BLUE); + g.drawOval((int)_startPosX+80, (int)_startPosY+15, 20, 20); + g.fillOval((int)_startPosX + 80, (int)_startPosY + 15, 20, 20); + g.setColor(Color.BLACK); + g.fillRect((int)_startPosX-5, (int)_startPosY+10, 5, 5); + g.fillRect((int)_startPosX - 5, (int)_startPosY + 35, 5, 5); + drawingBlocks.Draw(g, (int) _startPosX, (int) _startPosY); + + } + /// + /// Смена границ формы отрисовки + /// + /// Ширина картинки + /// Высота картинки + public void ChangeBorders(int width, int height) + { + _pictureWidth = width; + _pictureHeight = height; + if (_pictureWidth <= _battleshipWidth || _pictureHeight <= _battleshipHeight) + { + _pictureWidth = null; + _pictureHeight = null; + return; + } + if (_startPosX + _battleshipWidth > _pictureWidth) + { + _startPosX = _pictureWidth - _battleshipWidth; + } + if (_startPosY + _battleshipHeight > _pictureHeight) + { + _startPosY = _pictureHeight - _battleshipHeight; + } + } +} diff --git a/DrawningBlocks.java b/DrawningBlocks.java new file mode 100644 index 0000000..61b2d20 --- /dev/null +++ b/DrawningBlocks.java @@ -0,0 +1,40 @@ +import java.awt.*; + +public class DrawningBlocks { + private DirectionBlocksOnDeck blocksCount; + private Color color; + public void SetNewBlocks(int countBlocks){ + if (countBlocks == 4) { + blocksCount = DirectionBlocksOnDeck.Four; + } else if (countBlocks == 6) { + blocksCount = DirectionBlocksOnDeck.Six; + } + else { + blocksCount = DirectionBlocksOnDeck.Two; + } + } + public void Init(int blocksCount, Color color) + { + SetNewBlocks(blocksCount); + this.color = color; + } + public void Draw(Graphics2D g, int x, int y) { + g.setColor(color != null ? color : Color.BLACK); + switch (blocksCount) { + case Four -> { + g.fillRect(x + 26, y + 10, 10, 5); + g.fillRect(x + 38, y + 10, 10, 5); + g.fillRect(x + 38, y + 35, 10, 5); + g.fillRect(x + 26, y + 35, 10, 5); + } + case Six -> { + g.fillRect(x + 14, y + 10, 10, 5); + g.fillRect(x + 26, y + 10, 10, 5); + g.fillRect(x + 38, y + 10, 10, 5); + g.fillRect(x + 38, y + 35, 10, 5); + g.fillRect(x + 26, y + 35, 10, 5); + g.fillRect(x + 14, y + 35, 10, 5); + } + } + } +} diff --git a/EntityBattleship.java b/EntityBattleship.java new file mode 100644 index 0000000..7f26f3e --- /dev/null +++ b/EntityBattleship.java @@ -0,0 +1,40 @@ +import java.awt.*; +import java.util.Random; + +public class EntityBattleship { + private int speed = 0; + private float weight = 0; + Color bodyColor; + public int GetSpeed() { + return speed; + } + public float GetWeight() { + return weight; + } + /// + /// Цвет корпуса + /// + public Color GetBodyColor() { + return bodyColor; + } + /// + /// Шаг перемещения корабля + /// + public float GetStep(){ + return speed * 100 / weight; + } + /// + /// Инициализация полей объекта-класса корабля + /// + /// + /// + /// + /// + public void Init(int speed, float weight, Color bodyColor) + { + Random rnd = new Random(); + this.speed = speed <= 0 ? rnd.nextInt(950) + 1050 : speed; + this.weight = weight <= 0 ? rnd.nextInt(40) + 70 : weight; + this.bodyColor = bodyColor; + } +} diff --git a/FormBattleship.java b/FormBattleship.java index cb3aa2e..cf501cc 100644 --- a/FormBattleship.java +++ b/FormBattleship.java @@ -1,5 +1,111 @@ -public class FormBattleship { +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; +import java.util.Random; +public class FormBattleship extends JComponent { + private DrawningBattleship _battleship; + private EntityBattleship _entityBattleship; public static void main(String[] args) { - + FormBattleship formBattleship = new FormBattleship(); } + public FormBattleship() { + JFrame form = new JFrame("Военный корабль"); + form.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + form.setSize(800, 500); + form.setVisible(true); + form.setLocationRelativeTo(null); + form.addComponentListener(new ComponentListener() { + @Override + public void componentResized(ComponentEvent e) { + if(_battleship != null) _battleship.ChangeBorders(getWidth(), getHeight()); + repaint(); + } + + @Override + public void componentMoved(ComponentEvent e) { + } + + @Override + public void componentShown(ComponentEvent e) { + } + + @Override + public void componentHidden(ComponentEvent e) { + } + }); + Panel statusPanel = new Panel(); + statusPanel.setBackground(Color.WHITE); + statusPanel.setLayout(new FlowLayout()); + setLayout(new BorderLayout()); + form.add(statusPanel, BorderLayout.SOUTH); + Label speedLabel = new Label("Скорость: "); + Label weightLabel = new Label("Вес: "); + Label colorLabel = new Label("Цвет: "); + + + JButton createButton = new JButton("Создать"); + createButton.addActionListener(e -> { + int[] countBlocks = {2, 4, 6}; + Random rnd = new Random(); + + _battleship = new DrawningBattleship(); + _battleship.Init(rnd.nextInt(100, 300), rnd.nextInt(1000, 2000), + Color.getHSBColor(rnd.nextInt(0, 256), rnd.nextInt(0, 256), + rnd.nextInt(0, 256)), _entityBattleship, countBlocks[rnd.nextInt(0, 3)]); + _battleship.SetPosition(10 + rnd.nextInt(90), 10 + rnd.nextInt(90), form.getWidth(), form.getHeight() - 75); + speedLabel.setText("Скорость: " + _battleship.Battleship.GetSpeed()); + weightLabel.setText("Вес: " + (int)_battleship.Battleship.GetWeight()); + colorLabel.setText("Цвет: " + _battleship.Battleship.GetBodyColor().getRed() + " " + + _battleship.Battleship.GetBodyColor().getGreen() + " " + _battleship.Battleship.GetBodyColor().getBlue() ); + repaint(); + + }); + statusPanel.add(createButton); + statusPanel.add(speedLabel); + statusPanel.add(weightLabel); + statusPanel.add(colorLabel); + JButton upButton = new JButton("↑"); + JButton rightButton = new JButton("→"); + JButton leftButton = new JButton("←"); + JButton downButton = new JButton("↓"); + upButton.addActionListener(e -> { + if (_battleship != null) _battleship.MoveTransport(Direction.Up); + repaint(); + }); + + + rightButton.addActionListener(e -> { + if (_battleship != null) _battleship.MoveTransport(Direction.Right); + repaint(); + }); + + + leftButton.addActionListener(e -> { + if (_battleship != null) _battleship.MoveTransport(Direction.Left); + repaint(); + }); + + + downButton.addActionListener(e -> { + if (_battleship != null) _battleship.MoveTransport(Direction.Down); + repaint(); + }); + + statusPanel.add(leftButton); + statusPanel.add(upButton); + statusPanel.add(rightButton); + statusPanel.add(downButton); + + form.getContentPane().add(this); + } + protected void paintComponent(Graphics g) { + super.paintComponent(g); + Graphics2D g2 = (Graphics2D)g; + if (_battleship != null) _battleship.DrawTransport(g2); + super.repaint(); + } + }