import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; /** * La classe SudokuCreator étend la classe SudokuUI et permet de créer des grilles de Sudoku. */ public class SudokuCreator extends SudokuUI { private static int numberOfClues = 25; // Nombre de "clues" par défaut /** * Constructeur de la classe SudokuCreator. * @param sudoku Instance de la classe Sudoku. */ public SudokuCreator(Sudoku sudoku) { super(sudoku); createAdditionalButtons(); } /** * Crée les boutons supplémentaires pour charger, générer et sauvegarder les grilles de Sudoku. */ protected void createAdditionalButtons() { createLoadButton(); createGenerateButton(); createSaveButton(); pack(); } /** * Crée le bouton pour charger une grille de Sudoku depuis un fichier. */ private void createLoadButton() { JButton loadButton = new JButton("Charger"); loadButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JFileChooser fileChooser = new JFileChooser(); FileNameExtensionFilter filter = new FileNameExtensionFilter("Fichiers de grille Sudoku (*.gri)", "gri"); fileChooser.setFileFilter(filter); int returnValue = fileChooser.showOpenDialog(null); if (returnValue == JFileChooser.APPROVE_OPTION) { File selectedFile = fileChooser.getSelectedFile(); sudoku.loadGridFromFile(selectedFile.getAbsolutePath()); updateGrid(); } } }); JPanel buttonPanel = new JPanel(); buttonPanel.add(loadButton, BorderLayout.NORTH); add(buttonPanel, BorderLayout.NORTH); } /** * Crée le bouton pour générer une nouvelle grille de Sudoku. */ private void createGenerateButton() { JButton generateButton = new JButton("Générer"); generateButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // Demander à l'utilisateur combien de "clues" il souhaite spécifier String input = JOptionPane.showInputDialog(null, "Entrez le nombre de clues :"); try { // Convertir l'entrée en entier numberOfClues = Integer.parseInt(input); } catch (NumberFormatException ex) { // Gérer les cas où l'utilisateur entre un texte non numérique JOptionPane.showMessageDialog(null, "Veuillez entrer un nombre valide.", "Erreur", JOptionPane.ERROR_MESSAGE); return; // Sortir de la méthode si l'entrée n'est pas un nombre valide } // Générer une nouvelle grille Sudoku avec le nombre de "clues" spécifié Grid newGrid = GenerateGrid.generateSudokuGrid(numberOfClues); // Définir la nouvelle grille dans l'instance de Sudoku sudoku.setGrid(newGrid); // Afficher la grille générée dans la console sudoku.printGrid(); // Mettre à jour l'interface utilisateur pour afficher la nouvelle grille updateGrid(); } }); JPanel buttonPanel = new JPanel(); buttonPanel.add(generateButton, BorderLayout.EAST); add(buttonPanel, BorderLayout.EAST); } /** * Crée le bouton pour sauvegarder la grille de Sudoku dans un fichier. */ private void createSaveButton() { JButton saveButton = new JButton("Sauvegarder"); saveButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JFileChooser fileChooser = new JFileChooser(); FileNameExtensionFilter filter = new FileNameExtensionFilter("Fichiers de grille Sudoku (*.gri)", "gri"); fileChooser.setFileFilter(filter); int returnValue = fileChooser.showSaveDialog(null); if (returnValue == JFileChooser.APPROVE_OPTION) { File selectedFile = fileChooser.getSelectedFile(); sudoku.getGrid().saveGridToFile(selectedFile.getAbsolutePath()); } } }); JPanel buttonPanel = new JPanel(); buttonPanel.add(saveButton, BorderLayout.WEST); add(buttonPanel, BorderLayout.WEST); } /** * Met à jour l'affichage de la grille dans l'interface utilisateur. */ private void updateGrid() { Grid grid = sudoku.getGrid(); for (int row = 0; row < 9; row++) { for (int col = 0; col < 9; col++) { int value = grid.getCell(row, col).getValue(); buttons[row][col].setText(value == 0 ? "" : String.valueOf(value)); } } } /** * Obtient le texte du titre de l'interface utilisateur. * @return Le texte du titre. */ @Override protected String getTitleText() { return "Sudoku Creator"; } /** * Méthode principale pour tester la classe SudokuCreator. * @param args Arguments de la ligne de commande (non utilisés). */ public static void main(String[] args) { Sudoku sudoku = new Sudoku(); new SudokuCreator(sudoku); } }