diff --git a/AbstractMap.java b/AbstractMap.java new file mode 100644 index 0000000..a672a1f --- /dev/null +++ b/AbstractMap.java @@ -0,0 +1,157 @@ +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.BufferedReader; +import java.util.Random; + +public abstract class AbstractMap { + private IDrawningObject _drawningObject = null; + protected int[][] _map = null; + protected int _width; + protected int _height; + protected float _size_x; + protected float _size_y; + protected final Random _random = new Random(); + protected final int _freeRoad = 0; + protected final int _barrier = 1; + public BufferedImage CreateMap(int width, int height, IDrawningObject drawningObject){ + _width = width; + _height = height; + _drawningObject = drawningObject; + GenerateMap(); + while (!SetObjectOnMap()) + { + GenerateMap(); + } + return DrawMapWithObject(); + } + public BufferedImage MoveObject(Direction direction) + { + int _startX = (int) (_drawningObject.GetCurrentPosition()[3] / _size_x); + int _startY = (int)(_drawningObject.GetCurrentPosition()[0] / _size_y); + int _objWidth = (int)(_drawningObject.GetCurrentPosition()[1] / _size_x); + int _objHeight = (int)(_drawningObject.GetCurrentPosition()[2] / _size_y); + + boolean isMove = true; + switch (direction) + { + case Right: + for (int i = _objWidth; i <= _objWidth + (int)(_drawningObject.getStep() / _size_x); i++) + { + for (int j = _startY; j <= _objHeight; j++) + { + if (_map[i][j] == _barrier) + { + isMove = false; + break; + } + } + } + break; + + case Left: + for (int i = _startX; i >= (int)(_drawningObject.getStep() / _size_x); i--) + { + for (int j = _startY; j <= _objHeight; j++) + { + if (_map[i][j] == _barrier) + { + isMove = false; + break; + } + } + } + break; + + case Up: + for (int i = _startX; i <= _objWidth; i++) + { + for (int j = _startY; j >= (int)(_drawningObject.getStep() / _size_y); j--) + { + if (_map[i][j] == _barrier) + { + isMove = false; + break; + } + } + } + break; + + case Down: + for (int i = _startX; i <= _objWidth; i++) + { + for (int j = _objHeight; j <= _objHeight + (int)(_drawningObject.getStep() / _size_y); j++) + { + if (_map[i][j] == _barrier) + { + isMove = false; + break; + } + } + } + break; + } + + if (isMove) + { + _drawningObject.MoveObject(direction); + } + return DrawMapWithObject(); + } + private boolean SetObjectOnMap() + { + if (_drawningObject == null || _map == null) + { + return false; + } + int x = _random.nextInt(0, 10); + int y = _random.nextInt(0, 10); + _drawningObject.SetObject(x, y, _width, _height); + // TODO првоерка, что объект не "накладывается" на закрытые участки + for (int i = 0; i < _map.length; ++i) + { + for (int j = 0; j < _map[0].length; ++j) + { + if (i * _size_x >= x && j * _size_y >= y && + i * _size_x <= x + _drawningObject.GetCurrentPosition()[1] && + j * _size_y <= j + _drawningObject.GetCurrentPosition()[2]) + { + if (_map[i][j] == _barrier) + { + return false; + } + } + } + } + + return true; + } + private BufferedImage DrawMapWithObject() + { + BufferedImage bmp = new BufferedImage(_width, _height, BufferedImage.TYPE_INT_RGB); + if (_drawningObject == null || _map == null) + { + return bmp; + } + Graphics gr = bmp.getGraphics(); + for (int i = 0; i < _map.length; i++) + { + for (int j = 0; j < _map[0].length; j++) + { + if (_map[i][j] == _freeRoad) + { + DrawRoadPart(gr, i, j); + } + else if (_map[i][j] == _barrier) + { + DrawBarrierPart(gr, i, j); + } + } + } + _drawningObject.DrawningObject(gr); + return bmp; + } + protected abstract void GenerateMap(); + protected abstract void DrawRoadPart(Graphics g, int i, int j); + protected abstract void DrawBarrierPart(Graphics g, int i, int j); + +} diff --git a/DrawningBattleship.java b/DrawningBattleship.java index 3bc4844..cc6d3e2 100644 --- a/DrawningBattleship.java +++ b/DrawningBattleship.java @@ -1,18 +1,20 @@ import java.awt.*; +import java.util.Random; public class DrawningBattleship { EntityBattleship Battleship; private DrawningBlocks drawingBlocks; + private IDrawningBlocks iDrawingBlocks; public EntityBattleship Battleship() {return Battleship; } /// /// Левая координата отрисовки корабля /// - private float _startPosX; + protected float _startPosX; /// /// Верхняя кооридната отрисовки корабля /// - private float _startPosY; + protected float _startPosY; /// /// Ширина окна отрисовки /// @@ -24,23 +26,44 @@ public class DrawningBattleship { /// /// Ширина отрисовки корабля /// - private final int _battleshipWidth = 120; + private int _battleshipWidth = 120; /// /// Высота отрисовки корабля /// - private final int _battleshipHeight = 50; + private int _battleshipHeight = 50; /// /// Инициализация свойств /// /// Скорость /// Вес корабля /// Цвет корпуса - public void Init(int speed, float weight, Color bodyColor, EntityBattleship entityBattleship, int blocks) + public DrawningBattleship(int speed, float weight, Color bodyColor) { - Battleship = new EntityBattleship(); - Battleship.Init(speed, weight, bodyColor); - drawingBlocks = new DrawningBlocks(); - drawingBlocks.Init(blocks, Color.black); + + //Battleship.Init(speed, weight, bodyColor); + Random random = new Random(); + int[] ArrayBlocks = new int[]{2, 4, 6}; + + switch (random.nextInt(3)){ + case 0: + iDrawingBlocks = new DrawningBlocks(ArrayBlocks[random.nextInt(0, 3)], Color.BLACK); + break; + case 1: + iDrawingBlocks = new DrawningRoundBlocks(ArrayBlocks[random.nextInt(0, 3)]); + break; + case 2: + iDrawingBlocks = new DrawningTriangleBlocks(ArrayBlocks[random.nextInt(0, 3)]); + break; + + } + + Battleship = new EntityBattleship(speed, weight, bodyColor); + } + protected DrawningBattleship(int speed, float weight, Color bodyColor, int battleshipWidth, int battleshipHeight) + { + this(speed, weight, bodyColor); + _battleshipWidth = battleshipWidth; + _battleshipHeight = battleshipHeight; } /// /// Установка позиции корабля @@ -51,7 +74,6 @@ public class DrawningBattleship { /// Высота картинки public void SetPosition(int x, int y, int width, int height) { - if ((x > 0 && y > 0) && (_battleshipHeight + y < height) && (_battleshipWidth + x < width)) { _startPosX = x; @@ -137,7 +159,7 @@ public class DrawningBattleship { 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); + iDrawingBlocks.DrawBlocks(g, (int) _startPosX, (int) _startPosY, Color.BLACK); } /// @@ -163,5 +185,10 @@ public class DrawningBattleship { { _startPosY = _pictureHeight - _battleshipHeight; } + + } + public float[] GetCurrentPosition() + { + return new float[] {_startPosY, _startPosX + _battleshipWidth, /*DOWN*/ _startPosY + _battleshipHeight, /*LEFT*/ _startPosX}; } } diff --git a/DrawningBlocks.java b/DrawningBlocks.java index 61b2d20..fec7e46 100644 --- a/DrawningBlocks.java +++ b/DrawningBlocks.java @@ -1,40 +1,45 @@ import java.awt.*; -public class DrawningBlocks { - private DirectionBlocksOnDeck blocksCount; +public class DrawningBlocks implements IDrawningBlocks { + private DirectionBlocksOnDeck blocksCount = DirectionBlocksOnDeck.Two; 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); + public DrawningBlocks(int count, Color color){ + SetBlocks(count); this.color = color; - } - public void Draw(Graphics2D g, int x, int y) { + } + @Override + public void DrawBlocks(Graphics g, int x, int y, Color bodyColor) { 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); + g.fillRect(x + 58, y, 8, 5); + g.fillRect(x + 70, y, 8, 5); + g.fillRect(x + 70, y + 40, 8, 5); + g.fillRect(x + 58, y + 40, 8, 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); + g.fillRect(x + 46, y, 8, 5); + g.fillRect(x + 58, y , 8, 5); + g.fillRect(x + 70, y, 8, 5); + g.fillRect(x + 46, y + 45, 8, 5); + g.fillRect(x + 58, y + 45, 8, 5); + g.fillRect(x + 70, y + 45, 8, 5); } } } + + @Override + public void SetBlocks(int count) { + switch(count) + { + case 4: + blocksCount = DirectionBlocksOnDeck.Four; + break; + case 6: + blocksCount = DirectionBlocksOnDeck.Six; + break; + default: + break; + } + } } diff --git a/DrawningLinkor.java b/DrawningLinkor.java new file mode 100644 index 0000000..565fd10 --- /dev/null +++ b/DrawningLinkor.java @@ -0,0 +1,41 @@ +import java.awt.*; + +public class DrawningLinkor extends DrawningBattleship { + + public DrawningLinkor(int speed, float weight, Color bodyColor, Color dopColor, boolean turret, boolean missileBay) { + super(speed, weight, bodyColor, 120, 50); + Battleship = new EntityLinkor(speed, weight, bodyColor, dopColor, turret, missileBay); + } + + @Override + public void DrawTransport(Graphics2D g) { + + if(!(Battleship instanceof EntityLinkor linkor)) + { + return; + } + super.DrawTransport(g); + EntityLinkor entityLinkor = (EntityLinkor) Battleship; + + if (entityLinkor.turret) + { + //Brush dopBrushRed = new SolidBrush(Color.Red); + g.setColor(entityLinkor.dopColor); + g.fillOval((int)_startPosX + 15, (int)_startPosY, 20, 20); + g.fillOval((int) _startPosX + 15, (int)_startPosY + 30, 20, 20); + g.setColor(Color.BLACK); + g.fillRect((int)_startPosX + 20, (int)_startPosY+5, 23, 7); + g.fillRect((int)_startPosX + 20,(int) _startPosY + 37, 23, 7); + + } + if (entityLinkor.missileBay) + { + + g.setColor(Color.BLACK); + g.fillOval((int)_startPosX, (int)_startPosY + 15, 20, 20); + g.setColor(entityLinkor.dopColor); + g.fillOval((int)_startPosX+5,(int) _startPosY + 20, 10, 10); + + } + } +} diff --git a/DrawningObjectBattleship.java b/DrawningObjectBattleship.java new file mode 100644 index 0000000..16a01a8 --- /dev/null +++ b/DrawningObjectBattleship.java @@ -0,0 +1,38 @@ +import java.awt.*; + +public class DrawningObjectBattleship implements IDrawningObject { + + private DrawningBattleship _battleship = null; + public DrawningObjectBattleship(DrawningBattleship battleship){ +_battleship = battleship; + } + @Override + public float getStep() { + if (_battleship.Battleship != null) { + return _battleship.Battleship.GetStep(); + } + return 0; + } + + @Override + public void SetObject(int x, int y, int width, int height) { + if (_battleship != null) _battleship.SetPosition(x, y, width, height); + } + + @Override + public void MoveObject(Direction direction) { + if (_battleship!= null) _battleship.MoveTransport(direction); + } + + @Override + public void DrawningObject(Graphics g) { + if (_battleship != null) _battleship.DrawTransport((Graphics2D) g); + } + + @Override + public float[] GetCurrentPosition() { + if (_battleship != null) {return _battleship.GetCurrentPosition();} + return null; + } + +} diff --git a/DrawningRoundBlocks.java b/DrawningRoundBlocks.java new file mode 100644 index 0000000..48da31d --- /dev/null +++ b/DrawningRoundBlocks.java @@ -0,0 +1,48 @@ +import java.awt.*; + +public class DrawningRoundBlocks implements IDrawningBlocks{ + + private DirectionBlocksOnDeck blocksOnDeck = DirectionBlocksOnDeck.Two; + @Override + public void DrawBlocks(Graphics g, int x, int y, Color bodyColor) { + g.setColor(Color.black); + switch(blocksOnDeck){ + case Four -> { + g.fillOval(x + 56, y , 8, 8); + g.fillOval(x + 68, y , 8, 8); + g.fillOval(x + 68, y +40, 8, 8); + g.fillOval(x + 56, y + 40, 8, 8); + } + case Six -> { + g.fillOval(x + 54, y , 8, 8); + g.fillOval(x + 66, y , 8, 8); + g.fillOval(x + 78, y , 8, 8); + g.fillOval(x + 78, y + 40, 8, 8); + g.fillOval(x + 66, y + 40, 8, 8); + g.fillOval(x + 54, y + 40, 8, 8); + }} + } + + @Override + public void SetBlocks(int count) { + switch(count) + { + case 2: + blocksOnDeck = DirectionBlocksOnDeck.Two; + break; + case 4: + blocksOnDeck = DirectionBlocksOnDeck.Four; + break; + case 6: + blocksOnDeck = DirectionBlocksOnDeck.Six; + break; + default: + break; + } + } + + public DrawningRoundBlocks (int num) { + SetBlocks(num); + + } +} diff --git a/DrawningTriangleBlocks.java b/DrawningTriangleBlocks.java new file mode 100644 index 0000000..4557e57 --- /dev/null +++ b/DrawningTriangleBlocks.java @@ -0,0 +1,54 @@ +import java.awt.*; + +public class DrawningTriangleBlocks implements IDrawningBlocks { + + private DirectionBlocksOnDeck blocksOnDeck = DirectionBlocksOnDeck.Two; + + @Override + public void DrawBlocks(Graphics g, int x, int y, Color bodyColor) { + g.setColor(Color.black); + switch(blocksOnDeck){ + case Four -> { + g.fillPolygon(new int[]{x + 46, x + 54, x+ 60 }, new int[]{y + 7, y, y + 7}, 3); + g.fillPolygon(new int[]{x + 46, x + 54, x+ 60 }, new int[]{y + 49, y + 42, y + 49}, 3); + + g.fillPolygon(new int[]{x + 58, x + 66, x+ 72}, new int[]{y + 7, y, y + 7}, 3); + g.fillPolygon(new int[]{x + 58, x + 66, x+72}, new int[]{y + 49, y + 42, y + 49}, 3); + + + + } + case Six -> { + g.fillPolygon(new int[]{x + 46, x + 54, x+ 60 }, new int[]{y + 7, y, y + 7}, 3); + g.fillPolygon(new int[]{x + 66, x + 64, x+ 80 }, new int[]{y + 7, y, y + 7}, 3); + g.fillPolygon(new int[]{x + 46, x + 54, x+ 60 }, new int[]{y + 49, y + 42, y + 49}, 3); + g.fillPolygon(new int[]{x + 66, x + 64, x+ 80 }, new int[]{y + 49, y + 42, y + 49}, 3); + g.fillPolygon(new int[]{x + 58, x + 66, x+ 72}, new int[]{y + 7, y, y + 7}, 3); + g.fillPolygon(new int[]{x + 58, x + 66, x+72}, new int[]{y + 49, y + 42, y + 49}, 3); + + }} + } + + @Override + public void SetBlocks(int count) { + switch(count) + { + case 2: + blocksOnDeck = DirectionBlocksOnDeck.Two; + break; + case 4: + blocksOnDeck = DirectionBlocksOnDeck.Four; + break; + case 6: + blocksOnDeck = DirectionBlocksOnDeck.Six; + break; + default: + break; + } + + } + public DrawningTriangleBlocks (int num) { + SetBlocks(num); + + } +} diff --git a/EntityBattleship.java b/EntityBattleship.java index 7f26f3e..fe8a1c5 100644 --- a/EntityBattleship.java +++ b/EntityBattleship.java @@ -30,7 +30,7 @@ public class EntityBattleship { /// /// /// - public void Init(int speed, float weight, Color bodyColor) + public EntityBattleship(int speed, float weight, Color bodyColor) { Random rnd = new Random(); this.speed = speed <= 0 ? rnd.nextInt(950) + 1050 : speed; diff --git a/EntityLinkor.java b/EntityLinkor.java new file mode 100644 index 0000000..f6edc34 --- /dev/null +++ b/EntityLinkor.java @@ -0,0 +1,14 @@ +import java.awt.*; + +public class EntityLinkor extends EntityBattleship { + public final boolean turret; + public final boolean missileBay; + public final Color dopColor; + + public EntityLinkor(int speed, float weight, Color bodyColor, Color DopColor, boolean Turret, boolean MissileBay) { + super(speed, weight, bodyColor); + dopColor = DopColor; + missileBay = MissileBay; + turret = Turret; + } +} diff --git a/FormBattleship.java b/FormBattleship.java deleted file mode 100644 index cf501cc..0000000 --- a/FormBattleship.java +++ /dev/null @@ -1,111 +0,0 @@ -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(); - } - -} diff --git a/FormMap.java b/FormMap.java new file mode 100644 index 0000000..286fce5 --- /dev/null +++ b/FormMap.java @@ -0,0 +1,137 @@ +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.awt.image.BufferedImage; +import java.util.Random; +public class FormMap extends JComponent { + private AbstractMap _abstractMap; + private DrawningBattleship _battleship; + private BufferedImage bufferedImage; + public static void main(String[] args) { + FormMap formMap = new FormMap(); + } + public FormMap() { + JFrame form = new JFrame("Карта"); + form.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + form.setSize(1000, 500); + form.setVisible(true); + form.setLocationRelativeTo(null); + 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("Цвет: "); + + String[] maps = { + "Простая карта", + "Морская карта" + + }; + JComboBox mapSelectComboBox = new JComboBox(maps); + mapSelectComboBox.setEditable(true); + mapSelectComboBox.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + String item = (String)mapSelectComboBox.getSelectedItem(); + if (item == null) return; + switch (item) { + case ("Простая карта"): + _abstractMap = new SimpleMap(); + break; + case ("Морская карта"): + _abstractMap = new SeaMap(); + break; + + } + } + }); + JButton createButton = new JButton("Создать"); + createButton.addActionListener(e -> { + + Random rnd = new Random(); + + var battleship = new DrawningBattleship(rnd.nextInt(100, 300), rnd.nextInt(1000, 2000), + Color.getHSBColor(rnd.nextInt(0, 256), rnd.nextInt(0, 256), + rnd.nextInt(0, 256))); + 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() ); + if (_abstractMap != null) bufferedImage = _abstractMap.CreateMap(1000, 490, new DrawningObjectBattleship(battleship)); + repaint(); + + }); + JButton modifiedButton = new JButton("Модификация"); + modifiedButton.addActionListener(e -> { + Random rnd = new Random(); + + Color colorFirst = new Color(rnd.nextInt(256), rnd.nextInt(256),rnd.nextInt(256)); + Color colorSecond = new Color(rnd.nextInt(256), rnd.nextInt(256),rnd.nextInt(256)); + + var battleship = new DrawningLinkor(rnd.nextInt(200) + 100, rnd.nextInt(1000) + 1000, + colorFirst, + colorSecond, + rnd.nextBoolean(), + rnd.nextBoolean()); + battleship.SetPosition(10 + rnd.nextInt(90), 10 + rnd.nextInt(90), 800, 500 - 75); + speedLabel.setText("Скорость: " + battleship.Battleship.GetSpeed()); + weightLabel.setText("Вес: " + battleship.Battleship.GetWeight()); + colorLabel.setText("Цвет: " + battleship.Battleship.GetBodyColor().getRed() + " " + battleship.Battleship.GetBodyColor().getGreen() + " " + battleship.Battleship.GetBodyColor().getBlue() ); + if (_abstractMap != null) bufferedImage = _abstractMap.CreateMap(1000, 490, new DrawningObjectBattleship(battleship)); + repaint(); + }); + statusPanel.add(mapSelectComboBox); + statusPanel.add(createButton); + statusPanel.add(modifiedButton); + 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(bufferedImage != null) bufferedImage = _abstractMap.MoveObject(Direction.Up); + repaint(); + }); + + + rightButton.addActionListener(e -> { + if(bufferedImage != null) bufferedImage = _abstractMap.MoveObject(Direction.Right); + repaint(); + }); + + + leftButton.addActionListener(e -> { + if(bufferedImage != null) bufferedImage = _abstractMap.MoveObject(Direction.Left); + repaint(); + }); + + + downButton.addActionListener(e -> { + if(bufferedImage != null) bufferedImage = _abstractMap.MoveObject(Direction.Down); + repaint(); + }); + + statusPanel.add(leftButton); + statusPanel.add(upButton); + statusPanel.add(rightButton); + statusPanel.add(downButton); + + form.getContentPane().add(this); + super.repaint(); + } + protected void paintComponent(Graphics g) { + super.paintComponent(g); + Graphics2D g2 = (Graphics2D)g; + if (bufferedImage != null) g2.drawImage(bufferedImage, 0,0,1000,490,null); + super.repaint(); + } + +} diff --git a/IDrawningBlocks.java b/IDrawningBlocks.java new file mode 100644 index 0000000..1b96a44 --- /dev/null +++ b/IDrawningBlocks.java @@ -0,0 +1,7 @@ +import java.awt.*; + +public interface IDrawningBlocks { + void DrawBlocks(Graphics g, int startX, int startY, Color bodyColor); + void SetBlocks(int count); + +} diff --git a/IDrawningObject.java b/IDrawningObject.java new file mode 100644 index 0000000..af06c5b --- /dev/null +++ b/IDrawningObject.java @@ -0,0 +1,9 @@ +import java.awt.*; + +public interface IDrawningObject { + float getStep(); + void SetObject(int x, int y, int width, int height); + void MoveObject(Direction direction); + void DrawningObject(Graphics g); + float[] GetCurrentPosition(); +} diff --git a/SeaMap.java b/SeaMap.java new file mode 100644 index 0000000..501ba8f --- /dev/null +++ b/SeaMap.java @@ -0,0 +1,44 @@ +import java.awt.*; + +public class SeaMap extends AbstractMap { + + @Override + protected void GenerateMap() { + _map = new int[100][100]; + _size_x = (float)_width / _map.length; + _size_y = (float)_height / _map[0].length; + int counter = 0; + for (int i = 0; i < _map.length; ++i) + { + for (int j = 0; j < _map[0].length; ++j) + { + _map[i][j] = _freeRoad; + } + } + while (counter < 10) + { + int x = _random.nextInt(1, 99); + int y = _random.nextInt(1, 100); + if (_map[x][y] == _freeRoad) + { + _map[x][y] = _barrier; + _map[x + 1][y] = _barrier; + counter++; + } + } + } + + @Override + protected void DrawRoadPart(Graphics g, int i, int j) { + g.setColor(Color.BLUE); + g.fillRect((int) (i * _size_x), (int) (j * _size_y), (int)(i * (_size_x + 1)), (int)(j * (_size_y + 1))); + + } + + @Override + protected void DrawBarrierPart(Graphics g, int i, int j) { + g.setColor(Color.WHITE); + g.fillPolygon(new int[]{i * (int) _size_x, i * (int) _size_x + 18, i * (int) _size_x - 18},new int[]{ j * (int) _size_y, j * (int) _size_y + 20, + j * (int) _size_y + 20}, 3); + } +} diff --git a/SimpleMap.java b/SimpleMap.java new file mode 100644 index 0000000..5f0da93 --- /dev/null +++ b/SimpleMap.java @@ -0,0 +1,43 @@ +import java.awt.*; + +public class SimpleMap extends AbstractMap { + + Color roadColor = Color.GRAY; + Color barrierColor = Color.BLACK; + @Override + protected void GenerateMap() { + _map = new int[100][100]; + _size_x = (float)_width / _map.length; + _size_y = (float)_height / _map[0].length; + int counter = 0; + for (int i = 0; i < _map.length; ++i) + { + for (int j = 0; j < _map[0].length; ++j) + { + _map[i][j] = _freeRoad; + } + } + while (counter < 50) + { + int x = _random.nextInt(0, 100); + int y = _random.nextInt(0, 100); + if (_map[x][y] == _freeRoad) + { + _map[x][y] = _barrier; + counter++; + } + } + } + + @Override + protected void DrawRoadPart(Graphics g, int i, int j) { + g.setColor(roadColor); + g.fillRect((int) (i * _size_x), (int) (j * _size_y), (int)(i * (_size_x + 1)), (int)(j * (_size_y + 1))); + } + + @Override + protected void DrawBarrierPart(Graphics g, int i, int j) { + g.setColor(barrierColor); + g.fillRect( (int)(i * _size_x), (int)(j * _size_y), (int)(i * (_size_x + 1)), (int)(j * (_size_y + 1))); + } +}