2024-04-28 01:40:14 +02:00
|
|
|
import javax.swing.*;
|
|
|
|
import java.awt.*;
|
2024-05-04 00:13:44 +02:00
|
|
|
import java.awt.event.ActionEvent;
|
|
|
|
import java.awt.event.ActionListener;
|
2024-05-04 14:59:38 +02:00
|
|
|
import java.io.File;
|
|
|
|
import javax.swing.filechooser.FileNameExtensionFilter;
|
2024-04-28 01:40:14 +02:00
|
|
|
|
|
|
|
public class SudokuUI extends JFrame {
|
2024-05-04 00:13:44 +02:00
|
|
|
private Sudoku sudoku;
|
2024-04-28 01:40:14 +02:00
|
|
|
private JButton[][] buttons;
|
|
|
|
|
2024-05-04 00:13:44 +02:00
|
|
|
public SudokuUI(Sudoku sudoku) {
|
|
|
|
this.sudoku = sudoku;
|
2024-04-28 01:40:14 +02:00
|
|
|
this.buttons = new JButton[9][9];
|
|
|
|
|
|
|
|
setTitle("Sudoku");
|
|
|
|
setDefaultCloseOperation(EXIT_ON_CLOSE);
|
|
|
|
JPanel gridPanel = new JPanel(new GridLayout(9, 9));
|
|
|
|
gridPanel.setBackground(Color.WHITE);
|
|
|
|
gridPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
|
|
|
|
|
2024-05-04 00:13:44 +02:00
|
|
|
// Création des boutons de la grille
|
2024-04-28 01:40:14 +02:00
|
|
|
createGridButtons(gridPanel);
|
|
|
|
|
2024-05-04 00:13:44 +02:00
|
|
|
// Création du bouton "Résoudre"
|
|
|
|
createSolveButton();
|
|
|
|
|
2024-05-04 14:59:38 +02:00
|
|
|
// Création des boutons "Charger" et "Générer"
|
|
|
|
createLoadButton();
|
2024-05-04 00:13:44 +02:00
|
|
|
createGenerateButton();
|
|
|
|
|
|
|
|
// Calcul de la taille préférée de la fenêtre en fonction de la taille de la grille
|
2024-04-28 01:40:14 +02:00
|
|
|
int preferredSize = 50 * 9; // 50 est la taille approximative d'un bouton
|
|
|
|
gridPanel.setPreferredSize(new Dimension(preferredSize, preferredSize));
|
|
|
|
|
|
|
|
add(gridPanel);
|
2024-05-04 00:13:44 +02:00
|
|
|
pack(); // Redimensionne automatiquement la fenêtre pour s'adapter à la taille du panneau
|
2024-04-28 01:40:14 +02:00
|
|
|
setLocationRelativeTo(null);
|
|
|
|
setVisible(true);
|
|
|
|
}
|
|
|
|
|
2024-05-04 00:13:44 +02:00
|
|
|
private void createGridButtons(JPanel gridPanel) {
|
|
|
|
Grid grid = sudoku.getGrid(); // Obtenez la grille à partir de Sudoku
|
2024-04-28 01:40:14 +02:00
|
|
|
for (int row = 0; row < 9; row++) {
|
|
|
|
for (int col = 0; col < 9; col++) {
|
|
|
|
JButton button = new JButton();
|
|
|
|
button.setFont(new Font("Arial", Font.BOLD, 24));
|
|
|
|
button.setContentAreaFilled(false);
|
|
|
|
button.setBorder(BorderFactory.createLineBorder(Color.BLACK));
|
2024-05-04 00:13:44 +02:00
|
|
|
button.addActionListener(new SudokuButtonListener(row, col, sudoku, buttons));
|
2024-04-28 01:40:14 +02:00
|
|
|
gridPanel.add(button);
|
|
|
|
buttons[row][col] = button;
|
|
|
|
|
|
|
|
// Mettez à jour le texte des boutons avec les valeurs de la grille Sudoku
|
|
|
|
int value = grid.getCell(row, col).getValue();
|
|
|
|
buttons[row][col].setText(value == 0 ? "" : String.valueOf(value));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-05-04 00:13:44 +02:00
|
|
|
|
|
|
|
private void createSolveButton() {
|
|
|
|
JButton solveButton = new JButton("Résoudre");
|
|
|
|
solveButton.addActionListener(new ActionListener() {
|
|
|
|
@Override
|
|
|
|
public void actionPerformed(ActionEvent e) {
|
|
|
|
SudokuSolver solver = new SudokuSolver(); // Créez une instance de SudokuSolver
|
|
|
|
Grid solvedGrid = new Grid(); // Créez une nouvelle grille pour stocker la solution
|
|
|
|
solvedGrid.copyFrom(sudoku.getGrid()); // Copiez la grille actuelle de Sudoku
|
|
|
|
|
|
|
|
// Résolvez la grille
|
|
|
|
if (solver.solve(solvedGrid)) {
|
|
|
|
// Si une solution est trouvée, mettez à jour la grille Sudoku avec la solution
|
|
|
|
sudoku.getGrid().copyFrom(solvedGrid);
|
|
|
|
updateGrid();
|
|
|
|
} else {
|
|
|
|
// Sinon, affichez un message indiquant que la grille est insoluble
|
|
|
|
JOptionPane.showMessageDialog(null, "La grille est insoluble.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
JPanel buttonPanel = new JPanel();
|
|
|
|
buttonPanel.add(solveButton);
|
|
|
|
add(buttonPanel, BorderLayout.SOUTH);
|
|
|
|
}
|
|
|
|
|
2024-05-04 14:59:38 +02:00
|
|
|
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);
|
|
|
|
add(buttonPanel, BorderLayout.NORTH);
|
|
|
|
}
|
|
|
|
|
2024-05-04 00:13:44 +02:00
|
|
|
private void createGenerateButton() {
|
|
|
|
JButton generateButton = new JButton("Générer");
|
|
|
|
generateButton.addActionListener(new ActionListener() {
|
|
|
|
@Override
|
|
|
|
public void actionPerformed(ActionEvent e) {
|
|
|
|
// Générer une nouvelle grille Sudoku
|
|
|
|
Grid newGrid = GenerateGrid.generatePuzzleGrid();
|
|
|
|
// 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);
|
|
|
|
add(buttonPanel, BorderLayout.EAST);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|