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.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusAdapter;
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*/
public static JFrame fenetre = new JFrame();
/*fonction pour afficher graphiquement la grille*/
/**
* Affiche graphiquement la grille de Sudoku.
*
* @param grille La grille de Sudoku à afficher.
* @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) {
/*paramètre de base de la fenetre*/
//paramètre de base de la fenetre
fenetre.setSize(900, 950);
fenetre.setResizable(false);
fenetre.setLocationRelativeTo(null);
@ -36,13 +48,13 @@ public class grille extends JComponent{
place_grille.setSize(900,900);
/*creation grille*/
//creation grille
GridLayout gestionnaire = new GridLayout(9,9,-2,-2);
place_grille.setLayout(gestionnaire);
JTextField[][] case_editable = null;
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){
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 exporter = null;
JPanel bouton_grille = new JPanel();
/*affichage des boutons en fonction du programme lancé*/
//affichage des boutons en fonction du programme lancé
if(editable){
bouton_grille.add(etat_exportation);
exporter = new JButton("exporter");
@ -136,10 +148,10 @@ public class grille extends JComponent{
fenetre.add(bouton_grille,BorderLayout.SOUTH);
fenetre.add(place_grille, BorderLayout.CENTER);
/*affichage fenetre*/
//affichage fenetre
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 col = 0; col < 9; col++) {
final int finalLigne = ligne;
@ -173,17 +185,27 @@ public class grille extends JComponent{
}
/*événement des boutons*/
if (verifier != null) { /* Vérification pour s'assurer que verifier a été initialisé */
//événement des boutons
if (verifier != null) { // Vérification pour s'assurer que verifier a été initialisé
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) {
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() {
/**
* permet d'exporter votre grille édité.
*
* @param exporeter
*/
public void actionPerformed(ActionEvent exporter) {
if (!(resolveurGrille.resoudreSudoku(GrilleActuelle()))){
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){
try {
FileInputStream fs = new FileInputStream(cheminFichier);
@ -236,7 +263,11 @@ public class grille extends JComponent{
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){
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(){
int[][] grilleActuelle = new int[9][9];
@ -291,7 +326,11 @@ public class grille extends JComponent{
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(){
int[][] soluce_de_la_grille = new int[9][9];
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.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
{
private int max;
@ -9,6 +16,15 @@ public class JTextFieldCharLimit extends PlainDocument
super();
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 {
if (text == null){
return;
@ -17,7 +33,7 @@ public class JTextFieldCharLimit extends PlainDocument
sb.append(getText(0, getLength()));
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]*")) {
super.insertString(offset, text, attr);
}

View File

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

View File

@ -14,13 +14,13 @@ mainProgramme2.class : mainProgramme2.java menuProgramme2.class
mainProgramme1.class : mainProgramme1.java menuProgramme1.class
${JC} ${JCFLAGS} mainProgramme1.java
grille.class : grille.java resolveurGrille.class JTextFieldCharLimit.class JeuFini.class
${JC} ${JCFLAGS} grille.java
Grille.class : Grille.java resolveurGrille.class JTextFieldCharLimit.class JeuFini.class
${JC} ${JCFLAGS} Grille.java
menuProgramme2.class : menuProgramme2.java resolveurGrille.class grille.class
menuProgramme2.class : menuProgramme2.java resolveurGrille.class Grille.class
${JC} ${JCFLAGS} menuProgramme2.java
menuProgramme1.class : menuProgramme1.java resolveurGrille.class grille.class
menuProgramme1.class : menuProgramme1.java resolveurGrille.class Grille.class
${JC} ${JCFLAGS} menuProgramme1.java
resolveurGrille.class : resolveurGrille.java
@ -34,10 +34,10 @@ JeuFini.class : JeuFini.java
### REGLES OPTIONNELLES ###
run1 : mainProgramme1.class
editeur : mainProgramme1.class
${JVM} ${JVMFLAGS} mainProgramme1
run2 : mainProgramme2.class
resolveur : mainProgramme2.class
${JVM} ${JVMFLAGS} mainProgramme2
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 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 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.io.*;
/**
* Menu pour le Programme 1 (Créateur de Sudoku).
*
* @author Julian GALLEGO
* @author Wilfried BRIGITTE
*/
public class menuProgramme1 {
private static String cheminFichier = null;
/**
* Affiche le menu du Programme 1 qui permet créer et d'editer une grille .
*/
public static void menuProgramme1() {
/*fenetre*/
// création de la fenêtre
JFrame fenetre = new JFrame();
fenetre.setSize(500, 200);
fenetre.setTitle("Sudoku Creator (By Wilfried BRIGITTE & Julian GALLEGO)");
@ -19,8 +28,7 @@ public class menuProgramme1 {
GridLayout gestionnaire = new GridLayout(4,1);
fenetre.setLayout(gestionnaire);
/*composants G*/
//composants graphique
JLabel titre = new JLabel("Sudoku Creator");
titre.setHorizontalAlignment(JLabel.CENTER);
titre.setFont(new Font("Arial", Font.PLAIN, 25));
@ -47,11 +55,16 @@ public class menuProgramme1 {
InfoLogiciel.setFont(new Font("Arial", Font.PLAIN, 11));
fenetre.add(InfoLogiciel);
/*affichage*/
//affichage de la fenêtre
fenetre.setVisible(true);
/*evenements*/
//Evenements
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) {
try {
JFileChooser filechooser = new JFileChooser();
@ -71,6 +84,11 @@ public class menuProgramme1 {
});
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){
int[][] grille_vide = null;
grille_vide = new int[9][9];
@ -82,23 +100,33 @@ public class menuProgramme1 {
}
fenetre.dispose();
grille.AfficherGrille(grille_vide, true, false, 0);
Grille.AfficherGrille(grille_vide, true, false, 0);
}
});
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){
if (cheminFichier == null){
InfoLogiciel.setText(" Info : Erreur : Veuillez selectionner un fichier .gri");
InfoLogiciel.setForeground(Color.RED);
}else{
fenetre.dispose();
grille.AfficherGrille(grille.ChargerGrille(cheminFichier), true, false, 0);
Grille.AfficherGrille(Grille.ChargerGrille(cheminFichier), true, false, 0);
}
}
});
quitter.addActionListener(new ActionListener() {
/**
* Ferme l'application.
*
* @param e3 L'événement d'action.
*/
public void actionPerformed(ActionEvent e3) {
System.exit(0);
}

View File

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

View File

@ -1,29 +1,48 @@
import java.util.Arrays;
/**
* Classe pour résoudre une grille de Sudoku.
*
* @author Julian GALLEGO
* @author Wilfried BRIGITTE
*/
public class resolveurGrille {
private static int[][] solution = new int[9][9];
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) {
/*remise à zéro de la solution*/
// Remise à zéro de la solution
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
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);
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) {
/*parcourage la grille*/
//Parcours la grille
stop = false;
for (int row = 0; row < 9; row++) {
for (int col = 0; col < 9; col++) {
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++) {
if (isValid(grille, row, col, num)) {
grille[row][col] = num;
@ -31,37 +50,45 @@ public class resolveurGrille {
if (stop) {
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++) {
System.arraycopy(grille[i], 0, solution[i], 0, 9);
}
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) {
/*Vérifier la ligne*/
//Vérifier la ligne
for (int x = 0; x < 9; x++) {
if (grille[row][x] == num) {
return false;
}
}
/*Vérifier la colonne*/
//Vérifier la colonne
for (int x = 0; x < 9; x++) {
if (grille[x][col] == num) {
return false;
}
}
/*Vérifier la sous-grille 3x3*/
//Vérifier la sous-grille 3x3
int startRow = row - row % 3;
int startCol = col - col % 3;
for (int i = 0; i < 3; i++) {