Squashed commit of the following:

commit 41f1be6be7
Author: ROGER <gwendal.roger@etu.univ-lyon1.fr>
Date:   Tue Feb 4 16:18:24 2025 +0100

    04/02/2025 : Ajout de Console.errorln pour les remontée d'erreurs

commit ef3506c4eb
Author: ROGER <gwendal.roger@etu.univ-lyon1.fr>
Date:   Tue Feb 4 16:07:59 2025 +0100

    04/02/2025 : Ajout de la JavaDoc

commit f57aa34d36
Author: Morph01 <thibaut6969delastreet@gmail.com>
Date:   Mon Feb 3 11:37:12 2025 +0100

    Squashed commit of the following:

    commit 60c1634e1a159bf992b2ed1cdff632490294c48b
    Author: Morph01 <thibaut6969delastreet@gmail.com>
    Date:   Mon Feb 3 11:36:25 2025 +0100

        fix: remove .idea et .vscode
This commit is contained in:
2025-02-09 10:23:09 +01:00
parent a060cde5b2
commit ea868017ee
21 changed files with 212 additions and 283 deletions

View File

@@ -5,6 +5,10 @@ public class App {
return "Hello World!";
}
/**
* Méthode main permettant de lancer l'application sudoku et d'afficher les erreurs s'il y en a.
* @param args
*/
public static void main(String[] args) {
System.out.println(new App().getGreeting());

View File

@@ -2,30 +2,72 @@ package sudoku;
import java.util.ArrayList;
import java.util.List;
public class Bloc {
private final List<Case> cases;
private final String couleur;
private final int couleurIndex;
/**
* Constructeur permettant de créer un bloc de couleur
* @param couleur
* @param couleurIndex
*/
public Bloc(String couleur, int couleurIndex) {
this.cases = new ArrayList<>();
this.couleur = couleur;
this.couleurIndex = couleurIndex;
}
/**
* Méthode permettant d'ajouter une case à un bloc
* @param c
*/
public void ajouterCase(Case c) {
cases.add(c);
}
/**
* Méthode permettant de savoir si une case contient un symbole précis
* @param s
* @return
*/
public boolean contains(Symbole s) {
for (Case c : cases) {
if (c.getSymbole().equals(s)) {
return true;
}
}
return false;
}
/**
* Méthode permettant de renvoyer la couleur d'un bloc
* @return
*/
public String getCouleur() {
return couleur;
}
/**
* Méthode permettant de renvoyer l'index de couleur d'un bloc
* @return
*/
public int getCouleurIndex() {
return couleurIndex;
}
/**
* Méthode permettant de renvoyer une liste de cases associée à un bloc
* @return
*/
public List<Case> getCases() {
return cases;
}
/**
* Méthode permettant d'afficher un bloc complet avec les cases qui le compose
* @return
*/
@Override
public String toString() {
return "Bloc [cases=" + cases + ", couleur=" + couleur + ", couleurIndex=" + couleurIndex + " \u001B[0m]";

View File

@@ -5,28 +5,54 @@ public class Case {
private final int colonne;
private Symbole symbole;
/**
* Constructeur permettant de créer une case grace aux paramètres suivants :
* @param ligne
* @param colonne
* @param symbole
*/
public Case(int ligne, int colonne, Symbole symbole) {
this.ligne = ligne;
this.colonne = colonne;
this.symbole = symbole;
}
/**
* Méthode permettant de renvoyer la coordonnée de la ligne qui compose la case
* @return
*/
public int getLigne() {
return ligne;
}
/**
* Méthode permettant de renvoyer la coordonnée de la colonne qui compose la case
* @return
*/
public int getColonne() {
return colonne;
}
/**
* Méthode permettant de renvoyer le symbole qui compose la case
* @return
*/
public Symbole getSymbole() {
return symbole;
}
/**
* Méthode permettant de modifier le symbole qui compose la case
* @param symbole
*/
public void setSymbole(Symbole symbole) {
this.symbole = symbole;
}
/**
* Méthode qui permet d'afficher le symbole de la case ou "-" si la case est vide
* @return
*/
@Override
public String toString() {
return (symbole == null) ? "-" : symbole.toString();

View File

@@ -1,5 +1,8 @@
package sudoku;
/**
* Interface permettant d'évaluer toutes les contraintes et de retourner un boolean indiquant si elles ont étés respectées.
*/
public interface Contrainte {
boolean estRespectee(Grille grille, Case c);
}

View File

@@ -1,6 +1,14 @@
package sudoku;
public class ContrainteBloc implements Contrainte {
/**
* Méthode permettant de savoir si l'ensemble des contraintes concernant le bloc sont respectées.</br>
* Renvoie 0 si au moins l'une des contraintes n'est pas respectée </br>
* Renvoie 1 si toutes les contraintes sont respectées
* @param grille
* @param c
* @return
*/
@Override
public boolean estRespectee(Grille grille, Case c) {
int blocSize = (int) Math.sqrt(grille.getTaille());

View File

@@ -1,6 +1,14 @@
package sudoku;
public class ContrainteColonne implements Contrainte {
/**
* Méthode permettant de savoir si l'ensemble des contraintes concernant la colonne sont respectées.</br>
* Renvoie 0 si au moins l'une des contraintes n'est pas respectée</br>
* Renvoie 1 si toutes les contraintes sont respectées
* @param grille
* @param c
* @return
*/
@Override
public boolean estRespectee(Grille grille, Case c) {
int colonne = c.getColonne();

View File

@@ -1,6 +1,14 @@
package sudoku;
public class ContrainteLigne implements Contrainte {
/**
* Méthode permettant de savoir si l'ensemble des contraintes concernant la ligne sont respectées.</br>
* Renvoie 0 si au moins l'une des contraintes n'est pas respectée</br>
* Renvoie 1 si toutes les contraintes sont respectées
* @param grille
* @param c
* @return
*/
@Override
public boolean estRespectee(Grille grille, Case c) {
int ligne = c.getLigne();

View File

@@ -17,6 +17,11 @@ public class Grille {
private Multidoku multidoku; // Référence à Multidoku
private List<String> generatedColors;
/**
* Constructeur permettant d'initialiser une griller grace aux paramètres suivants :
* @param taille
* @param sudoku
*/
public Grille(int taille, Sudoku sudoku) {
this.taille = taille;
this.cases = new Case[taille][taille];
@@ -79,6 +84,12 @@ public class Grille {
}
}
/**
* Méthode permettant de connaitre la valeur d'une case (symbole) grace aux paramètres suivants :
* @param ligne
* @param colonne
* @return
*/
public Case getCase(int ligne, int colonne) {
return cases[ligne][colonne];
}
@@ -274,17 +285,29 @@ public class Grille {
}
} catch (Exception e) {
Console.errorln("Une erreur est survenue : " + e.getMessage());
Console.errorln("Une erreur est survenue : " + e.getMessage());
}
}
/**
* Méthode permettant de retourner la liste des symboles possible. Cela dépend de ce qu'a saisit l'utilisateur dans la méthode askSetSymbolesPossibles
* @return
*/
public List<Symbole> getSymbolesPossibles() {
return symbolesPossibles;
}
/**
* Méthode permettant d'ajouter un symbole à la liste des symboles possibles
* @param symbolesPossibles
*/
public void setSymbolesPossibles(ArrayList<Symbole> symbolesPossibles) {
this.symbolesPossibles = symbolesPossibles;
}
/**
* Méthode permettant d'afficher la liste des symboles possibles
*/
public void printSymbolesPossibles() {
StringBuilder sb = new StringBuilder();
for (Symbole symbole : symbolesPossibles) {
@@ -293,6 +316,10 @@ public class Grille {
System.out.println(sb);
}
/**
* Méthode permettant de retourner la taille de la grille
* @return
*/
public int getTaille() {
return taille;
}
@@ -334,6 +361,10 @@ public class Grille {
return true;
}
/**
* Méthode permettant de retourner la longueure du symbole le plus long pour dimensionner corectement les cases et la grille
* @return
*/
public int getLongueurSymboleLePlusLong() {
int max = 0;
for (Symbole symbole : symbolesPossibles) {
@@ -344,6 +375,10 @@ public class Grille {
return max;
}
/**
* Méthode permettant d'afficher la grille
* @return
*/
@Override
public String toString() {
StringBuilder sb = new StringBuilder();

View File

@@ -6,6 +6,14 @@ import sudoku.core.Console;
public class ResolveurBacktraceSimple implements Resolveur {
/**
* Méthode permettant de résoudre un sudoku à partir des paramètres suivant :</br>
* - S : Sudoku</br>
* - afficherEtape : 0 ou 1
* @param s
* @param afficherEtape
* @return
*/
@Override
public boolean resoudre(Sudoku s, boolean afficherEtape) {
EtatResolution etat = new EtatResolution(0, 0);
@@ -45,15 +53,27 @@ public class ResolveurBacktraceSimple implements Resolveur {
return true; // Si la grille est déjà résolue
}
/**
* Méthode permettant d'afficher le sudoku à chaque étape de sa résolution
* @param s
* @param compteur
* @param compteurGeneral
*/
private void afficherEtapeResolution(Sudoku s, int compteur, int compteurGeneral) {
System.out.println("Sudoku, Etape " + compteur + " (Tentative " + compteurGeneral + ")");
System.out.println(s.getGrille().toString());
}
private static class EtatResolution {
int compteur;
int compteurGeneral;
/**
* Méthode permettant de fixer l'état de la résolution
* @param compteur
* @param compteurGeneral
*/
EtatResolution(int compteur, int compteurGeneral) {
this.compteur = compteur;
this.compteurGeneral = compteurGeneral;

View File

@@ -14,6 +14,10 @@ public class Sudoku {
private final List<Contrainte> contraintes;
private String nom;
/**
* Constructeur permettant d'initialiser un sudoku à partir de la taille de sa grille
* @param taille
*/
public Sudoku(int taille) {
this.grille = new Grille(taille, this);
this.contraintes = new ArrayList<>();
@@ -56,6 +60,10 @@ public class Sudoku {
return grille.verifierToutesContraintes(contraintes);
}
/**
* Méthode permettant de retourner la grille complète
* @return
*/
public Grille getGrille() {
return grille;
}
@@ -331,10 +339,10 @@ public class Sudoku {
try {
tailleGrille = Integer.parseInt(scanner.nextLine());
if (tailleGrille <= 0) {
System.out.println("Erreur : Veuillez entrer un entier positif.");
Console.errorln("Erreur : Veuillez entrer un entier positif.");
}
} catch (NumberFormatException e) {
System.out.println("Erreur : Entrée invalide. Veuillez entrer un nombre.");
Console.errorln("Erreur : Entrée invalide. Veuillez entrer un nombre.");
}
}
return tailleGrille;
@@ -400,14 +408,14 @@ public class Sudoku {
break; // Sortie de la boucle si l'utilisateur tape ESC
}
if (input.isEmpty()) {
System.out.println("Veuillez entrer un numéro de ligne valide.");
Console.errorln("Veuillez entrer un numéro de ligne valide.");
continue; // Recommencer la saisie de la ligne si l'entrée est vide
}
try {
ligne = Integer.parseInt(input); // Convertir la ligne en entier
break; // Sortir de la boucle si la ligne est valide
} catch (NumberFormatException e) {
System.out.println("Veuillez entrer un numéro de ligne valide (un nombre entier).");
Console.errorln("Veuillez entrer un numéro de ligne valide (un nombre entier).");
}
}
// ARRET DE LA BOUCLE SI SAISIE DE "ESC"
@@ -421,14 +429,14 @@ public class Sudoku {
System.out.println("Entrez le numéro de colonne :");
input = scanner.nextLine(); // Lire la colonne
if (input.isEmpty()) {
System.out.println("Veuillez entrer un numéro de colonne valide.");
Console.errorln("Veuillez entrer un numéro de colonne valide.");
continue; // Recommencer la saisie de la colonne si l'entrée est vide
}
try {
colonne = Integer.parseInt(input); // Convertir la colonne en entier
break; // Sortir de la boucle si la colonne est valide
} catch (NumberFormatException e) {
System.out.println("Veuillez entrer un numéro de colonne valide (un nombre entier).");
Console.errorln("Veuillez entrer un numéro de colonne valide (un nombre entier).");
}
}
@@ -438,7 +446,7 @@ public class Sudoku {
System.out.println("Entrez le symbole :");
symbole = scanner.nextLine(); // Lire le symbole
if (symbole.isEmpty()) {
System.out.println("Veuillez entrer un symbole valide.");
Console.errorln("Veuillez entrer un symbole valide.");
continue; // Recommencer la saisie du symbole si l'entrée est vide
}
try {
@@ -501,7 +509,7 @@ public class Sudoku {
// Vérification des limites
if (choixLigne < 0 || choixLigne >= tailleGrille || choixColonne < 0
|| choixColonne >= tailleGrille) {
System.out.println("Erreur : Coordonnées hors limites ! Veuillez réessayer.");
Console.errorln("Erreur : Coordonnées hors limites ! Veuillez réessayer.");
coordonneesValides = false;
continue;
}
@@ -509,7 +517,7 @@ public class Sudoku {
// Vérification si la coordonnée existe déjà dans TOUTE la grille
String coordonneeStr = choixLigne + "-" + choixColonne;
if (toutesLesCoordonnees.contains(coordonneeStr)) {
System.out.println(
Console.errorln(
"Erreur : Ces coordonnées sont déjà utilisées dans un autre bloc ! Veuillez en entrer une nouvelle.");
coordonneesValides = false;
}
@@ -526,7 +534,7 @@ public class Sudoku {
sudoku.getGrille().creerBlocPersonnalise(listeCases);
System.out.println("Bloc " + nombreBloc + " enregistré avec succès !");
} catch (IllegalArgumentException e) {
System.out.println("Erreur lors de la création du bloc : " + e.getMessage());
Console.errorln("Erreur lors de la création du bloc : " + e.getMessage());
System.out.println("Veuillez recommencer la saisie de ce bloc.");
continue; // Recommence le bloc en cours
}

View File

@@ -3,23 +3,46 @@ package sudoku;
public class Symbole {
private final String valeur;
/**
* Constructeur permettant de créer un symbole
* @param symbole
*/
public Symbole(String symbole) {
this.valeur = symbole;
}
/**
* Méthode permettant de créer un symbole de type String
* @param s
* @return
*/
// Factory methods pour différents types
public static Symbole of(String s) {
return new Symbole(s);
}
/**
* Méthode permettant de créer un symbole de type int
* @param n
* @return
*/
public static Symbole of(int n) {
return new Symbole(String.valueOf(n));
}
/**
* Méthode permettant de créer un symbole de type char
* @param c
* @return
*/
public static Symbole of(char c) {
return new Symbole(String.valueOf(c));
}
/**
* Méthode permettant de vérifier si un symbole est de type int
* @return
*/
public boolean isInt() {
try {
Integer.parseInt(valeur);
@@ -29,15 +52,28 @@ public class Symbole {
}
}
/**
* Méthode permettant de vérifier si un symbole est de type letter (char)
* @return
*/
public boolean isLetter() {
return valeur.length() == 1 && Character.isLetter(valeur.charAt(0));
}
/**
* Méthode permettant de vérifier si un symbole est de type string
* @return
*/
@Override
public String toString() {
return valeur;
}
/**
* Méthode permettant de retourner un booléen si 2 objets sont identiques
* @param obj
* @return
*/
@Override
public boolean equals(Object obj) {
if (this == obj)