petite correction + fin des commentaires

This commit is contained in:
gallego 2024-05-04 16:04:24 +02:00
parent e1836143cd
commit 43e3c1634a
9 changed files with 254 additions and 72 deletions

View File

@ -2,33 +2,45 @@ import javax.swing.*;
import java.awt.*; import java.awt.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.FocusListener;
import java.awt.event.FocusEvent; import java.awt.event.FocusEvent;
import java.awt.event.FocusAdapter; import java.awt.event.FocusAdapter;
import java.io.*; import java.io.*;
import javax.swing.border.Border;
import javax.swing.text.PlainDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
/**
* La classe Grille est une composante Swing pour représenter une grille de Sudoku.
*
* @author Julian GALLEGO
* @author Wilfried BRIGITTE
*/
public class Grille extends JComponent {
private static JLabel etat_exportation = new JLabel();
public class grille extends JComponent{ /**
private static JLabel etat_exportation = new JLabel(); * Tableau des valeurs de la grille de Sudoku.
*/
public static int[][] grid_values = null;
/*tableau de valeurs de la grille de sudoku*/ /**
public static int[][] grid_values = null; * Panneau pour la grille.
*/
public static JPanel place_grille = new JPanel();
/*Panneau pour la grille */ /**
public static JPanel place_grille = new JPanel(); * Fenêtre de l'application.
*/
public static JFrame fenetre = new JFrame();
/*variable de la fenetre*/ /**
* Affiche graphiquement la grille de Sudoku.
public static JFrame fenetre = new JFrame(); *
* @param grille La grille de Sudoku à afficher.
/*fonction pour afficher graphiquement la grille*/ * @param editable Indique si la grille est éditable.
* @param resolutionManuel Indique si la résolution est manuelle.
* @param duree La durée de résolution (en nanosecondes).
*/
public static void AfficherGrille (int[][] grille, boolean editable, boolean resolutionManuel, long duree) { public static void AfficherGrille (int[][] grille, boolean editable, boolean resolutionManuel, long duree) {
/*paramètre de base de la fenetre*/ //paramètre de base de la fenetre
fenetre.setSize(900, 950); fenetre.setSize(900, 950);
fenetre.setResizable(false); fenetre.setResizable(false);
fenetre.setLocationRelativeTo(null); fenetre.setLocationRelativeTo(null);
@ -36,13 +48,13 @@ public class grille extends JComponent{
place_grille.setSize(900,900); place_grille.setSize(900,900);
/*creation grille*/ //creation grille
GridLayout gestionnaire = new GridLayout(9,9,-2,-2); GridLayout gestionnaire = new GridLayout(9,9,-2,-2);
place_grille.setLayout(gestionnaire); place_grille.setLayout(gestionnaire);
JTextField[][] case_editable = null; JTextField[][] case_editable = null;
case_editable = new JTextField[9][9]; case_editable = new JTextField[9][9];
/*si la grille peut etre entierement éditée (dans le cas du programme1*/ //si la grille peut etre entierement éditée (dans le cas du programme1
if(editable){ if(editable){
for (int ligne = 0; ligne < 9; ligne++) { for (int ligne = 0; ligne < 9; ligne++) {
@ -111,12 +123,12 @@ public class grille extends JComponent{
} }
} }
/*bouton(s) grille(s)*/ //bouton(s) grille(s)
JButton verifier = null; JButton verifier = null;
JButton exporter = null; JButton exporter = null;
JPanel bouton_grille = new JPanel(); JPanel bouton_grille = new JPanel();
/*affichage des boutons en fonction du programme lancé*/ //affichage des boutons en fonction du programme lancé
if(editable){ if(editable){
bouton_grille.add(etat_exportation); bouton_grille.add(etat_exportation);
exporter = new JButton("exporter"); exporter = new JButton("exporter");
@ -136,10 +148,10 @@ public class grille extends JComponent{
fenetre.add(bouton_grille,BorderLayout.SOUTH); fenetre.add(bouton_grille,BorderLayout.SOUTH);
fenetre.add(place_grille, BorderLayout.CENTER); fenetre.add(place_grille, BorderLayout.CENTER);
/*affichage fenetre*/ //affichage fenetre
fenetre.setVisible(true); fenetre.setVisible(true);
/*verification si un chiffre peut être placé à un endroit*/ //verification si un chiffre peut être placé à un endroit
for (int ligne = 0; ligne < 9; ligne++) { for (int ligne = 0; ligne < 9; ligne++) {
for (int col = 0; col < 9; col++) { for (int col = 0; col < 9; col++) {
final int finalLigne = ligne; final int finalLigne = ligne;
@ -173,17 +185,27 @@ public class grille extends JComponent{
} }
/*événement des boutons*/ //événement des boutons
if (verifier != null) { /* Vérification pour s'assurer que verifier a été initialisé */ if (verifier != null) { // Vérification pour s'assurer que verifier a été initialisé
verifier.addActionListener(new ActionListener() { verifier.addActionListener(new ActionListener() {
/**
* verifie votre solution en appuyant sur le bouton verifier
*
* @param verifier L'évènement d'action.
*/
public void actionPerformed(ActionEvent verifier) { public void actionPerformed(ActionEvent verifier) {
VerificationGrilleFini(); VerificationGrilleFini();
} }
}); });
} }
if (exporter != null) { /* Vérification pour s'assurer que exporter a été initialisé */ if (exporter != null) { // Vérification pour s'assurer que exporter a été initialisé
exporter.addActionListener(new ActionListener() { exporter.addActionListener(new ActionListener() {
/**
* permet d'exporter votre grille édité.
*
* @param exporeter
*/
public void actionPerformed(ActionEvent exporter) { public void actionPerformed(ActionEvent exporter) {
if (!(resolveurGrille.resoudreSudoku(GrilleActuelle()))){ if (!(resolveurGrille.resoudreSudoku(GrilleActuelle()))){
etat_exportation.setHorizontalAlignment(SwingConstants.LEFT); etat_exportation.setHorizontalAlignment(SwingConstants.LEFT);
@ -199,7 +221,12 @@ public class grille extends JComponent{
} }
/*fonction pour passer d'un fichier.gri à un tableau de valeur*/ /**
* Charge une grille à partir d'un fichier.
*
* @param cheminFichier Le chemin du fichier contenant la grille.
* @return Un tableau représentant la grille.
*/
public static int[][] ChargerGrille(String cheminFichier){ public static int[][] ChargerGrille(String cheminFichier){
try { try {
FileInputStream fs = new FileInputStream(cheminFichier); FileInputStream fs = new FileInputStream(cheminFichier);
@ -236,7 +263,11 @@ public class grille extends JComponent{
return null; return null;
} }
/*fonction pour exporter une grille en fichier .gri*/ /**
* Exporte une grille vers un fichier.
*
* @param grille La grille à exporter.
*/
public static void ExporterGrille(int[][] grille){ public static void ExporterGrille(int[][] grille){
try { try {
@ -270,7 +301,11 @@ public class grille extends JComponent{
} }
} }
/*fonction pour récupérer les valeurs ACTUELLES de la grille est les placer dans un tableau*/ /**
* Récupère les valeurs actuelles de la grille et les place dans un tableau.
*
* @return Un tableau représentant la grille actuelle.
*/
public static int[][] GrilleActuelle(){ public static int[][] GrilleActuelle(){
int[][] grilleActuelle = new int[9][9]; int[][] grilleActuelle = new int[9][9];
@ -291,7 +326,11 @@ public class grille extends JComponent{
return grilleActuelle; return grilleActuelle;
} }
/*fonction pour verifier si la grille actuelle correspond à la grille trouvé en solution*/ /**
* Vérifie si la grille actuelle correspond à la grille résolue.
*
* @return true si la grille est résolue correctement, sinon false.
*/
public static boolean VerificationGrilleFini(){ public static boolean VerificationGrilleFini(){
int[][] soluce_de_la_grille = new int[9][9]; int[][] soluce_de_la_grille = new int[9][9];
soluce_de_la_grille = resolveurGrille.resoudreGrille(grid_values); soluce_de_la_grille = resolveurGrille.resoudreGrille(grid_values);

View File

@ -2,6 +2,13 @@ import javax.swing.text.PlainDocument;
import javax.swing.text.AttributeSet; import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException; import javax.swing.text.BadLocationException;
/**
* Cette classe limite le nombre de caractères à 4 et limite les caractères a des chiffres
* pour les JTextField
*
* @author Julian GALLEGO
* @author Wilfried BRIGITTE
*/
public class JTextFieldCharLimit extends PlainDocument public class JTextFieldCharLimit extends PlainDocument
{ {
private int max; private int max;
@ -9,6 +16,15 @@ public class JTextFieldCharLimit extends PlainDocument
super(); super();
this.max = max; this.max = max;
} }
/**
* Vérifie si le texte répond aux exigences
*
* @param offset L'offset auquel insérer le texte.
* @param text La chaîne de texte à insérer.
* @param attr Les attributs à appliquer au texte inséré.
* @throws BadLocationException Si l'offset est invalide.
*/
public void insertString(int offset, String text, AttributeSet attr) throws BadLocationException { public void insertString(int offset, String text, AttributeSet attr) throws BadLocationException {
if (text == null){ if (text == null){
return; return;
@ -17,7 +33,7 @@ public class JTextFieldCharLimit extends PlainDocument
sb.append(getText(0, getLength())); sb.append(getText(0, getLength()));
sb.insert(offset, text); sb.insert(offset, text);
/* Vérifier si le texte ne contient que des chiffres de 1 à 9 et si il ne depasse pas 4 caractères */ // Vérifier si le texte ne contient que des chiffres de 1 à 9 et si il ne depasse pas 4 caractères
if (sb.length() <= max && sb.toString().matches("[1-9]*")) { if (sb.length() <= max && sb.toString().matches("[1-9]*")) {
super.insertString(offset, text, attr); super.insertString(offset, text, attr);
} }

View File

@ -2,8 +2,14 @@ import javax.swing.*;
import java.awt.*; import java.awt.*;
import java.awt.event.*; import java.awt.event.*;
/**
* La classe JeuFini affiche une fenêtre de fin de jeu pour un Sudoku résolu.
*
* @author Julian GALLEGO
* @author Wilfried BRIGITTE
*/
public class JeuFini { public class JeuFini {
/*afficher la fenetre de fin*/ // Créer une nouvelle fenêtre
public static void JeuFini(){ public static void JeuFini(){
JFrame fenetre = new JFrame(); JFrame fenetre = new JFrame();
fenetre.setSize(500, 200); fenetre.setSize(500, 200);
@ -12,23 +18,29 @@ public class JeuFini {
fenetre.setLocationRelativeTo(null); fenetre.setLocationRelativeTo(null);
fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Utiliser un gestionnaire de disposition pour organiser les composants
GridLayout gestionnaire = new GridLayout(2,1); GridLayout gestionnaire = new GridLayout(2,1);
fenetre.setLayout(gestionnaire); fenetre.setLayout(gestionnaire);
// Ajouter un texte à la fenêtre
JLabel titre = new JLabel("Bravo vous avez résolu le Sudoku"); JLabel titre = new JLabel("Bravo vous avez résolu le Sudoku");
titre.setHorizontalAlignment(JLabel.CENTER); titre.setHorizontalAlignment(JLabel.CENTER);
titre.setFont(new Font("Arial", Font.PLAIN, 30)); titre.setFont(new Font("Arial", Font.PLAIN, 30));
fenetre.add(titre, BorderLayout.CENTER); fenetre.add(titre, BorderLayout.CENTER);
// Ajouter un bouton "Quitter"
JPanel ligne2 = new JPanel(); JPanel ligne2 = new JPanel();
JButton quitter = new JButton("Quitter"); JButton quitter = new JButton("Quitter");
ligne2.add(quitter); ligne2.add(quitter);
fenetre.add(ligne2, BorderLayout.CENTER); fenetre.add(ligne2, BorderLayout.CENTER);
// Rendre la fenêtre visible
fenetre.setVisible(true); fenetre.setVisible(true);
// Définir un évènement pour le bouton "Quitter"
quitter.addActionListener(new ActionListener() { quitter.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
// Quitter l'application lorsque le bouton "Quitter" est cliqué
System.exit(0); System.exit(0);
} }
}); });

View File

@ -14,13 +14,13 @@ mainProgramme2.class : mainProgramme2.java menuProgramme2.class
mainProgramme1.class : mainProgramme1.java menuProgramme1.class mainProgramme1.class : mainProgramme1.java menuProgramme1.class
${JC} ${JCFLAGS} mainProgramme1.java ${JC} ${JCFLAGS} mainProgramme1.java
grille.class : grille.java resolveurGrille.class JTextFieldCharLimit.class JeuFini.class Grille.class : Grille.java resolveurGrille.class JTextFieldCharLimit.class JeuFini.class
${JC} ${JCFLAGS} grille.java ${JC} ${JCFLAGS} Grille.java
menuProgramme2.class : menuProgramme2.java resolveurGrille.class grille.class menuProgramme2.class : menuProgramme2.java resolveurGrille.class Grille.class
${JC} ${JCFLAGS} menuProgramme2.java ${JC} ${JCFLAGS} menuProgramme2.java
menuProgramme1.class : menuProgramme1.java resolveurGrille.class grille.class menuProgramme1.class : menuProgramme1.java resolveurGrille.class Grille.class
${JC} ${JCFLAGS} menuProgramme1.java ${JC} ${JCFLAGS} menuProgramme1.java
resolveurGrille.class : resolveurGrille.java resolveurGrille.class : resolveurGrille.java
@ -34,10 +34,10 @@ JeuFini.class : JeuFini.java
### REGLES OPTIONNELLES ### ### REGLES OPTIONNELLES ###
run1 : mainProgramme1.class editeur : mainProgramme1.class
${JVM} ${JVMFLAGS} mainProgramme1 ${JVM} ${JVMFLAGS} mainProgramme1
run2 : mainProgramme2.class resolveur : mainProgramme2.class
${JVM} ${JVMFLAGS} mainProgramme2 ${JVM} ${JVMFLAGS} mainProgramme2
clean : clean :

View File

@ -1,6 +1,17 @@
/**
* Classe principale pour exécuter le programme 1.
*
* @author Julian GALLEGO
* @author Wilfried BRIGITTE
*/
public class mainProgramme1 { public class mainProgramme1 {
public static void main(String[] args) { /**
menuProgramme1.menuProgramme1(); * Méthode principale pour exécuter le programme 1.
} *
* @param args Les arguments de la ligne de commande.
*/
public static void main(String[] args) {
menuProgramme1.menuProgramme1();
}
} }

View File

@ -1,6 +1,16 @@
/**
* Classe principale pour exécuter le programme 2.
*
* @author Julian GALLEGO
* @author Wilfried BRIGITTE
*/
public class mainProgramme2 { public class mainProgramme2 {
public static void main(String[] args) { /**
menuProgramme2.menuProgramme2(); * Méthode principale pour exécuter le programme 2.
} *
* @param args Les arguments de la ligne de commande.
*/
public static void main(String[] args) {
menuProgramme2.menuProgramme2();
}
} }

View File

@ -3,13 +3,22 @@ import java.awt.*;
import java.awt.event.*; import java.awt.event.*;
import java.io.*; import java.io.*;
/**
* Menu pour le Programme 1 (Créateur de Sudoku).
*
* @author Julian GALLEGO
* @author Wilfried BRIGITTE
*/
public class menuProgramme1 { public class menuProgramme1 {
private static String cheminFichier = null; private static String cheminFichier = null;
/**
* Affiche le menu du Programme 1 qui permet créer et d'editer une grille .
*/
public static void menuProgramme1() { public static void menuProgramme1() {
/*fenetre*/
// création de la fenêtre
JFrame fenetre = new JFrame(); JFrame fenetre = new JFrame();
fenetre.setSize(500, 200); fenetre.setSize(500, 200);
fenetre.setTitle("Sudoku Creator (By Wilfried BRIGITTE & Julian GALLEGO)"); fenetre.setTitle("Sudoku Creator (By Wilfried BRIGITTE & Julian GALLEGO)");
@ -19,8 +28,7 @@ public class menuProgramme1 {
GridLayout gestionnaire = new GridLayout(4,1); GridLayout gestionnaire = new GridLayout(4,1);
fenetre.setLayout(gestionnaire); fenetre.setLayout(gestionnaire);
/*composants G*/ //composants graphique
JLabel titre = new JLabel("Sudoku Creator"); JLabel titre = new JLabel("Sudoku Creator");
titre.setHorizontalAlignment(JLabel.CENTER); titre.setHorizontalAlignment(JLabel.CENTER);
titre.setFont(new Font("Arial", Font.PLAIN, 25)); titre.setFont(new Font("Arial", Font.PLAIN, 25));
@ -47,11 +55,16 @@ public class menuProgramme1 {
InfoLogiciel.setFont(new Font("Arial", Font.PLAIN, 11)); InfoLogiciel.setFont(new Font("Arial", Font.PLAIN, 11));
fenetre.add(InfoLogiciel); fenetre.add(InfoLogiciel);
/*affichage*/ //affichage de la fenêtre
fenetre.setVisible(true); fenetre.setVisible(true);
/*evenements*/ //Evenements
ouvrir.addActionListener(new ActionListener() { ouvrir.addActionListener(new ActionListener() {
/**
* Ouvre un sélecteur de fichiers pour choisir un fichier de grille à charger.
*
* @param e L'événement d'action.
*/
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
try { try {
JFileChooser filechooser = new JFileChooser(); JFileChooser filechooser = new JFileChooser();
@ -71,6 +84,11 @@ public class menuProgramme1 {
}); });
editerGrilleVierge.addActionListener(new ActionListener(){ editerGrilleVierge.addActionListener(new ActionListener(){
/**
* Crée une grille vide et l'affiche pour l'édition.
*
* @param e4 L'événement d'action.
*/
public void actionPerformed(ActionEvent e4){ public void actionPerformed(ActionEvent e4){
int[][] grille_vide = null; int[][] grille_vide = null;
grille_vide = new int[9][9]; grille_vide = new int[9][9];
@ -82,23 +100,33 @@ public class menuProgramme1 {
} }
fenetre.dispose(); fenetre.dispose();
grille.AfficherGrille(grille_vide, true, false, 0); Grille.AfficherGrille(grille_vide, true, false, 0);
} }
}); });
editerGrilleSelectionner.addActionListener(new ActionListener(){ editerGrilleSelectionner.addActionListener(new ActionListener(){
/**
* Charge une grille à partir du fichier sélectionné et l'affiche pour l'édition.
*
* @param e4 L'événement d'action.
*/
public void actionPerformed(ActionEvent e4){ public void actionPerformed(ActionEvent e4){
if (cheminFichier == null){ if (cheminFichier == null){
InfoLogiciel.setText(" Info : Erreur : Veuillez selectionner un fichier .gri"); InfoLogiciel.setText(" Info : Erreur : Veuillez selectionner un fichier .gri");
InfoLogiciel.setForeground(Color.RED); InfoLogiciel.setForeground(Color.RED);
}else{ }else{
fenetre.dispose(); fenetre.dispose();
grille.AfficherGrille(grille.ChargerGrille(cheminFichier), true, false, 0); Grille.AfficherGrille(Grille.ChargerGrille(cheminFichier), true, false, 0);
} }
} }
}); });
quitter.addActionListener(new ActionListener() { quitter.addActionListener(new ActionListener() {
/**
* Ferme l'application.
*
* @param e3 L'événement d'action.
*/
public void actionPerformed(ActionEvent e3) { public void actionPerformed(ActionEvent e3) {
System.exit(0); System.exit(0);
} }

View File

@ -3,14 +3,29 @@ import java.awt.*;
import java.awt.event.*; import java.awt.event.*;
import java.io.*; import java.io.*;
/**
* Menu pour le Programme 2 (Résolveur de Sudoku).
*
* @author Julian GALLEGO
* @author Wilfried BRIGITTE
*/
public class menuProgramme2 { public class menuProgramme2 {
/**
* designe le chemin du fichier
*/
private static String cheminFichier = null; private static String cheminFichier = null;
/**
* permet de savoir si l'utilisateur veut resoudre le sudoku lui même
* ou si il veut voir la solution
*/
private static boolean ResolutionManuel = true; private static boolean ResolutionManuel = true;
/**
* Affiche le menu du Programme 2.
*/
public static void menuProgramme2() { public static void menuProgramme2() {
/*fenetre*/ //Création de la fenêtre
JFrame fenetre = new JFrame(); JFrame fenetre = new JFrame();
fenetre.setSize(500, 250); fenetre.setSize(500, 250);
fenetre.setTitle("Sudoku Resolver (By Wilfried BRIGITTE & Julian GALLEGO)"); fenetre.setTitle("Sudoku Resolver (By Wilfried BRIGITTE & Julian GALLEGO)");
@ -20,8 +35,7 @@ public class menuProgramme2 {
GridLayout gestionnaire = new GridLayout(5,1); GridLayout gestionnaire = new GridLayout(5,1);
fenetre.setLayout(gestionnaire); fenetre.setLayout(gestionnaire);
/*composants G*/ //Composants graphique
JLabel titre = new JLabel("Sudoku Resolver"); JLabel titre = new JLabel("Sudoku Resolver");
titre.setHorizontalAlignment(JLabel.CENTER); titre.setHorizontalAlignment(JLabel.CENTER);
titre.setFont(new Font("Arial", Font.PLAIN, 25)); titre.setFont(new Font("Arial", Font.PLAIN, 25));
@ -58,11 +72,16 @@ public class menuProgramme2 {
InfoLogiciel.setFont(new Font("Arial", Font.PLAIN, 11)); InfoLogiciel.setFont(new Font("Arial", Font.PLAIN, 11));
fenetre.add(InfoLogiciel); fenetre.add(InfoLogiciel);
/*affichage*/ //Affichage de la fenêtre
fenetre.setVisible(true); fenetre.setVisible(true);
/*evenements*/ /*evenements*/
ouvrir.addActionListener(new ActionListener() { ouvrir.addActionListener(new ActionListener() {
/**
* Ouvre un sélecteur de fichiers pour choisir un fichier de grille.
*
* @param e L'événement d'action.
*/
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
try { try {
JFileChooser filechooser = new JFileChooser(); JFileChooser filechooser = new JFileChooser();
@ -82,19 +101,24 @@ public class menuProgramme2 {
}); });
lancer.addActionListener(new ActionListener() { lancer.addActionListener(new ActionListener() {
/**
* Lance la résolution du Sudoku en fonction du mode choisi.
*
* @param e2 L'événement d'action.
*/
public void actionPerformed(ActionEvent e2) { public void actionPerformed(ActionEvent e2) {
if(cheminFichier != null){ if(cheminFichier != null){
if (ResolutionManuel == true) { if (ResolutionManuel == true) {
fenetre.dispose(); fenetre.dispose();
grille.AfficherGrille(grille.ChargerGrille(cheminFichier),false, true, 0); Grille.AfficherGrille(Grille.ChargerGrille(cheminFichier),false, true, 0);
} else { } else {
fenetre.dispose(); fenetre.dispose();
long debut = System.nanoTime(); long debut = System.nanoTime();
int[][] grille_resolue = new int[9][9]; int[][] grille_resolue = new int[9][9];
grille_resolue = resolveurGrille.resoudreGrille(grille.ChargerGrille(cheminFichier)); grille_resolue = resolveurGrille.resoudreGrille(Grille.ChargerGrille(cheminFichier));
long fin = System.nanoTime(); long fin = System.nanoTime();
long duree = fin - debut; long duree = fin - debut;
grille.AfficherGrille(grille_resolue,false, false, duree); Grille.AfficherGrille(grille_resolue,false, false, duree);
} }
} else { } else {
InfoLogiciel.setText(" Info : Erreur : Veuillez selectionner un fichier .gri"); InfoLogiciel.setText(" Info : Erreur : Veuillez selectionner un fichier .gri");
@ -104,12 +128,22 @@ public class menuProgramme2 {
}); });
quitter.addActionListener(new ActionListener() { quitter.addActionListener(new ActionListener() {
/**
* Ferme l'application.
*
* @param e3 L'événement d'action.
*/
public void actionPerformed(ActionEvent e3) { public void actionPerformed(ActionEvent e3) {
System.exit(0); System.exit(0);
} }
}); });
manuel.addActionListener(new ActionListener() { manuel.addActionListener(new ActionListener() {
/**
* Définit le mode de résolution manuel.
*
* @param e1 L'événement d'action.
*/
@Override @Override
public void actionPerformed(ActionEvent e1) { public void actionPerformed(ActionEvent e1) {
ResolutionManuel = true; ResolutionManuel = true;
@ -117,6 +151,11 @@ public class menuProgramme2 {
}); });
auto.addActionListener(new ActionListener() { auto.addActionListener(new ActionListener() {
/**
* Définit le mode de résolution automatique.
*
* @param e L'événement d'action.
*/
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
ResolutionManuel = false; ResolutionManuel = false;

View File

@ -1,29 +1,48 @@
import java.util.Arrays; import java.util.Arrays;
/**
* Classe pour résoudre une grille de Sudoku.
*
* @author Julian GALLEGO
* @author Wilfried BRIGITTE
*/
public class resolveurGrille { public class resolveurGrille {
private static int[][] solution = new int[9][9]; private static int[][] solution = new int[9][9];
private static boolean stop = false; private static boolean stop = false;
/**
* Résout une grille de Sudoku.
*
* @param grille La grille à résoudre.
* @return La grille résolue.
*/
public static int[][] resoudreGrille(int[][] grille) { public static int[][] resoudreGrille(int[][] grille) {
/*remise à zéro de la solution*/ // Remise à zéro de la solution
for (int i = 0; i < 9; i++) { for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) { for (int j = 0; j < 9; j++) {
solution[i][j] = 0; solution[i][j] = 0;
} }
} }
/* Réinitialiser la valeur de stop à chaque début de résolution*/ // Réinitialiser la valeur de stop à chaque début de résolution
resoudreSudoku(grille); resoudreSudoku(grille);
return solution; return solution;
} }
/**
* Résout une grille de Sudoku.
*
* @param grille La grille à résoudre.
* @return true si une solution a été trouvée, sinon false.
*/
public static boolean resoudreSudoku(int[][] grille) { public static boolean resoudreSudoku(int[][] grille) {
/*parcourage la grille*/ //Parcours la grille
stop = false; stop = false;
for (int row = 0; row < 9; row++) { for (int row = 0; row < 9; row++) {
for (int col = 0; col < 9; col++) { for (int col = 0; col < 9; col++) {
if (grille[row][col] == 0) { if (grille[row][col] == 0) {
/*essayer les chiffres de 1 a 9 pour la case vide*/ //essayer les chiffres de 1 a 9 pour la case vide
for (int num = 1; num <= 9; num++) { for (int num = 1; num <= 9; num++) {
if (isValid(grille, row, col, num)) { if (isValid(grille, row, col, num)) {
grille[row][col] = num; grille[row][col] = num;
@ -31,37 +50,45 @@ public class resolveurGrille {
if (stop) { if (stop) {
return true; return true;
} }
grille[row][col] = 0; /*réinitialiser la case si la solution n'est pas trouvée*/ grille[row][col] = 0; //réinitialiser la case si la solution n'est pas trouvée
} }
} }
return false; /* Si aucune solution trouvée à cette étape on s'arrêtee*/ return false; //Si aucune solution trouvée à cette étape on s'arrête
} }
} }
} }
/*copier l a grille résolue dans la solution*/ //copier l a grille résolue dans la solution
for (int i = 0; i < 9; i++) { for (int i = 0; i < 9; i++) {
System.arraycopy(grille[i], 0, solution[i], 0, 9); System.arraycopy(grille[i], 0, solution[i], 0, 9);
} }
return stop = true; return stop = true;
} }
/*Méthode pour vérifier la validité d'un chiffre dans une case donnée*/ /**
* Vérifie si un chiffre est valide dans une case donnée.
*
* @param grille La grille de Sudoku.
* @param row L'indice de ligne de la case.
* @param col L'indice de colonne de la case.
* @param num Le chiffre à vérifier.
* @return true si le chiffre est valide, sinon false.
*/
public static boolean isValid(int[][] grille, int row, int col, int num) { public static boolean isValid(int[][] grille, int row, int col, int num) {
/*Vérifier la ligne*/ //Vérifier la ligne
for (int x = 0; x < 9; x++) { for (int x = 0; x < 9; x++) {
if (grille[row][x] == num) { if (grille[row][x] == num) {
return false; return false;
} }
} }
/*Vérifier la colonne*/ //Vérifier la colonne
for (int x = 0; x < 9; x++) { for (int x = 0; x < 9; x++) {
if (grille[x][col] == num) { if (grille[x][col] == num) {
return false; return false;
} }
} }
/*Vérifier la sous-grille 3x3*/ //Vérifier la sous-grille 3x3
int startRow = row - row % 3; int startRow = row - row % 3;
int startCol = col - col % 3; int startCol = col - col % 3;
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {