SAE21_2023/SudokuGame.java

166 lines
6.1 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;
/**
* La classe SudokuGame étend la classe SudokuUI et représente une application de jeu de Sudoku avec des fonctionnalités supplémentaires telles que le chargement de grilles et la résolution automatique.
*/
public class SudokuGame extends SudokuUI {
/**
* Constructeur de la classe SudokuGame.
*
* @param sudoku La grille de Sudoku à utiliser pour le jeu.
*/
public SudokuGame(Sudoku sudoku) {
super(sudoku);
createAdditionalButtons();
}
/**
* Méthode pour obtenir le texte du titre de l'interface utilisateur.
*
* @return Le texte du titre.
*/
@Override
protected String getTitleText() {
return "Sudoku Game";
}
/**
* Méthode pour créer les boutons de chargement et de résolution et redimensionner la fenêtre.
*/
protected void createAdditionalButtons() {
createLoadButton();
createSolveButton();
pack(); // Redimensionner la fenêtre pour s'adapter aux nouveaux boutons
}
/**
* Méthode pour créer le bouton de résolution.
*/
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);
}
/**
* Méthode pour créer le bouton de chargement.
*/
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);
}
/**
* Méthode pour mettre à jour les valeurs des boutons de la grille après un chargement ou une résolution.
*/
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
}
}
}
/**
* Méthode pour vérifier si la grille est complètement remplie et si la solution est correcte.
* Affiche une alerte si la grille est résolue correctement.
*/
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 !");
}
}
/**
* Vérifie si le placement d'un nombre dans une cellule est sûr.
*
* @param grid La grille de Sudoku.
* @param row L'indice de ligne de la cellule.
* @param col L'indice de colonne de la cellule.
* @param num Le nombre à vérifier.
* @return True si le placement est sûr, False sinon.
*/
private boolean isValidMove(Grid grid, int row, int col, int num) {
// Votre logique de validation ici
return false;
}
/**
* Méthode principale pour démarrer le jeu de Sudoku.
*
* @param args Les arguments de la ligne de commande (non utilisés).
*/
public static void main(String[] args) {
Sudoku sudoku = new Sudoku();
new SudokuGame(sudoku);
}
}