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/GameScreen.java b/src/GameScreen.java index 8607333..b0caddb 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){ @@ -163,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); @@ -216,6 +214,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 +314,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]); } } @@ -423,6 +432,10 @@ public void componentResized(ComponentEvent e) { } + public void dispose(){ + frame.dispose(); + } + @Override public void componentMoved(ComponentEvent e) { @@ -437,4 +450,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 b24028d..c47ab47 100644 --- a/src/MainScreen.java +++ b/src/MainScreen.java @@ -1,25 +1,77 @@ 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 startButton = new JButton("Start"); + private JLabel titleLabel = new JLabel("Minesweeper"); + 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"); + public JLabel bLabel = new JLabel("Bombs: "); + public JTextField bField = new JTextField(); + public static GameScreen activeThread; 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,200)); + titleLabel.setFont(new Font("Arial", Font.BOLD, 24)); + titleLabel.setHorizontalAlignment(JLabel.CENTER); + titleLabel.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)); + //startButton.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); + cSlider.addChangeListener(this); + + 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); + 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()); + cLabel.setText("Cols: " + cSlider.getValue()); + + bField.setPreferredSize(new Dimension(50,20)); + bField.setText("20"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("Minesweeper"); @@ -32,24 +84,52 @@ 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(myButton, c); + frame.add(rLabel, c); + c.gridy = 2; + frame.add(rSlider, c); + c.gridy = 3; + 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); } @Override public void actionPerformed(ActionEvent e) { - if(e.getSource() == myButton){ - - GameScreen myScreen = new GameScreen(20,10,20); + if(e.getSource() == startButton){ + + 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(); } } + + @Override + public void stateChanged(ChangeEvent e) { + if(e.getSource() == rSlider || e.getSource() == cSlider){ + rLabel.setText("Rows: " + rSlider.getValue()); + cLabel.setText("Cols: " + cSlider.getValue()); + } + } }