From 594d9f2cf30f697a14677ece06ec9f7863dff164 Mon Sep 17 00:00:00 2001 From: ChangedRuby Date: Sat, 1 Feb 2025 21:25:58 -0300 Subject: [PATCH 01/11] Clicking on a bomb now show all bomb tiles and changed the sprites path to their own directory. --- bomb.svg | 52 ------------------ sprites/bomb_icon.png | Bin 0 -> 4273 bytes green_button.png => sprites/green_button.png | Bin .../minesweeper_flag.png | Bin src/GameScreen.java | 48 +++++++++++++--- src/MainScreen.java | 2 +- 6 files changed, 42 insertions(+), 60 deletions(-) delete mode 100644 bomb.svg create mode 100644 sprites/bomb_icon.png rename green_button.png => sprites/green_button.png (100%) rename minesweeper_flag.png => sprites/minesweeper_flag.png (100%) diff --git a/bomb.svg b/bomb.svg deleted file mode 100644 index b9c1efe..0000000 --- a/bomb.svg +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - diff --git a/sprites/bomb_icon.png b/sprites/bomb_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5324cf04ce2b4e1f00f377cf5de4dde284885ad6 GIT binary patch literal 4273 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 checkedNeighbours = this.getNeighbours(pressedX,pressedY, 1); currentButton.setBombsAround(this.checkAmtBombsAround(pressedX, pressedY, 1)); - currentButton.setBackground(Color.decode(grass_colours[((currentButton.getbX() + currentButton.getbY()) % 2) + 2])); - currentButton.setIcon(null); if(!currentButton.isBomb()){ + currentButton.setBackground(Color.decode(grass_colours[((currentButton.getbX() + currentButton.getbY()) % 2) + 2])); currentButton.setForeground(Color.decode(font_colours[currentButton.getBombsAround()])); + currentButton.setIcon(null); } for(int i = 0; i < checkedNeighbours.size(); i++){ @@ -212,8 +215,9 @@ public void checkForBombs(int pressedX, int pressedY, GameButton currentButton){ } if(currentButton.isBomb()){ - currentButton.setText("B"); - currentButton.setBackground(Color.RED); + if(!currentButton.isChecked()){ + this.showAllBombs(); + } } else{ if(currentButton.getBombsAround() == 0){ currentButton.setText(" "); @@ -237,6 +241,33 @@ public int checkAmtBombsAround(int x, int y, int radius){ return bombCount; } + public void showBomb(GameButton button){ + + int rng = rand.nextInt(9); + currentButton = button; + currentButton.setText(""); + currentButton.setBackground(Color.decode(font_colours[rng])); + + try{ + imageMaster = ImageIO.read(new File("sprites/bomb_icon.png")); + } catch(Exception e){ + e.printStackTrace(); + } + currentButton.setChecked(true); + currentButton.setIcon(new ImageIcon(imageMaster.getScaledInstance(Math.min(currentButton.getSize().width,currentButton.getSize().height), Math.min(currentButton.getSize().width,currentButton.getSize().height), Image.SCALE_SMOOTH))); + + } + + public void showAllBombs(){ + for(int i = 0; i < sizeX; i++){ + for(int j = 0; j < sizeY; j++){ + if(buttons[i][j].isBomb()){ + this.showBomb(buttons[i][j]); + } + } + } + } + public ArrayList getNeighbours(int x, int y, int radius){ //int count = 0; ArrayList neighbours = new ArrayList<>(); @@ -380,12 +411,15 @@ public void componentResized(ComponentEvent e) { if(imageMaster != null){ imageScaled = imageMaster.getScaledInstance(size.width, size.height, Image.SCALE_SMOOTH); } - //currentButton.setPreferredSize(new Dimension(size.width, size.height)); + if(currentButton.isFlagged() && !currentButton.isChecked() && currentButton.getIcon().getIconHeight() != imageScaled.getHeight(null) && currentButton.getIcon().getIconWidth() != imageScaled.getWidth(null)){ currentButton.setIcon(new ImageIcon(imageScaled)); } + if(currentButton.isChecked() && currentButton.isBomb()){ + currentButton.setIcon(new ImageIcon(imageScaled)); + } } diff --git a/src/MainScreen.java b/src/MainScreen.java index 00eb6d7..b24028d 100644 --- a/src/MainScreen.java +++ b/src/MainScreen.java @@ -48,7 +48,7 @@ public MainScreen() { public void actionPerformed(ActionEvent e) { if(e.getSource() == myButton){ - GameScreen myScreen = new GameScreen(5,5,23); + GameScreen myScreen = new GameScreen(20,10,20); frame.dispose(); } } From 44dc5255fd913594ad8ad1c46e40b8714f07ae41 Mon Sep 17 00:00:00 2001 From: ChangedRuby Date: Sat, 1 Feb 2025 21:43:03 -0300 Subject: [PATCH 02/11] Changed main directory name --- .idea/artifacts/java_Minesweeper_jar.xml | 8 ++++++++ .idea/compiler.xml | 2 +- .idea/modules.xml | 2 +- javaframe.iml => Java Minesweeper.iml | 0 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 .idea/artifacts/java_Minesweeper_jar.xml rename javaframe.iml => Java Minesweeper.iml (100%) diff --git a/.idea/artifacts/java_Minesweeper_jar.xml b/.idea/artifacts/java_Minesweeper_jar.xml new file mode 100644 index 0000000..62dc897 --- /dev/null +++ b/.idea/artifacts/java_Minesweeper_jar.xml @@ -0,0 +1,8 @@ + + + $PROJECT_DIR$/out/artifacts/java_Minesweeper_jar + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 872fbfb..1d91a09 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -2,7 +2,7 @@ \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 2f7d6a5..52a5485 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/javaframe.iml b/Java Minesweeper.iml similarity index 100% rename from javaframe.iml rename to Java Minesweeper.iml From 61e999b0119bf34a325db1ab68dbd5a87cc49291 Mon Sep 17 00:00:00 2001 From: ChangedRuby Date: Mon, 3 Feb 2025 18:51:19 -0300 Subject: [PATCH 03/11] Added sliders to select the row and collumn count, not yet functional. --- .idea/artifacts/java_Minesweeper_jar.xml | 2 +- src/MainScreen.java | 63 +++++++++++++++++++++--- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/.idea/artifacts/java_Minesweeper_jar.xml b/.idea/artifacts/java_Minesweeper_jar.xml index 62dc897..9049cf3 100644 --- a/.idea/artifacts/java_Minesweeper_jar.xml +++ b/.idea/artifacts/java_Minesweeper_jar.xml @@ -1,7 +1,7 @@ $PROJECT_DIR$/out/artifacts/java_Minesweeper_jar - + diff --git a/src/MainScreen.java b/src/MainScreen.java index b24028d..5bec896 100644 --- a/src/MainScreen.java +++ b/src/MainScreen.java @@ -1,14 +1,21 @@ import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.Hashtable; -public class MainScreen implements ActionListener { +public class MainScreen implements ActionListener, ChangeListener { - public JFrame frame = new JFrame(); - public GridBagConstraints c = new GridBagConstraints(); - public JButton myButton = new JButton("Start"); - public JLabel myLabel = new JLabel("Minesweeper"); + private JFrame frame = new JFrame(); + private GridBagConstraints c = new GridBagConstraints(); + private JButton myButton = new JButton("Start"); + private JLabel myLabel = new JLabel("Minesweeper"); + public JSlider rSlider = new JSlider(JSlider.HORIZONTAL,5,100,20); + public JSlider cSlider = new JSlider(JSlider.HORIZONTAL,5,100,20); + public JLabel rowLabel = new JLabel(); + public JLabel colLabel = new JLabel(); public MainScreen() { @@ -19,7 +26,36 @@ public MainScreen() { myLabel.setFont(new Font("Arial", Font.BOLD, 24)); myLabel.setHorizontalAlignment(JLabel.CENTER); - myLabel.setPreferredSize(new Dimension(200,200)); + myLabel.setPreferredSize(new Dimension(200,100)); + + rSlider.setPaintTicks(true); + rSlider.setPaintLabels(true); + rSlider.setPaintTrack(true); + cSlider.setPaintTicks(true); + cSlider.setPaintLabels(true); + cSlider.setPaintTrack(true); + + rSlider.setMajorTickSpacing(95); + rSlider.setMinorTickSpacing(5); + cSlider.setMajorTickSpacing(95); + cSlider.setMinorTickSpacing(5); + //rSlider.setPreferredSize(new Dimension(1000,200)); + //cSlider.setPreferredSize(new Dimension(1000,200)); + //myButton.setPreferredSize(new Dimension(200,100)); + + Hashtable labelTable = new Hashtable(); + labelTable.put(5, new JLabel("5")); + labelTable.put(50, new JLabel("50")); + labelTable.put(100, new JLabel("100")); + rSlider.setLabelTable(labelTable); + cSlider.setLabelTable(labelTable); + + rSlider.addChangeListener(this); + + rowLabel.setFont(new Font("Arial", Font.PLAIN, 24)); + rowLabel.setPreferredSize(new Dimension(1000,10)); + rowLabel.setSize(1000,10); + rowLabel.setHorizontalAlignment(JLabel.LEFT); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("Minesweeper"); @@ -38,9 +74,13 @@ public MainScreen() { c.anchor = GridBagConstraints.CENTER; frame.add(myLabel, c); - c.gridy = 1; - + //frame.add(rowLabel, c); + c.gridy = 1; + frame.add(rSlider, c); + c.gridy = 2; + frame.add(cSlider, c); + c.gridy = 3; frame.add(myButton, c); } @@ -52,4 +92,11 @@ public void actionPerformed(ActionEvent e) { frame.dispose(); } } + + @Override + public void stateChanged(ChangeEvent e) { + if(e.getSource() == rSlider){ + rowLabel.setText("Rows: " + rSlider.getValue()); + } + } } From f8bbe8f7293b99561f1c7e424ed55c1a4525a685 Mon Sep 17 00:00:00 2001 From: ChangedRuby Date: Mon, 3 Feb 2025 22:07:48 -0300 Subject: [PATCH 04/11] Added text to the sliders and a text field to customize the amount of bombs. Filter for only numbers in the bombs text field to be added later. --- src/MainScreen.java | 72 +++++++++++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/src/MainScreen.java b/src/MainScreen.java index 5bec896..cd7be53 100644 --- a/src/MainScreen.java +++ b/src/MainScreen.java @@ -10,23 +10,24 @@ public class MainScreen implements ActionListener, ChangeListener { private JFrame frame = new JFrame(); private GridBagConstraints c = new GridBagConstraints(); - private JButton myButton = new JButton("Start"); - private JLabel myLabel = new JLabel("Minesweeper"); + private JButton startButton = new JButton("Start"); + private JLabel titleLabel = new JLabel("Minesweeper"); public JSlider rSlider = new JSlider(JSlider.HORIZONTAL,5,100,20); public JSlider cSlider = new JSlider(JSlider.HORIZONTAL,5,100,20); - public JLabel rowLabel = new JLabel(); - public JLabel colLabel = new JLabel(); + public JLabel rLabel = new JLabel("Row"); + public JLabel cLabel = new JLabel("Collumn"); + JTextField bField = new JTextField(); public MainScreen() { - myButton.setBounds(160,160,100,50); - myButton.setPreferredSize(new Dimension(160,80)); - myButton.setFocusable(false); - myButton.addActionListener(this); + startButton.setBounds(160,160,100,50); + startButton.setPreferredSize(new Dimension(160,80)); + startButton.setFocusable(false); + startButton.addActionListener(this); - myLabel.setFont(new Font("Arial", Font.BOLD, 24)); - myLabel.setHorizontalAlignment(JLabel.CENTER); - myLabel.setPreferredSize(new Dimension(200,100)); + titleLabel.setFont(new Font("Arial", Font.BOLD, 24)); + titleLabel.setHorizontalAlignment(JLabel.CENTER); + titleLabel.setPreferredSize(new Dimension(200,100)); rSlider.setPaintTicks(true); rSlider.setPaintLabels(true); @@ -41,7 +42,7 @@ public MainScreen() { cSlider.setMinorTickSpacing(5); //rSlider.setPreferredSize(new Dimension(1000,200)); //cSlider.setPreferredSize(new Dimension(1000,200)); - //myButton.setPreferredSize(new Dimension(200,100)); + //startButton.setPreferredSize(new Dimension(200,100)); Hashtable labelTable = new Hashtable(); labelTable.put(5, new JLabel("5")); @@ -51,11 +52,21 @@ public MainScreen() { cSlider.setLabelTable(labelTable); rSlider.addChangeListener(this); + cSlider.addChangeListener(this); - rowLabel.setFont(new Font("Arial", Font.PLAIN, 24)); - rowLabel.setPreferredSize(new Dimension(1000,10)); - rowLabel.setSize(1000,10); - rowLabel.setHorizontalAlignment(JLabel.LEFT); + rLabel.setFont(new Font("Arial", Font.PLAIN, 12)); + rLabel.setPreferredSize(new Dimension(200,20)); + rLabel.setHorizontalAlignment(JLabel.LEFT); + cLabel.setFont(new Font("Arial", Font.PLAIN, 12)); + cLabel.setPreferredSize(new Dimension(200,20)); + cLabel.setHorizontalAlignment(JLabel.LEFT); + + // sets the texts of the sliders to their value + rLabel.setText("Rows: " + rSlider.getValue()); + cLabel.setText("Cols: " + cSlider.getValue()); + + bField.setPreferredSize(new Dimension(50,20)); + bField.setText("50"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("Minesweeper"); @@ -68,35 +79,40 @@ public MainScreen() { c.gridy = 0; c.ipadx = 0; c.ipady = 2; - c.weightx = 1.0; - c.weighty = 1.0; + c.weightx = 0; + c.weighty = 0; c.fill = GridBagConstraints.NONE; c.anchor = GridBagConstraints.CENTER; - frame.add(myLabel, c); + frame.add(titleLabel, c); c.gridy = 1; - //frame.add(rowLabel, c); - c.gridy = 1; - frame.add(rSlider, c); + frame.add(rLabel, c); c.gridy = 2; - frame.add(cSlider, c); + frame.add(rSlider, c); c.gridy = 3; - frame.add(myButton, c); + frame.add(cLabel, c); + c.gridy = 4; + frame.add(cSlider, c); + c.gridy = 5; + frame.add(bField, c); + c.gridy = 6; + frame.add(startButton, c); } @Override public void actionPerformed(ActionEvent e) { - if(e.getSource() == myButton){ + if(e.getSource() == startButton){ - GameScreen myScreen = new GameScreen(20,10,20); + GameScreen myScreen = new GameScreen(rSlider.getValue(),cSlider.getValue(),Integer.parseInt(bField.getText())); frame.dispose(); } } @Override public void stateChanged(ChangeEvent e) { - if(e.getSource() == rSlider){ - rowLabel.setText("Rows: " + rSlider.getValue()); + if(e.getSource() == rSlider || e.getSource() == cSlider){ + rLabel.setText("Rows: " + rSlider.getValue()); + cLabel.setText("Cols: " + cSlider.getValue()); } } } From dd5a9c5071356797cc79c7b6a4cd7b7018a2fcac Mon Sep 17 00:00:00 2001 From: ChangedRuby Date: Thu, 6 Feb 2025 13:27:43 -0300 Subject: [PATCH 05/11] Added new options to the mainScreen. --- src/GameScreen.java | 30 ++++++++++++++++++++---------- src/MainScreen.java | 12 +++++++----- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/GameScreen.java b/src/GameScreen.java index 8607333..73ba40b 100644 --- a/src/GameScreen.java +++ b/src/GameScreen.java @@ -8,7 +8,7 @@ import java.util.ArrayList; import java.util.Random; -public class GameScreen implements ActionListener, MouseListener, ComponentListener { +public class GameScreen implements ActionListener, MouseListener, ComponentListener, Runnable { public JFrame frame = new JFrame(); public GridBagConstraints c = new GridBagConstraints(); @@ -108,12 +108,6 @@ public GameScreen(int sizeX, int sizeY, int bombDensity){ } else{ System.out.println("Too many bombs!"); } - - /* - System.out.println(GameButton.amtBtn); - System.out.println(GameButton.amtBomb); - System.out.println(GameButton.amtChecked); - */ } private void placeBombs(int bombDensity){ @@ -216,6 +210,19 @@ public void checkForBombs(int pressedX, int pressedY, GameButton currentButton){ if(currentButton.isBomb()){ if(!currentButton.isChecked()){ + + Thread loseThread = new Thread(() -> { + try { + Thread.sleep(2000); + System.out.println("Thread awoken"); + + MainScreen mainScreen = new MainScreen(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + }); + loseThread.start(); + this.showAllBombs(); } } else{ @@ -303,9 +310,7 @@ public ArrayList getNeighbours(int x, int y, int radius){ checkY = sizeY-1; } - if(checkX == x && checkY == y){ - - } else{ + if(checkX != x || checkY != y){ neighbours.add(buttons[checkX][checkY]); } } @@ -437,4 +442,9 @@ public void componentShown(ComponentEvent e) { public void componentHidden(ComponentEvent e) { } + + @Override + public void run() { + System.out.println("Runnable started"); + } } diff --git a/src/MainScreen.java b/src/MainScreen.java index cd7be53..7e13e4c 100644 --- a/src/MainScreen.java +++ b/src/MainScreen.java @@ -12,8 +12,8 @@ public class MainScreen implements ActionListener, ChangeListener { private GridBagConstraints c = new GridBagConstraints(); private JButton startButton = new JButton("Start"); private JLabel titleLabel = new JLabel("Minesweeper"); - public JSlider rSlider = new JSlider(JSlider.HORIZONTAL,5,100,20); - public JSlider cSlider = new JSlider(JSlider.HORIZONTAL,5,100,20); + public JSlider rSlider = new JSlider(JSlider.HORIZONTAL,5,100,15); + public JSlider cSlider = new JSlider(JSlider.HORIZONTAL,5,100,15); public JLabel rLabel = new JLabel("Row"); public JLabel cLabel = new JLabel("Collumn"); JTextField bField = new JTextField(); @@ -66,7 +66,7 @@ public MainScreen() { cLabel.setText("Cols: " + cSlider.getValue()); bField.setPreferredSize(new Dimension(50,20)); - bField.setText("50"); + bField.setText("20"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("Minesweeper"); @@ -102,8 +102,10 @@ public MainScreen() { @Override public void actionPerformed(ActionEvent e) { if(e.getSource() == startButton){ - - GameScreen myScreen = new GameScreen(rSlider.getValue(),cSlider.getValue(),Integer.parseInt(bField.getText())); + + //GameScreen myScreen = new GameScreen(rSlider.getValue(),cSlider.getValue(),Integer.parseInt(bField.getText())); + Thread thread = new Thread(new GameScreen(rSlider.getValue(),cSlider.getValue(),Integer.parseInt(bField.getText()))); + thread.start(); frame.dispose(); } } From d4b58a4983a17dc8f63cc892ef7e31be19bb5578 Mon Sep 17 00:00:00 2001 From: ChangedRuby Date: Thu, 6 Feb 2025 14:38:28 -0300 Subject: [PATCH 06/11] Added new error checks and losing now creates a new thread that waits 2 seconds to spawn the mainScreen frame --- src/GameScreen.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/GameScreen.java b/src/GameScreen.java index 73ba40b..a6548ce 100644 --- a/src/GameScreen.java +++ b/src/GameScreen.java @@ -157,14 +157,18 @@ public void actionPerformed(ActionEvent e) { } // check neighbour tiles to count bombs - this.checkForBombs(pressedX, pressedY, currentButton); + try{ + this.checkForBombs(pressedX, pressedY, currentButton); + } catch (StackOverflowError err){ + System.out.println("Stack overflow error"); + } currentButton.setChecked(true); this.checkWinCondition(); } } - public void checkForBombs(int pressedX, int pressedY, GameButton currentButton){ + public void checkForBombs(int pressedX, int pressedY, GameButton currentButton) throws StackOverflowError{ ArrayList checkedNeighbours = this.getNeighbours(pressedX,pressedY, 1); From 41666e0c5924aa2df700f1f348f020fa629fe2b7 Mon Sep 17 00:00:00 2001 From: ChangedRuby Date: Thu, 6 Feb 2025 22:55:48 -0300 Subject: [PATCH 07/11] Restarting the game now closes the original window and added a label for the mines field. --- src/GameScreen.java | 4 ++++ src/MainScreen.java | 21 ++++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/GameScreen.java b/src/GameScreen.java index a6548ce..b0caddb 100644 --- a/src/GameScreen.java +++ b/src/GameScreen.java @@ -432,6 +432,10 @@ public void componentResized(ComponentEvent e) { } + public void dispose(){ + frame.dispose(); + } + @Override public void componentMoved(ComponentEvent e) { diff --git a/src/MainScreen.java b/src/MainScreen.java index 7e13e4c..c47ab47 100644 --- a/src/MainScreen.java +++ b/src/MainScreen.java @@ -16,7 +16,9 @@ public class MainScreen implements ActionListener, ChangeListener { public JSlider cSlider = new JSlider(JSlider.HORIZONTAL,5,100,15); public JLabel rLabel = new JLabel("Row"); public JLabel cLabel = new JLabel("Collumn"); - JTextField bField = new JTextField(); + public JLabel bLabel = new JLabel("Bombs: "); + public JTextField bField = new JTextField(); + public static GameScreen activeThread; public MainScreen() { @@ -60,6 +62,9 @@ public MainScreen() { cLabel.setFont(new Font("Arial", Font.PLAIN, 12)); cLabel.setPreferredSize(new Dimension(200,20)); cLabel.setHorizontalAlignment(JLabel.LEFT); + bLabel.setFont(new Font("Arial", Font.PLAIN, 12)); + bLabel.setPreferredSize(new Dimension(200,20)); + bLabel.setHorizontalAlignment(JLabel.LEFT); // sets the texts of the sliders to their value rLabel.setText("Rows: " + rSlider.getValue()); @@ -93,7 +98,10 @@ public MainScreen() { frame.add(cLabel, c); c.gridy = 4; frame.add(cSlider, c); + c.gridx = -1; c.gridy = 5; + frame.add(bLabel, c); + c.gridx = 0; frame.add(bField, c); c.gridy = 6; frame.add(startButton, c); @@ -103,9 +111,16 @@ public MainScreen() { public void actionPerformed(ActionEvent e) { if(e.getSource() == startButton){ - //GameScreen myScreen = new GameScreen(rSlider.getValue(),cSlider.getValue(),Integer.parseInt(bField.getText())); - Thread thread = new Thread(new GameScreen(rSlider.getValue(),cSlider.getValue(),Integer.parseInt(bField.getText()))); + if(MainScreen.activeThread != null){ + MainScreen.activeThread.dispose(); + } + + GameScreen myScreen = new GameScreen(rSlider.getValue(),cSlider.getValue(),Integer.parseInt(bField.getText())); + Thread thread = new Thread( + myScreen + ); thread.start(); + MainScreen.activeThread = myScreen; frame.dispose(); } } From d7fa0295bc5748b3a7ef9e0b7bb13669da76f194 Mon Sep 17 00:00:00 2001 From: ChangedRuby <65453800+ChangedRuby@users.noreply.github.com> Date: Sat, 8 Feb 2025 13:19:47 -0300 Subject: [PATCH 08/11] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bc2aeac..b610390 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ -A Minesweeper clone made in java. +# **Java Minesweeper** +Java Minesweeper is a clone of the popular game Minesweeper made in Java, each time you play a new level is generated with the amount of tiles and bombs. From a1c209dfc7028e58116478c822b6c0ba7d71bf9c Mon Sep 17 00:00:00 2001 From: ChangedRuby <65453800+ChangedRuby@users.noreply.github.com> Date: Sat, 8 Feb 2025 13:20:03 -0300 Subject: [PATCH 09/11] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b610390..1d6a750 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ # **Java Minesweeper** -Java Minesweeper is a clone of the popular game Minesweeper made in Java, each time you play a new level is generated with the amount of tiles and bombs. +**Java Minesweeper** is a clone of the popular game Minesweeper made in Java, each time you play a new level is generated with the amount of tiles and bombs. From 5989813f394c12962bae6195524021d6d7fc6de6 Mon Sep 17 00:00:00 2001 From: ChangedRuby <65453800+ChangedRuby@users.noreply.github.com> Date: Sat, 8 Feb 2025 13:20:31 -0300 Subject: [PATCH 10/11] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 1d6a750..c7e7718 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,4 @@ # **Java Minesweeper** **Java Minesweeper** is a clone of the popular game Minesweeper made in Java, each time you play a new level is generated with the amount of tiles and bombs. + +![javaminesweeper_preview](https://github.com/user-attachments/assets/75dac897-e55d-4ac3-8682-345901766c30) From d1e9e82a1919fede8c040bbac618a25765076d46 Mon Sep 17 00:00:00 2001 From: ChangedRuby <65453800+ChangedRuby@users.noreply.github.com> Date: Sat, 8 Feb 2025 13:21:12 -0300 Subject: [PATCH 11/11] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c7e7718..b80024a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ # **Java Minesweeper** -**Java Minesweeper** is a clone of the popular game Minesweeper made in Java, each time you play a new level is generated with the amount of tiles and bombs. +**Java Minesweeper** is a clone of the popular game Minesweeper made in Java, each time you play a new level is generated with the selected amount of tiles and bombs. ![javaminesweeper_preview](https://github.com/user-attachments/assets/75dac897-e55d-4ac3-8682-345901766c30)