137 lines
5.4 KiB
Java
137 lines
5.4 KiB
Java
import javax.swing.*;
|
|
import javax.swing.filechooser.FileNameExtensionFilter;
|
|
import java.awt.*;
|
|
import java.awt.event.ActionEvent;
|
|
import java.awt.event.ActionListener;
|
|
import java.io.File;
|
|
|
|
public class SudokuGame extends SudokuUI {
|
|
|
|
public SudokuGame(Sudoku sudoku) {
|
|
super(sudoku);
|
|
|
|
// Demander à l'utilisateur s'il veut jouer manuellement ou résoudre automatiquement
|
|
int option = JOptionPane.showOptionDialog(null, "Voulez-vous jouer manuellement ou résoudre automatiquement la grille de Sudoku ?", "Choix du mode", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, new String[]{"Manuel", "Automatique"}, "Manuel");
|
|
|
|
// Activer ou désactiver les fonctionnalités en fonction du choix de l'utilisateur
|
|
if (option == JOptionPane.YES_OPTION) { // Manuel
|
|
createManualButtons();
|
|
} else if (option == JOptionPane.NO_OPTION) { // Automatique
|
|
createAutoButtons();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected String getTitleText() {
|
|
return "Sudoku Game"; // Texte du titre pour le jeu Sudoku
|
|
}
|
|
|
|
protected void createManualButtons() {
|
|
createLoadButton();
|
|
pack(); // Redimensionner la fenêtre pour s'adapter aux nouveaux boutons
|
|
}
|
|
|
|
private void createAutoButtons() {
|
|
createLoadButton();
|
|
createSolveButton();
|
|
pack(); // Redimensionner la fenêtre pour s'adapter aux nouveaux boutons
|
|
}
|
|
|
|
private void createSolveButton() {
|
|
JButton solveButton = new JButton("Résoudre (Automatique)");
|
|
solveButton.addActionListener(new ActionListener() {
|
|
@Override
|
|
public void actionPerformed(ActionEvent e) {
|
|
long startTime = System.nanoTime(); // Temps de début de la résolution
|
|
|
|
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)) {
|
|
long endTime = System.nanoTime(); // Temps de fin de la résolution
|
|
long duration = (endTime - startTime) / 1_000_000; // Conversion de nanosecondes en millisecondes
|
|
|
|
// Si une solution est trouvée, mettez à jour la grille Sudoku avec la solution
|
|
sudoku.getGrid().copyFrom(solvedGrid);
|
|
updateGrid();
|
|
JOptionPane.showMessageDialog(null, "La grille a été résolue en " + duration + " millisecondes.");
|
|
checkGameCompletion(); // Vérifiez si le jeu est terminé après la résolution
|
|
} 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);
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
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));
|
|
buttons[row][col].setEnabled(value == 0); // Désactive les boutons pour les cellules déjà remplies
|
|
}
|
|
}
|
|
}
|
|
|
|
private void checkGameCompletion() {
|
|
Grid grid = sudoku.getGrid();
|
|
boolean isFull = true;
|
|
boolean hasErrors = false;
|
|
|
|
for (int row = 0; row < 9; row++) {
|
|
for (int col = 0; col < 9; col++) {
|
|
int value = grid.getCell(row, col).getValue();
|
|
if (value == 0) {
|
|
isFull = false;
|
|
} else if (!isValidMove(grid, row, col, value)) {
|
|
hasErrors = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (isFull && !hasErrors) {
|
|
JOptionPane.showMessageDialog(null, "Félicitations ! Vous avez résolu la grille avec succès !");
|
|
}
|
|
}
|
|
|
|
private boolean isValidMove(Grid grid, int row, int col, int num) {
|
|
// Votre logique de validation ici
|
|
return false;
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
Sudoku sudoku = new Sudoku();
|
|
new SudokuGame(sudoku);
|
|
}
|
|
}
|