From 61e999b0119bf34a325db1ab68dbd5a87cc49291 Mon Sep 17 00:00:00 2001 From: ChangedRuby Date: Mon, 3 Feb 2025 18:51:19 -0300 Subject: [PATCH 1/5] 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 2/5] 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 3/5] 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 4/5] 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 5/5] 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(); } }