diff --git a/src/windowInterface/MyInterface.java b/src/windowInterface/MyInterface.java index 23b78f5..991ad6b 100644 --- a/src/windowInterface/MyInterface.java +++ b/src/windowInterface/MyInterface.java @@ -1,268 +1,296 @@ package windowInterface; + import java.awt.BorderLayout; -import java.awt.Dimension; import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JPanel; -import javax.swing.SwingConstants; import javax.swing.border.EmptyBorder; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; +import javax.swing.SwingUtilities; import backend.Game; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JLabel; +import javax.swing.JCheckBox; import java.awt.event.ActionListener; +import java.awt.event.ActionEvent; import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Arrays; import java.util.LinkedList; -import java.awt.event.ActionEvent; -import javax.swing.JList; -import javax.swing.AbstractListModel; -import javax.swing.JToggleButton; -import javax.swing.JRadioButton; -import javax.swing.JCheckBox; public class MyInterface extends JFrame { - private static final long serialVersionUID = -6840815447618468846L; - private JPanel contentPane; - private JLabel turnLabel; - private JLabel borderLabel; - private JLabel speedLabel; - private JPanelChessBoard panelDraw; - private Game game; - private JLabel actionLabel; - private JCheckBox chckbxBlackAI; - private JCheckBox chckbxWhiteAI; + private static final long serialVersionUID = -6840815447618468846L; + private JPanel contentPane; + private JLabel turnLabel; + private JLabel borderLabel; + private JLabel speedLabel; + private JPanelChessBoard panelDraw; + private Game game; + private JLabel actionLabel; + private JCheckBox chckbxBlackAI; + private JCheckBox chckbxWhiteAI; - /** - * Create the frame. - */ - public MyInterface() { - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setBounds(10, 10, 650, 650); - contentPane = new JPanel(); - contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); - contentPane.setLayout(new BorderLayout(0, 0)); - setContentPane(contentPane); + /** + * Create the frame. + */ + public MyInterface() { + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setBounds(10, 10, 650, 650); + contentPane = new JPanel(); + contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); + contentPane.setLayout(new BorderLayout(0, 0)); + setContentPane(contentPane); - JPanel panelTop = new JPanel(); - contentPane.add(panelTop, BorderLayout.NORTH); - JPanel panelRight = new JPanel(); - contentPane.add(panelRight, BorderLayout.EAST); - panelRight.setLayout(new GridLayout(4,1)); - + JPanel panelTop = new JPanel(); + contentPane.add(panelTop, BorderLayout.NORTH); + JPanel panelRight = new JPanel(); + contentPane.add(panelRight, BorderLayout.EAST); + panelRight.setLayout(new GridLayout(4, 1)); - actionLabel = new JLabel("Waiting For Start"); - panelTop.add(actionLabel); + actionLabel = new JLabel("Waiting For Start"); + panelTop.add(actionLabel); - JButton btnGo = new JButton("Start/Restart"); - btnGo.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent arg0) { - clicButtonStart(); - } - }); - panelTop.add(btnGo); + JButton btnGo = new JButton("Start/Restart"); + btnGo.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + clicButtonStart(); + } + }); + panelTop.add(btnGo); - turnLabel = new JLabel("Turn : X"); - panelTop.add(turnLabel); - - JButton btnLoad = new JButton("Load File"); - btnLoad.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent arg0) { - clicLoadFileButton(); - } - }); - panelRight.add(btnLoad); + turnLabel = new JLabel("Turn : X"); + panelTop.add(turnLabel); - JButton btnSave = new JButton("Save To File"); - btnSave.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent arg0) { - clicSaveToFileButton(); - } - }); - panelRight.add(btnSave); + JButton btnLoad = new JButton("Load File"); + btnLoad.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + clicLoadFileButton(); + } + }); + panelRight.add(btnLoad); - JButton btnAdder = new JButton("Add Piece"); - btnAdder.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent arg0) { - clickButtonAdder(); - } - }); - panelRight.add(btnAdder); - - JButton btnPieceSelector = new JButton("Piece Select"); - btnPieceSelector.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent arg0) { - clickButtonSelector(); - } - }); - panelRight.add(btnPieceSelector); + JButton btnSave = new JButton("Save To File"); + btnSave.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + clicSaveToFileButton(); + } + }); + panelRight.add(btnSave); - JButton btnUndo = new JButton("Undo"); - btnUndo.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent arg0) { - clicUndoButton(); - } + JButton btnAdder = new JButton("Add Piece"); + btnAdder.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + clickButtonAdder(); + } + }); + panelRight.add(btnAdder); - }); - panelTop.add(btnUndo); - - chckbxWhiteAI = new JCheckBox("WhiteAI"); - chckbxWhiteAI.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent arg0) { - clicAIToggle(true); - } + JButton btnPieceSelector = new JButton("Piece Select"); + btnPieceSelector.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + clickButtonSelector(); + } + }); + panelRight.add(btnPieceSelector); - }); - panelTop.add(chckbxWhiteAI); - - chckbxBlackAI = new JCheckBox("BlackAI"); - chckbxBlackAI.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent arg0) { - clicAIToggle(false); - } + JButton btnUndo = new JButton("Undo"); + btnUndo.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + clicUndoButton(); + } + }); + panelTop.add(btnUndo); - }); - panelTop.add(chckbxBlackAI); + chckbxWhiteAI = new JCheckBox("WhiteAI"); + chckbxWhiteAI.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + clicAIToggle(true); + } + }); + panelTop.add(chckbxWhiteAI); - panelDraw = new JPanelChessBoard(this); - contentPane.add(panelDraw, BorderLayout.CENTER); - } + chckbxBlackAI = new JCheckBox("BlackAI"); + chckbxBlackAI.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + clicAIToggle(false); + } + }); + panelTop.add(chckbxBlackAI); - public void setStepBanner(String s) { - turnLabel.setText(s); - } + panelDraw = new JPanelChessBoard(this); + contentPane.add(panelDraw, BorderLayout.CENTER); + } - public void setBorderBanner(String s) { - borderLabel.setText(s); - } + public void setStepBanner(String s) { + turnLabel.setText(s); + } - public JPanelChessBoard getPanelDessin() { - return panelDraw; - } - - public void instantiateSimu() { - if(game==null) { - game = new Game(this); - panelDraw.setGame(game); - game.start(); - } - } + public void setBorderBanner(String s) { + borderLabel.setText(s); + } - public void clicButtonStart() { - this.instantiateSimu(); - } - - public void clickButtonAdder() { - panelDraw.toggleAdderMode(); - } - public void clickButtonSelector() { - panelDraw.togglePieceSelector(); - } + public JPanelChessBoard getPanelDessin() { + return panelDraw; + } - private void clicUndoButton() { - if(game == null) { - System.out.println("error : can't undo while no game present"); - } else { - game.undoLastMove(); - } + public void instantiateSimu() { + // If a game already exists, stop it cleanly + if (game != null) { + // Disable AI to prevent interference + if (chckbxWhiteAI.isSelected()) { + game.toggleAI(true); + chckbxWhiteAI.setSelected(false); + } + if (chckbxBlackAI.isSelected()) { + game.toggleAI(false); + chckbxBlackAI.setSelected(false); + } - } - public void clicAIToggle(boolean isWhite) { - if(game == null) { - System.out.println("error : can't activate AI while no game present"); - if(isWhite) { - chckbxWhiteAI.setSelected(false); - }else { - chckbxBlackAI.setSelected(false); - } - } else { - game.toggleAI(isWhite); - } - } - - public void clicLoadFileButton() { - Game loadedSim = new Game(this); - String fileName=SelectFile(); - LinkedList lines = new LinkedList(); - if (fileName.length()>0) { - try { - BufferedReader fileContent = new BufferedReader(new FileReader(fileName)); - String line = fileContent.readLine(); - int colorID = 0; - while (line != null) { - lines.add(line); - line = fileContent.readLine(); - } - loadedSim.setBoard(Arrays.stream(lines.toArray()).map(Object::toString).toArray(String[]::new)); - fileContent.close(); - } catch (Exception e) { - e.printStackTrace(); - } - game = loadedSim; - panelDraw.setGame(game); - this.repaint(); - } - } + // Interrupt the game thread + game.interrupt(); + try { + game.join(); // Wait for the thread to fully stop + } catch (InterruptedException e) { + System.err.println("Interrupted while waiting for game thread to stop: " + e.getMessage()); + Thread.currentThread().interrupt(); // Restore interrupted status + } + } - public void clicSaveToFileButton() { - String fileName=SelectFile(); - if (fileName.length()>0) { - String[] content = game.getFileRepresentation(); - writeFile(fileName, content); - } - } - - public String SelectFile() { - String s; - JFileChooser chooser = new JFileChooser(); - chooser.setCurrentDirectory(new java.io.File(".")); - chooser.setDialogTitle("Choose a file"); - chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); - chooser.setAcceptAllFileFilterUsed(true); - if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { - s=chooser.getSelectedFile().toString(); - } else { - System.out.println("No Selection "); - s=""; - } - return s; - } - - public void writeFile(String fileName, String[] content) { - FileWriter csvWriter; - try { - csvWriter = new FileWriter(fileName); - for (String row : content) { - csvWriter.append(row); - csvWriter.append("\n"); - } - csvWriter.flush(); - csvWriter.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public void update(int turnCount, boolean turnIsWhite) { - turnLabel.setText("Turn : "+turnCount+", "+ (turnIsWhite?"White":"Black")); - actionLabel.setText(panelDraw.isPieceAdderMode()?"Adding Piece": - (panelDraw.isPieceSelectorMode()?"Selecting Piece to Add": - "Playing")); - this.repaint(); - } - - public void eraseLabels() { - this.setStepBanner("Turn : X"); - } + // Reset UI state + if (panelDraw.isPieceAdderMode()) { + panelDraw.toggleAdderMode(); + } + if (panelDraw.isPieceSelectorMode()) { + panelDraw.togglePieceSelector(); + } -} + // Create a new game + game = new Game(this); + panelDraw.setGame(game); + + // Reset the board to the default setup + game.setDefaultSetup(); + + // Start the new game thread on the EDT to ensure synchronization + SwingUtilities.invokeLater(() -> { + game.start(); + // Force an immediate UI update + panelDraw.repaint(); + update(game.getTurnNumber(), game.isWhiteTurn()); + }); + } + + public void clicButtonStart() { + this.instantiateSimu(); + } + + public void clickButtonAdder() { + panelDraw.toggleAdderMode(); + } + + public void clickButtonSelector() { + panelDraw.togglePieceSelector(); + } + + private void clicUndoButton() { + if (game == null) { + System.out.println("error: can't undo while no game present"); + } else { + game.undoLastMove(); + } + } + + public void clicAIToggle(boolean isWhite) { + if (game == null) { + System.out.println("error: can't activate AI while no game present"); + if (isWhite) { + chckbxWhiteAI.setSelected(false); + } else { + chckbxBlackAI.setSelected(false); + } + } else { + game.toggleAI(isWhite); + } + } + + public void clicLoadFileButton() { + Game loadedSim = new Game(this); + String fileName = SelectFile(); + LinkedList lines = new LinkedList(); + if (fileName.length() > 0) { + try { + BufferedReader fileContent = new BufferedReader(new FileReader(fileName)); + String line = fileContent.readLine(); + int colorID = 0; + while (line != null) { + lines.add(line); + line = fileContent.readLine(); + } + loadedSim.setBoard(Arrays.stream(lines.toArray()).map(Object::toString).toArray(String[]::new)); + fileContent.close(); + } catch (Exception e) { + e.printStackTrace(); + } + game = loadedSim; + panelDraw.setGame(game); + this.repaint(); + } + } + + public void clicSaveToFileButton() { + String fileName = SelectFile(); + if (fileName.length() > 0) { + String[] content = game.getFileRepresentation(); + writeFile(fileName, content); + } + } + + public String SelectFile() { + String s; + JFileChooser chooser = new JFileChooser(); + chooser.setCurrentDirectory(new java.io.File(".")); + chooser.setDialogTitle("Choose a file"); + chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); + chooser.setAcceptAllFileFilterUsed(true); + if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { + s = chooser.getSelectedFile().toString(); + } else { + System.out.println("No Selection "); + s = ""; + } + return s; + } + + public void writeFile(String fileName, String[] content) { + FileWriter csvWriter; + try { + csvWriter = new FileWriter(fileName); + for (String row : content) { + csvWriter.append(row); + csvWriter.append("\n"); + } + csvWriter.flush(); + csvWriter.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void update(int turnCount, boolean turnIsWhite) { + turnLabel.setText("Turn: " + turnCount + ", " + (turnIsWhite ? "White" : "Black")); + actionLabel.setText(panelDraw.isPieceAdderMode() ? "Adding Piece" : + (panelDraw.isPieceSelectorMode() ? "Selecting Piece to Add" : "Playing")); + this.repaint(); + } + + public void eraseLabels() { + this.setStepBanner("Turn: X"); + } +} \ No newline at end of file