From 0c7b7b773c0ff8d424c41d0acb968f9f9df77b19 Mon Sep 17 00:00:00 2001 From: ArtemEmelyanov Date: Tue, 29 Nov 2022 20:49:03 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BE=D0=B1=D1=80=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=BF=D1=80=D0=BE=D1=81=D1=82=D0=B0=D1=8F=20?= =?UTF-8?q?=D1=87=D0=B0=D1=81=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AbstractMap.java | 115 +++++++++++++++++++++++++++++++++++ Direction.java | 3 +- DrawningObjectPlane.java | 7 ++- EntityAirbus.java | 7 --- EntityPlane.java | 2 + FormMap.form | 121 ++++++++++++++++++++++++++++++++++++ FormMap.java | 128 +++++++++++++++++++++++++++++++++++++++ IDrawningObject.java | 5 +- Main.java | 2 +- MyMap.java | 44 ++++++++++++++ SimpleMap.java | 45 ++++++++++++++ 11 files changed, 465 insertions(+), 14 deletions(-) create mode 100644 AbstractMap.java create mode 100644 FormMap.form create mode 100644 FormMap.java create mode 100644 MyMap.java create mode 100644 SimpleMap.java diff --git a/AbstractMap.java b/AbstractMap.java new file mode 100644 index 0000000..cf2e1b3 --- /dev/null +++ b/AbstractMap.java @@ -0,0 +1,115 @@ +import java.awt.*; +import java.awt.image.BufferedImage; +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(); + } + + private boolean CheckBarriers(float topOffset, float rightOffset, float leftOffset, float bottomOffset) + { + float[] arrayPossition = _drawningObject.GetCurrentPosition(); + int top = (int)((arrayPossition[1] + topOffset) / _size_y); + int right = (int)((arrayPossition[2] + rightOffset) / _size_x); + int left = (int)((arrayPossition[0] + leftOffset) / _size_x); + int bottom = (int)((arrayPossition[3] + bottomOffset) / _size_y); + if (top < 0 || left < 0 || right >= _map[0].length || bottom >= _map.length) return false; + for (int i = top; i <= bottom; i++) + { + for (int j = left; j <= right; j++) + { + if (_map[j][i] == _barrier) return false; + } + } + return true; + } + + public BufferedImage MoveObject(Direction direction) + { + if (_drawningObject == null) return DrawMapWithObject(); + boolean isTrue = true; + switch (direction) + { + case Left: + if (!CheckBarriers(0, -1 * _drawningObject.Step(), -1 * _drawningObject.Step(), 0)) isTrue = false; + break; + case Right: + if (!CheckBarriers(0, _drawningObject.Step(), _drawningObject.Step(), 0)) isTrue = false; + break; + case Up: + if (!CheckBarriers(-1 * _drawningObject.Step(), 0, 0, -1 * _drawningObject.Step())) isTrue = false; + break; + case Down: + if (!CheckBarriers(_drawningObject.Step(), 0, 0, _drawningObject.Step())) isTrue = false; + break; + } + if (isTrue) + { + _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); + if (!CheckBarriers(0, 0, 0, 0)) 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((Graphics2D) gr, i, j); + } + else if (_map[i][j] == _barrier) + { + DrawBarrierPart((Graphics2D) gr, i, j); + } + } + } + _drawningObject.DrawningObject(gr); + return bmp; + } + + protected abstract void GenerateMap(); + protected abstract void DrawRoadPart(Graphics2D g, int i, int j); + protected abstract void DrawBarrierPart(Graphics2D g, int i, int j); +} diff --git a/Direction.java b/Direction.java index d82266b..d1def94 100644 --- a/Direction.java +++ b/Direction.java @@ -2,6 +2,7 @@ public enum Direction { Up(1), Down(2), Left(3), - Right(4); + Right(4), + None(0); Direction(int value){} } \ No newline at end of file diff --git a/DrawningObjectPlane.java b/DrawningObjectPlane.java index 49f8fbc..5c257f0 100644 --- a/DrawningObjectPlane.java +++ b/DrawningObjectPlane.java @@ -1,4 +1,5 @@ import java.awt.*; +import java.util.Enumeration; public class DrawningObjectPlane implements IDrawningObject { private DrawningPlane _plane = null; @@ -7,10 +8,10 @@ public class DrawningObjectPlane implements IDrawningObject { { _plane = plane; } - + @Override public float Step() { if(_plane != null && _plane.Plane != null) - return _plane.Plane.Step; + return _plane.Plane.GetStep(); return 0; } @@ -25,7 +26,7 @@ public class DrawningObjectPlane implements IDrawningObject { } @Override - public void DrawingObject(Graphics g) { + public void DrawningObject(Graphics g) { _plane.DrawTransport(g); } diff --git a/EntityAirbus.java b/EntityAirbus.java index 396d409..af93301 100644 --- a/EntityAirbus.java +++ b/EntityAirbus.java @@ -3,19 +3,12 @@ import java.awt.*; public class EntityAirbus extends EntityPlane{ public Color DopColor; - public Color GetDopColor() { - return DopColor; - } public boolean BodyKit; - public boolean GetBodyKit(){ return BodyKit; } public boolean Wing; - public boolean GetWing(){ return Wing; } public boolean SportLine; - public boolean GetSportLine(){ return SportLine; } - public EntityAirbus(int speed, float weight, Color bodyColor, Color dopColor, boolean bodyKit, boolean wing, boolean sportLine) { super(speed, weight, bodyColor); diff --git a/EntityPlane.java b/EntityPlane.java index 7ddb3c2..b232f25 100644 --- a/EntityPlane.java +++ b/EntityPlane.java @@ -16,7 +16,9 @@ public class EntityPlane { public Color GetBodyColor() { return BodyColor; } + public float Step; + public float GetStep(){return Step;} public EntityPlane(int speed, float weight, Color bodyColor) { diff --git a/FormMap.form b/FormMap.form new file mode 100644 index 0000000..ff5bafc --- /dev/null +++ b/FormMap.form @@ -0,0 +1,121 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/FormMap.java b/FormMap.java new file mode 100644 index 0000000..f25dbdf --- /dev/null +++ b/FormMap.java @@ -0,0 +1,128 @@ +import javax.imageio.ImageIO; +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.image.BufferedImage; +import java.util.Random; + +public class FormMap extends JFrame{ + public JPanel Mainpanel; + private JButton ButtonCreate; + private JButton ButtonLeft; + private JButton ButtonUp; + private JButton ButtonDown; + private JButton ButtonRight; + private JPanel PictureBox; + private JToolBar StatusStrip; + private JButton ButtonModif; + private JComboBox comboBoxSelector; + private final JLabel JLabelSpeed = new JLabel(); + private final JLabel JLabelWeight = new JLabel(); + private final JLabel JLabelColor = new JLabel(); + private AbstractMap _abstractMap; + + private void ButtonMove_Click(String name) + { + Direction dir = Direction.None; + switch (name) + { + case "buttonLeft": + dir = Direction.Left; + break; + case "buttonUp": + dir = Direction.Up; + break; + case "buttonRight": + dir = Direction.Right; + break; + case "buttonDown": + dir = Direction.Down; + break; + } + PictureBox.removeAll(); + JLabel imageWithMapAndObject = new JLabel(); + imageWithMapAndObject.setPreferredSize(PictureBox.getSize()); + imageWithMapAndObject.setMinimumSize(new Dimension(1, 1)); + imageWithMapAndObject.setIcon(new ImageIcon(_abstractMap.MoveObject(dir))); + PictureBox.add(imageWithMapAndObject, BorderLayout.CENTER); + PictureBox.revalidate(); + PictureBox.repaint(); + } + + private void SetData(DrawningPlane _plane){ + PictureBox.removeAll(); + JLabelSpeed.setText("Cкорость: " + _plane.GetPlane().GetSpeed() + " "); + JLabelWeight.setText("Вес: " + _plane.GetPlane().GetWeight() + " "); + JLabelColor.setText(("Цвет: " + _plane.GetPlane().GetBodyColor() + " ")); + JLabel imageWithMapAndObject = new JLabel(); + imageWithMapAndObject.setPreferredSize(PictureBox.getSize()); + imageWithMapAndObject.setMinimumSize(new Dimension(1, 1)); + imageWithMapAndObject.setIcon(new ImageIcon(_abstractMap.CreateMap(PictureBox.getWidth(),PictureBox.getHeight(), new DrawningObjectPlane(_plane)))); + PictureBox.add(imageWithMapAndObject, BorderLayout.CENTER); + PictureBox.revalidate(); + } + public FormMap() { + comboBoxSelector.addItem("Простая карта"); + comboBoxSelector.addItem("Вторая карта"); + _abstractMap = new SimpleMap(); + Box LabelBox = Box.createHorizontalBox(); + LabelBox.setMinimumSize(new Dimension(1, 20)); + LabelBox.add(JLabelSpeed); + LabelBox.add(JLabelWeight); + LabelBox.add(JLabelColor); + StatusStrip.add(LabelBox); + try { + Image img = ImageIO.read(FormMap.class.getResource("/Resource/arrowUp.jpg")); + ButtonUp.setIcon(new ImageIcon(img)); + img = ImageIO.read(FormMap.class.getResource("/Resource/arrowDown.jpg")); + ButtonDown.setIcon(new ImageIcon(img)); + img = ImageIO.read(FormMap.class.getResource("/Resource/arrowLeft.jpg")); + ButtonLeft.setIcon(new ImageIcon(img)); + img = ImageIO.read(FormMap.class.getResource("/Resource/arrowRight.jpg")); + ButtonRight.setIcon(new ImageIcon(img)); + } catch (Exception ex) { + System.out.println(ex); + } + ButtonCreate.addActionListener(e -> { + Random random = new Random(); + var _plane = new DrawningPlane(random.nextInt(100, 300),random.nextInt(1000, 2000),new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); + SetData(_plane); + }); + ButtonModif.addActionListener(e -> { + Random random = new Random(); + var _plane = new DrawningAirbus(random.nextInt(100, 300), random.nextInt(1000, 2000), new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)), new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)), random.nextBoolean(), random.nextBoolean(), random.nextBoolean()); + SetData(_plane); + }); + ButtonUp.addActionListener(e -> { + ButtonMove_Click("buttonUp"); + }); + ButtonDown.addActionListener(e -> { + ButtonMove_Click("buttonDown"); + }); + ButtonLeft.addActionListener(e -> { + ButtonMove_Click("buttonLeft"); + }); + ButtonRight.addActionListener(e -> { + ButtonMove_Click("buttonRight"); + }); + comboBoxSelector.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + comboBoxSelector = (JComboBox)e.getSource(); + String item = (String)comboBoxSelector.getSelectedItem(); + switch (item) { + case "Простая карта" -> { + _abstractMap = new SimpleMap(); + break; + } + case "Вторая карта" -> { + _abstractMap = new MyMap(); + break; + } + } + } + }); + + } +} diff --git a/IDrawningObject.java b/IDrawningObject.java index 9b32730..01157fa 100644 --- a/IDrawningObject.java +++ b/IDrawningObject.java @@ -1,13 +1,14 @@ import java.awt.*; +import java.util.Enumeration; public interface IDrawningObject { - public float Step = 0; + float Step(); void SetObject(int x, int y, int width, int height); void MoveObject(Direction direction); - void DrawingObject(Graphics g); + void DrawningObject(Graphics g); float[] GetCurrentPosition(); } diff --git a/Main.java b/Main.java index 0a4e1b1..f7c77d5 100644 --- a/Main.java +++ b/Main.java @@ -4,7 +4,7 @@ public class Main { public static void main(String[] args) { JFrame frame = new JFrame("Самолёт"); - frame.setContentPane(new FormPlane().Mainpanel); + frame.setContentPane(new FormMap().Mainpanel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocation(500, 200); frame.pack(); diff --git a/MyMap.java b/MyMap.java new file mode 100644 index 0000000..08bac74 --- /dev/null +++ b/MyMap.java @@ -0,0 +1,44 @@ +import java.awt.*; + +public class MyMap extends AbstractMap{ + private Color barrierColor = Color.WHITE; + private Color roadColor = Color.CYAN; + + @Override + protected void DrawBarrierPart(Graphics2D g, int i, int j) + { + g.setPaint(barrierColor); + g.fillRect((int)Math.floor(i * _size_x), (int)Math.floor(j * _size_y), (int)Math.ceil(_size_x), (int)Math.ceil(_size_y)); + } + @Override + protected void DrawRoadPart(Graphics2D g, int i, int j) + { + g.setPaint(roadColor); + g.fillRect((int)Math.floor(i * _size_x), (int)Math.floor(j * _size_y), (int)Math.ceil(_size_x), (int)Math.ceil(_size_y)); + } + @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 < 25) + { + int x = _random.nextInt(0, 100); + int y = _random.nextInt(0, 100); + if (_map[x][y] == _freeRoad) + { + _map[x][y] = _barrier; + counter++; + } + } + } +} diff --git a/SimpleMap.java b/SimpleMap.java new file mode 100644 index 0000000..0b5f48c --- /dev/null +++ b/SimpleMap.java @@ -0,0 +1,45 @@ +import java.awt.*; + +public class SimpleMap extends AbstractMap{ + + private Color barrierColor = Color.BLACK; + private Color roadColor = Color.GRAY; + + @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(Graphics2D g, int i, int j) + { + g.setPaint(roadColor); + g.fillRect((int)Math.floor(i * _size_x), (int)Math.floor(j * _size_y), (int)Math.ceil(_size_x), (int)Math.ceil(_size_y)); + } + @Override + protected void DrawBarrierPart(Graphics2D g, int i, int j) + { + g.setPaint(barrierColor); + g.fillRect((int)Math.floor(i * _size_x), (int)Math.floor(j * _size_y), (int)Math.ceil(_size_x), (int)Math.ceil(_size_y)); + } +}