2024-05-04 17:56:30 +02:00
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 ) ;
2024-05-05 17:51:03 +02:00
// 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 ( ) ;
}
2024-05-04 17:56:30 +02:00
}
@Override
protected String getTitleText ( ) {
2024-05-05 17:51:03 +02:00
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
2024-05-04 17:56:30 +02:00
}
2024-05-05 17:51:03 +02:00
private void createAutoButtons ( ) {
2024-05-04 17:56:30 +02:00
createLoadButton ( ) ;
createSolveButton ( ) ;
pack ( ) ; // Redimensionner la fenêtre pour s'adapter aux nouveaux boutons
}
private void createSolveButton ( ) {
2024-05-05 13:38:52 +02:00
JButton solveButton = new JButton ( " Résoudre (Automatique) " ) ;
2024-05-04 17:56:30 +02:00
solveButton . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent e ) {
2024-05-05 13:38:52 +02:00
long startTime = System . nanoTime ( ) ; // Temps de début de la résolution
2024-05-04 17:56:30 +02:00
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 ) ) {
2024-05-05 13:38:52 +02:00
long endTime = System . nanoTime ( ) ; // Temps de fin de la résolution
long duration = ( endTime - startTime ) / 1_000_000 ; // Conversion de nanosecondes en millisecondes
2024-05-04 17:56:30 +02:00
// Si une solution est trouvée, mettez à jour la grille Sudoku avec la solution
sudoku . getGrid ( ) . copyFrom ( solvedGrid ) ;
updateGrid ( ) ;
2024-05-05 13:38:52 +02:00
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
2024-05-04 17:56:30 +02:00
} 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 ) ) ;
2024-05-05 00:33:57 +02:00
buttons [ row ] [ col ] . setEnabled ( value = = 0 ) ; // Désactive les boutons pour les cellules déjà remplies
2024-05-04 17:56:30 +02:00
}
}
}
2024-05-05 13:38:52 +02:00
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 ;
}
2024-05-04 17:56:30 +02:00
public static void main ( String [ ] args ) {
Sudoku sudoku = new Sudoku ( ) ;
new SudokuGame ( sudoku ) ;
}
}