refactor: enhance code documentation and remove unnecessary greeting outputs in tests

This commit is contained in:
2025-02-09 15:57:52 +01:00
parent 86fe45c358
commit 7968d5fede
28 changed files with 440 additions and 131 deletions

View File

@@ -3,20 +3,25 @@ package sudoku;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
/**
* Classe principale de l'application sudoku.
*/
public class App { public class App {
private static final Logger logger = Logger.getLogger(App.class.getName()); private static final Logger logger = Logger.getLogger(App.class.getName());
public String getGreeting() { /**
return "Hello World!"; * Constructeur privé pour empêcher l'instanciation de la classe App.
*/
private App() {
} }
/** /**
* Méthode main permettant de lancer l'application sudoku et d'afficher les erreurs s'il y en a. * Méthode main permettant de lancer l'application sudoku et d'afficher les
* erreurs s'il y en a.
*
* @param args : arguments passés en paramètre * @param args : arguments passés en paramètre
*/ */
public static void main(String[] args) { public static void main(String[] args) {
System.out.println(new App().getGreeting());
try { try {
Sudoku.menu(); Sudoku.menu();
} catch (Exception e) { } catch (Exception e) {

View File

@@ -2,6 +2,10 @@ package sudoku;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/**
* Classe permettant de créer un bloc de couleur.
*/
public class Bloc { public class Bloc {
private final List<Case> cases; private final List<Case> cases;
private final String couleur; private final String couleur;
@@ -9,7 +13,8 @@ public class Bloc {
/** /**
* Constructeur permettant de créer un bloc de couleur * Constructeur permettant de créer un bloc de couleur
* @param couleur : couleur du bloc *
* @param couleur : couleur du bloc
* @param couleurIndex : index de la couleur * @param couleurIndex : index de la couleur
*/ */
public Bloc(String couleur, int couleurIndex) { public Bloc(String couleur, int couleurIndex) {
@@ -20,6 +25,7 @@ public class Bloc {
/** /**
* Méthode permettant d'ajouter une case à un bloc * Méthode permettant d'ajouter une case à un bloc
*
* @param c : case à ajouter * @param c : case à ajouter
*/ */
public void ajouterCase(Case c) { public void ajouterCase(Case c) {
@@ -28,6 +34,7 @@ public class Bloc {
/** /**
* Méthode permettant de renvoyer la couleur d'un bloc * Méthode permettant de renvoyer la couleur d'un bloc
*
* @return couleur du bloc * @return couleur du bloc
*/ */
public String getCouleur() { public String getCouleur() {
@@ -36,6 +43,7 @@ public class Bloc {
/** /**
* Méthode permettant de renvoyer une liste de cases associée à un bloc * Méthode permettant de renvoyer une liste de cases associée à un bloc
*
* @return liste de cases * @return liste de cases
*/ */
public List<Case> getCases() { public List<Case> getCases() {
@@ -44,6 +52,7 @@ public class Bloc {
/** /**
* Méthode permettant d'afficher un bloc complet avec les cases qui le composent * Méthode permettant d'afficher un bloc complet avec les cases qui le composent
*
* @return bloc complet avec les cases, la couleur et l'index de la couleur * @return bloc complet avec les cases, la couleur et l'index de la couleur
*/ */
@Override @Override

View File

@@ -1,5 +1,8 @@
package sudoku; package sudoku;
/**
* Classe permettant de créer une case.
*/
public class Case { public class Case {
private final int ligne; private final int ligne;
private final int colonne; private final int colonne;
@@ -7,7 +10,8 @@ public class Case {
/** /**
* Constructeur permettant de créer une case grace aux paramètres suivants : * Constructeur permettant de créer une case grace aux paramètres suivants :
* @param ligne : coordonnée de la ligne *
* @param ligne : coordonnée de la ligne
* @param colonne : coordonnée de la colonne * @param colonne : coordonnée de la colonne
* @param symbole : symbole de la case * @param symbole : symbole de la case
*/ */
@@ -19,6 +23,7 @@ public class Case {
/** /**
* Méthode permettant de renvoyer la coordonnée de la ligne qui compose la case * Méthode permettant de renvoyer la coordonnée de la ligne qui compose la case
*
* @return ligne * @return ligne
*/ */
public int getLigne() { public int getLigne() {
@@ -26,7 +31,9 @@ public class Case {
} }
/** /**
* Méthode permettant de renvoyer la coordonnée de la colonne qui compose la case * Méthode permettant de renvoyer la coordonnée de la colonne qui compose la
* case
*
* @return colonne * @return colonne
*/ */
public int getColonne() { public int getColonne() {
@@ -35,6 +42,7 @@ public class Case {
/** /**
* Méthode permettant de renvoyer le symbole qui compose la case * Méthode permettant de renvoyer le symbole qui compose la case
*
* @return symbole * @return symbole
*/ */
public Symbole getSymbole() { public Symbole getSymbole() {
@@ -43,6 +51,7 @@ public class Case {
/** /**
* Méthode permettant de modifier le symbole qui compose la case * Méthode permettant de modifier le symbole qui compose la case
*
* @param symbole : symbole de la case * @param symbole : symbole de la case
*/ */
public void setSymbole(Symbole symbole) { public void setSymbole(Symbole symbole) {
@@ -50,7 +59,9 @@ public class Case {
} }
/** /**
* Méthode qui permet d'afficher le symbole de la case ou "-" si la case est vide * Méthode qui permet d'afficher le symbole de la case ou "-" si la case est
* vide
*
* @return symbole de la case * @return symbole de la case
*/ */
@Override @Override

View File

@@ -1,8 +1,17 @@
package sudoku; package sudoku;
/** /**
* Interface permettant d'évaluer toutes les contraintes et de retourner un boolean indiquant si elles ont étés respectées. * Interface permettant d'évaluer toutes les contraintes et de retourner un
* boolean indiquant si elles ont étés respectées.
*/ */
public interface Contrainte { public interface Contrainte {
/**
* Méthode permettant de savoir si l'ensemble des contraintes concernant une
* case sont respectées.
*
* @param grille : Grille
* @param c : Case
* @return boolean : true si toutes les contraintes sont respectées, false sinon
*/
boolean estRespectee(Grille grille, Case c); boolean estRespectee(Grille grille, Case c);
} }

View File

@@ -1,11 +1,17 @@
package sudoku; package sudoku;
/**
* Implémentation de l'interface Contrainte sur les blocs.
* Cette classe permet de vérifier si les contraintes sur les blocs sont
* respectées.
*/
public class ContrainteBloc implements Contrainte { public class ContrainteBloc implements Contrainte {
private final int blocRows; private final int blocRows;
private final int blocCols; private final int blocCols;
/** /**
* Constructeur permettant de créer une contrainte de bloc * Constructeur permettant de créer une contrainte de bloc
*
* @param blocRows : nombre de lignes du bloc * @param blocRows : nombre de lignes du bloc
* @param blocCols : nombre de colonnes du bloc * @param blocCols : nombre de colonnes du bloc
*/ */
@@ -15,9 +21,11 @@ public class ContrainteBloc implements Contrainte {
} }
/** /**
* Méthode permettant de savoir pour une case donnée si l'ensemble des contraintes concernant le bloc sont respectées.<br /> * Méthode permettant de savoir pour une case donnée si l'ensemble des
* contraintes concernant le bloc sont respectées.<br />
*
* @param grille : Grille * @param grille : Grille
* @param c : Case * @param c : Case
* @return boolean : true si toutes les contraintes sont respectées, false sinon * @return boolean : true si toutes les contraintes sont respectées, false sinon
*/ */
@Override @Override

View File

@@ -1,10 +1,24 @@
package sudoku; package sudoku;
/**
* Implémentation de l'interface Contrainte sur les colonnes.
* Cette classe permet de vérifier si les contraintes sur les colonnes sont
* respectées.
*/
public class ContrainteColonne implements Contrainte { public class ContrainteColonne implements Contrainte {
/** /**
* Méthode permettant de savoir pour une case donnée si l'ensemble des contraintes concernant la colonne sont respectées.<br /> * Constructeur de la classe ContrainteColonne
*/
public ContrainteColonne() {
}
/**
* Méthode permettant de savoir pour une case donnée si l'ensemble des
* contraintes concernant la colonne sont respectées.<br />
*
* @param grille : Grille * @param grille : Grille
* @param c : Case * @param c : Case
* @return boolean : true si toutes les contraintes sont respectées, false sinon * @return boolean : true si toutes les contraintes sont respectées, false sinon
*/ */
@Override @Override

View File

@@ -1,12 +1,26 @@
package sudoku; package sudoku;
/**
* Implémentation de l'interface Contrainte sur les lignes.
* Cette classe permet de vérifier si les contraintes sur les lignes sont
* respectées.
*/
public class ContrainteLigne implements Contrainte { public class ContrainteLigne implements Contrainte {
/** /**
* Méthode permettant de savoir si l'ensemble des contraintes concernant la ligne sont respectées.<br /> * Constructeur de la classe ContrainteLigne
*/
public ContrainteLigne() {
}
/**
* 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 0 si au moins l'une des contraintes n'est pas respectée<br />
* Renvoie 1 si toutes les contraintes sont respectées * Renvoie 1 si toutes les contraintes sont respectées
*
* @param grille : Grille * @param grille : Grille
* @param c : Case * @param c : Case
* @return boolean : true si toutes les contraintes sont respectées, false sinon * @return boolean : true si toutes les contraintes sont respectées, false sinon
*/ */
@Override @Override

View File

@@ -6,8 +6,11 @@ import java.util.Objects;
import java.util.Scanner; import java.util.Scanner;
import sudoku.core.Console; import sudoku.core.Console;
import sudoku.gui.ColorGenerator; import sudoku.core.GenerateurCouleur;
/**
* Classe Grille permettant de créer une grille de sudoku.
*/
public class Grille { public class Grille {
private final int taille; private final int taille;
private final Case[][] cases; private final Case[][] cases;
@@ -40,6 +43,12 @@ public class Grille {
} }
} }
/**
* Méthode permettant de mettre à jour la référence au multidoku
*
* @param multidoku : multidoku
* @see Multidoku
*/
public void setMultidoku(Multidoku multidoku) { public void setMultidoku(Multidoku multidoku) {
this.multidoku = multidoku; this.multidoku = multidoku;
} }
@@ -51,20 +60,34 @@ public class Grille {
*/ */
private void initColors() { private void initColors() {
// nombre de couleurs = nombre de blocs (pour sudoku classique) // nombre de couleurs = nombre de blocs (pour sudoku classique)
List<ColorGenerator.Color> colors = ColorGenerator.greatScheme(taille); List<GenerateurCouleur.Couleur> colors = GenerateurCouleur.paletteCouleurEtendue(taille);
generatedColors = new ArrayList<>(); generatedColors = new ArrayList<>();
for (ColorGenerator.Color color : colors) { for (GenerateurCouleur.Couleur color : colors) {
generatedColors.add(convertToAnsi(color)); generatedColors.add(convertToAnsi(color));
} }
} }
private String convertToAnsi(ColorGenerator.Color color) { /**
* Convertit une couleur en format ANSI pour l'affichage en console.
*
* @param color : couleur à convertir
* @return couleur convertie
*/
private String convertToAnsi(GenerateurCouleur.Couleur color) {
int r = Math.round(color.r * 255); int r = Math.round(color.r * 255);
int g = Math.round(color.g * 255); int g = Math.round(color.g * 255);
int b = Math.round(color.b * 255); int b = Math.round(color.b * 255);
return String.format("\u001B[38;2;%d;%d;%dm", r, g, b); return String.format("\u001B[38;2;%d;%d;%dm", r, g, b);
} }
/**
* Méthode permettant de définir un symbole dans une case en fonction de sa
* ligne, de sa colonne et du symbole
*
* @param ligne : coordonnée de la ligne
* @param colonne : coordonnée de la colonne
* @param symbole : symbole à placer
*/
public void setCase(int ligne, int colonne, Symbole symbole) { public void setCase(int ligne, int colonne, Symbole symbole) {
try { try {
if (symbole != null && !symbolesPossibles.contains(symbole)) { if (symbole != null && !symbolesPossibles.contains(symbole)) {
@@ -175,9 +198,10 @@ public class Grille {
} }
/** /**
* Crée des blocs rectangulaires automatiquement à partir de la taille de la * Crée des blocs rectangulaires.
* grille. *
* Ne fonctionne pas pour les grilles dont la taille est un carré parfait. * @param blocHeight : hauteur du bloc
* @param blocWidth : largeur du bloc
*/ */
public void creerBlocRectangulaire(int blocHeight, int blocWidth) { public void creerBlocRectangulaire(int blocHeight, int blocWidth) {
if (taille % blocHeight != 0 || taille % blocWidth != 0) { if (taille % blocHeight != 0 || taille % blocWidth != 0) {
@@ -208,12 +232,23 @@ public class Grille {
} }
} }
/**
* Méthode permettant d'afficher les blocs de la grille à l'aide de la méthode
* toString de la classe Bloc.
*/
public void printBlocs() { public void printBlocs() {
for (Bloc bloc : blocs) { for (Bloc bloc : blocs) {
System.out.println(bloc.toString()); System.out.println(bloc.toString());
} }
} }
/**
* Méthode utilisée pour le menu princial.
* Méthode permettant de choisir le type de symbole à utiliser pour la grille
*
* @param scanner : scanner pour lire l'entrée utilisateur
* @return int : choix de l'utilisateur
*/
public static int choisirTypeSymbole(Scanner scanner) { public static int choisirTypeSymbole(Scanner scanner) {
while (true) { while (true) {
System.out.println("Choisissez le type de symbole :"); System.out.println("Choisissez le type de symbole :");
@@ -235,6 +270,14 @@ public class Grille {
} }
} }
/**
* Méthode utilisée pour le menu principal.
* Méthode permettant de demander à l'utilisateur de saisir les symboles
* possibles pour la grille.
*
* @param choix : choix de l'utilisateur
* @param scanner : scanner pour lire l'entrée utilisateur
*/
public void askSetSymbolesPossibles(int choix, Scanner scanner) { public void askSetSymbolesPossibles(int choix, Scanner scanner) {
try { try {
for (int i = 0; i < taille; i++) { for (int i = 0; i < taille; i++) {

View File

@@ -1,19 +1,33 @@
package sudoku; package sudoku;
import java.util.*; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Classe représentant un Multidoku, c'est-à-dire une grille combinée de
* plusieurs
* sudokus, avec des contraintes de partage entre les cases.
*/
public class Multidoku { public class Multidoku {
private final List<SudokuPlacement> placements = new ArrayList<>(); private final List<SudokuPlacement> placements = new ArrayList<>();
private final List<ContrainteCasePartagee> contraintesPartagees; private final List<ContrainteCasePartagee> contraintesPartagees;
/**
* Constructeur de la classe Multidoku.
*/
public Multidoku() { public Multidoku() {
this.contraintesPartagees = new ArrayList<>(); this.contraintesPartagees = new ArrayList<>();
} }
/** /**
* Ajoute un sudoku à la grille combinée, avec un décalage spécifié par rapport à l'origine. * Ajoute un sudoku à la grille combinée, avec un décalage spécifié par rapport
* @param sudoku : sudoku à ajouter * à l'origine.
* @param offsetLigne : décalage de la ligne *
* @param sudoku : sudoku à ajouter
* @param offsetLigne : décalage de la ligne
* @param offsetColonne : décalage de la colonne * @param offsetColonne : décalage de la colonne
*/ */
public void ajouterSudoku(Sudoku sudoku, int offsetLigne, int offsetColonne) { public void ajouterSudoku(Sudoku sudoku, int offsetLigne, int offsetColonne) {
@@ -23,6 +37,7 @@ public class Multidoku {
/** /**
* Ajoute une contrainte de partage entre les cases spécifiées. * Ajoute une contrainte de partage entre les cases spécifiées.
*
* @param cases : liste de cases partagées * @param cases : liste de cases partagées
*/ */
public void ajouterCasesPartagees(List<Case> cases) { public void ajouterCasesPartagees(List<Case> cases) {
@@ -38,6 +53,7 @@ public class Multidoku {
/** /**
* Résout le Multidoku en utilisant un algorithme de backtracking. * Résout le Multidoku en utilisant un algorithme de backtracking.
*
* @param afficherEtape : true pour afficher les étapes de résolution * @param afficherEtape : true pour afficher les étapes de résolution
* @return true si une solution a été trouvée, false sinon * @return true si une solution a été trouvée, false sinon
*/ */
@@ -47,7 +63,9 @@ public class Multidoku {
} }
/** /**
* Collecte toutes les cases vides d'abord pour les cases partagées, puis pour les cases non partagées de la grille combinée. * Collecte toutes les cases vides d'abord pour les cases partagées, puis pour
* les cases non partagées de la grille combinée.
*
* @return liste de cases vides * @return liste de cases vides
*/ */
private List<GlobalCell> collecterCellulesVides() { private List<GlobalCell> collecterCellulesVides() {
@@ -79,9 +97,11 @@ public class Multidoku {
} }
/** /**
* Résout récursivement les cases vides de la grille combinée, en utilisant un algorithme de backtracking. * Résout récursivement les cases vides de la grille combinée, en utilisant un
* @param globalCells : liste de cases vides * algorithme de backtracking.
* @param index : index de la case actuelle *
* @param globalCells : liste de cases vides
* @param index : index de la case actuelle
* @param afficherEtape : true pour afficher les étapes de résolution * @param afficherEtape : true pour afficher les étapes de résolution
* @return true si une solution a été trouvée, false sinon * @return true si une solution a été trouvée, false sinon
*/ */
@@ -140,6 +160,7 @@ public class Multidoku {
/** /**
* Restaure les cases à leur état précédent en utilisant une sauvegarde. * Restaure les cases à leur état précédent en utilisant une sauvegarde.
*
* @param sauvegarde : sauvegarde des cases à restaurer * @param sauvegarde : sauvegarde des cases à restaurer
*/ */
private void restaurerCases(Map<Case, Symbole> sauvegarde) { private void restaurerCases(Map<Case, Symbole> sauvegarde) {
@@ -149,11 +170,13 @@ public class Multidoku {
} }
/** /**
* Affecte un symbole à une case, et propage la valeur dans les cases correspondantes des autres sudokus concernés. * Affecte un symbole à une case, et propage la valeur dans les cases
* @param ligne : ligne de la case * correspondantes des autres sudokus concernés.
*
* @param ligne : ligne de la case
* @param colonne : colonne de la case * @param colonne : colonne de la case
* @param symbole : symbole à affecter * @param symbole : symbole à affecter
* @param s : sudoku actuel * @param s : sudoku actuel
* @return true si l'affectation est valide, false sinon * @return true si l'affectation est valide, false sinon
*/ */
private boolean setCaseAvecPropagation(int ligne, int colonne, Symbole symbole, Sudoku s) { private boolean setCaseAvecPropagation(int ligne, int colonne, Symbole symbole, Sudoku s) {
@@ -192,6 +215,7 @@ public class Multidoku {
/** /**
* Trouve le sudoku auquel appartient une case donnée. * Trouve le sudoku auquel appartient une case donnée.
*
* @param c : case * @param c : case
* @return sudoku auquel appartient la case, ou null si non trouvé * @return sudoku auquel appartient la case, ou null si non trouvé
*/ */
@@ -206,6 +230,7 @@ public class Multidoku {
/** /**
* Vérifie si une case appartient à un sudoku donné. * Vérifie si une case appartient à un sudoku donné.
*
* @param c : case * @param c : case
* @param s : sudoku * @param s : sudoku
* @return true si la case appartient au sudoku, false sinon * @return true si la case appartient au sudoku, false sinon
@@ -225,6 +250,7 @@ public class Multidoku {
/** /**
* Vérifie si la grille combinée est valide. * Vérifie si la grille combinée est valide.
*
* @return true si la grille est valide, false sinon * @return true si la grille est valide, false sinon
*/ */
private boolean globalValide() { private boolean globalValide() {
@@ -241,6 +267,7 @@ public class Multidoku {
/** /**
* Vérifie si les contraintes partagées sont respectées. * Vérifie si les contraintes partagées sont respectées.
*
* @return true si les contraintes sont respectées, false sinon * @return true si les contraintes sont respectées, false sinon
*/ */
public boolean verifierContraintesPartagees() { public boolean verifierContraintesPartagees() {
@@ -250,6 +277,7 @@ public class Multidoku {
/** /**
* Vérifie si une case est partagée. * Vérifie si une case est partagée.
*
* @param c : case * @param c : case
* @return true si la case est partagée, false sinon * @return true si la case est partagée, false sinon
*/ */
@@ -266,10 +294,22 @@ public class Multidoku {
* Classe interne pour le placement d'un sudoku dans la grille combinée. * Classe interne pour le placement d'un sudoku dans la grille combinée.
*/ */
public static class GlobalCell { public static class GlobalCell {
/** Référence au sudoku auquel appartient cette cellule */
public Sudoku sudoku; public Sudoku sudoku;
/** Index de ligne dans la grille du sudoku parent */
public int ligne; public int ligne;
/** Index de colonne dans la grille du sudoku parent */
public int colonne; public int colonne;
/**
* Constructeur de la cellule globale.
*
* @param sudoku : sudoku
* @param ligne : ligne
* @param colonne : colonne
*/
public GlobalCell(Sudoku sudoku, int ligne, int colonne) { public GlobalCell(Sudoku sudoku, int ligne, int colonne) {
this.sudoku = sudoku; this.sudoku = sudoku;
this.ligne = ligne; this.ligne = ligne;
@@ -278,13 +318,14 @@ public class Multidoku {
} }
/** /**
Classe interne pour la contrainte de cases partagées. * Classe interne pour la contrainte de cases partagées.
*/ */
public static class ContrainteCasePartagee implements Contrainte { public static class ContrainteCasePartagee implements Contrainte {
private final Map<Case, Case> casesLiees; // Map associant chaque case à sa correspondante private final Map<Case, Case> casesLiees; // Map associant chaque case à sa correspondante
/** /**
* Constructeur de la contrainte de cases partagées. * Constructeur de la contrainte de cases partagées.
*
* @param cases : liste de cases partagées * @param cases : liste de cases partagées
*/ */
public ContrainteCasePartagee(List<Case> cases) { public ContrainteCasePartagee(List<Case> cases) {
@@ -322,7 +363,8 @@ public class Multidoku {
/** /**
* Vérifie si la contrainte de cases partagées est respectée. * Vérifie si la contrainte de cases partagées est respectée.
* @param grille : grille *
* @param grille : grille
* @param caseActuelle : case actuelle * @param caseActuelle : case actuelle
* @return true si la contrainte est respectée, false sinon * @return true si la contrainte est respectée, false sinon
*/ */
@@ -342,6 +384,7 @@ public class Multidoku {
/** /**
* Récupère la case correspondante à une case donnée. * Récupère la case correspondante à une case donnée.
*
* @param c : case * @param c : case
* @return case correspondante * @return case correspondante
*/ */
@@ -351,6 +394,7 @@ public class Multidoku {
/** /**
* Récupère la liste des cases partagées. * Récupère la liste des cases partagées.
*
* @return liste de cases partagées * @return liste de cases partagées
*/ */
public Set<Case> getCasesLiees() { public Set<Case> getCasesLiees() {
@@ -360,6 +404,7 @@ public class Multidoku {
/** /**
* Méthode toString pour l'affichage de la grille combinée. * Méthode toString pour l'affichage de la grille combinée.
*
* @return String : représentation de la grille combinée * @return String : représentation de la grille combinée
*/ */
@Override @Override

View File

@@ -1,5 +1,14 @@
package sudoku; package sudoku;
/**
* Interface permettant de résoudre un sudoku
*/
public interface Resolveur { public interface Resolveur {
/**
* Méthode permettant de résoudre un sudoku
* @param s : sudoku à résoudre
* @param afficherEtape : afficher les étapes de la résolution
* @return true si le sudoku est résolvable, false sinon
*/
boolean resoudre(Sudoku s, boolean afficherEtape); boolean resoudre(Sudoku s, boolean afficherEtape);
} }

View File

@@ -4,11 +4,27 @@ import java.util.List;
import sudoku.core.Console; import sudoku.core.Console;
/**
* Implémentation d'un résolveur de Sudoku utilisant l'algorithme de
* backtracking.
* Cette classe fournit une solution pour résoudre les grilles de Sudoku
* en testant systématiquement toutes les possibilités valides.
*/
public class ResolveurBacktraceSimple implements Resolveur { public class ResolveurBacktraceSimple implements Resolveur {
/** /**
* Méthode permettant de résoudre un sudoku en utilisant la méthode de backtracking * Constructeur par défaut du résolveur backtracking.
* @param s : sudoku à résoudre * Initialise un nouveau résolveur sans état initial.
*/
public ResolveurBacktraceSimple() {
// Constructeur par défaut
}
/**
* Méthode permettant de résoudre un sudoku en utilisant la méthode de
* backtracking
*
* @param s : sudoku à résoudre
* @param afficherEtape : afficher les étapes de la résolution * @param afficherEtape : afficher les étapes de la résolution
* @return true si le sudoku est résolvable, false sinon * @return true si le sudoku est résolvable, false sinon
*/ */
@@ -23,10 +39,12 @@ public class ResolveurBacktraceSimple implements Resolveur {
} }
/** /**
* Méthode récursive permettant de résoudre un sudoku, utilisant la méthode de backtracking. * Méthode récursive permettant de résoudre un sudoku, utilisant la méthode de
* @param s : sudoku à résoudre * backtracking.
*
* @param s : sudoku à résoudre
* @param afficherEtape : afficher les étapes de la résolution * @param afficherEtape : afficher les étapes de la résolution
* @param etat : état de la résolution * @param etat : état de la résolution
* @return true si le sudoku est résolvable, false sinon * @return true si le sudoku est résolvable, false sinon
*/ */
private boolean resoudre(Sudoku s, boolean afficherEtape, EtatResolution etat) { private boolean resoudre(Sudoku s, boolean afficherEtape, EtatResolution etat) {
@@ -60,9 +78,11 @@ public class ResolveurBacktraceSimple implements Resolveur {
/** /**
* Méthode permettant d'afficher le sudoku à chaque étape de sa résolution * Méthode permettant d'afficher le sudoku à chaque étape de sa résolution
* @param s : sudoku *
* @param compteur : compteur de l'étape en cours * @param s : sudoku
* @param compteurGeneral : compteur général de la résolution du sudoku (nombre total de tentatives) * @param compteur : compteur de l'étape en cours
* @param compteurGeneral : compteur général de la résolution du sudoku (nombre
* total de tentatives)
*/ */
private void afficherEtapeResolution(Sudoku s, int compteur, int compteurGeneral) { private void afficherEtapeResolution(Sudoku s, int compteur, int compteurGeneral) {
System.out.println("Sudoku, Etape " + compteur + " (Tentative " + compteurGeneral + ")"); System.out.println("Sudoku, Etape " + compteur + " (Tentative " + compteurGeneral + ")");
@@ -78,8 +98,10 @@ public class ResolveurBacktraceSimple implements Resolveur {
/** /**
* Méthode permettant de fixer l'état de la résolution * Méthode permettant de fixer l'état de la résolution
* @param compteur : compteur de l'étape en cours *
* @param compteurGeneral : compteur général de la résolution du sudoku (nombre total de tentatives) * @param compteur : compteur de l'étape en cours
* @param compteurGeneral : compteur général de la résolution du sudoku (nombre
* total de tentatives)
*/ */
EtatResolution(int compteur, int compteurGeneral) { EtatResolution(int compteur, int compteurGeneral) {
this.compteur = compteur; this.compteur = compteur;

View File

@@ -9,13 +9,18 @@ import java.util.Set;
import sudoku.core.Console; import sudoku.core.Console;
/**
* Classe représentant un sudoku.
*/
public class Sudoku { public class Sudoku {
private final Grille grille; private final Grille grille;
private final List<Contrainte> contraintes; private final List<Contrainte> contraintes;
private String nom; private String nom;
/** /**
* Constructeur permettant d'initialiser un sudoku à partir de la taille de sa grille * Constructeur permettant d'initialiser un sudoku à partir de la taille de sa
* grille
*
* @param taille : taille de la grille * @param taille : taille de la grille
*/ */
public Sudoku(int taille) { public Sudoku(int taille) {
@@ -25,18 +30,25 @@ public class Sudoku {
/** /**
* Méthode permettant de modifier le nom du sudoku, utilisé pour l'affichage. * Méthode permettant de modifier le nom du sudoku, utilisé pour l'affichage.
*
* @param nom : nom du sudoku * @param nom : nom du sudoku
*/ */
public void setNom(String nom) { public void setNom(String nom) {
this.nom = nom; this.nom = nom;
} }
/**
* Méthode permettant de récupérer le nom du sudoku
*
* @return nom du sudoku
*/
public String getNom() { public String getNom() {
return this.nom; return this.nom;
} }
/** /**
* Méthode permettant d'ajouter une contrainte à un sudoku * Méthode permettant d'ajouter une contrainte à un sudoku
*
* @param contrainte : contrainte à ajouter * @param contrainte : contrainte à ajouter
*/ */
public void ajouterContrainte(Contrainte contrainte) { public void ajouterContrainte(Contrainte contrainte) {
@@ -44,7 +56,9 @@ public class Sudoku {
} }
/** /**
* Méthode permettant de vérifier si une case est valide en fonction des contraintes la concernant * Méthode permettant de vérifier si une case est valide en fonction des
* contraintes la concernant
*
* @param c : case à vérifier * @param c : case à vérifier
* @return boolean : true si la case est valide, false sinon * @return boolean : true si la case est valide, false sinon
*/ */
@@ -58,7 +72,9 @@ public class Sudoku {
} }
/** /**
* Méthode permettant de vérifier si un sudoku est valide, c'est-à-dire si toutes les cases sont valides. * Méthode permettant de vérifier si un sudoku est valide, c'est-à-dire si
* toutes les cases sont valides.
*
* @return boolean : true si le sudoku est valide, false sinon * @return boolean : true si le sudoku est valide, false sinon
*/ */
public boolean estValide() { public boolean estValide() {
@@ -73,19 +89,27 @@ public class Sudoku {
return true; return true;
} }
/**
* Méthode utilisée pour verifier toute les contraintes lors d'un ajout de Case
* dans la grille.
* @return boolean : true si toutes les contraintes sont respectées, false sinon
*/
public boolean verifierToutesContraintes() { public boolean verifierToutesContraintes() {
return grille.verifierToutesContraintes(contraintes); return grille.verifierToutesContraintes(contraintes);
} }
/** /**
* Méthode permettant de retourner la grille complète * Méthode permettant de retourner la grille complète
*
* @return Grille * @return Grille
*/ */
public Grille getGrille() { public Grille getGrille() {
return grille; return grille;
} }
/**
* Méthode du menu principal du jeu.
*/
public static void menu() { public static void menu() {
Scanner scanner = new Scanner(System.in); Scanner scanner = new Scanner(System.in);
System.out.println("BIENVENUE DANS LE JEU DE SUDOKU"); System.out.println("BIENVENUE DANS LE JEU DE SUDOKU");
@@ -252,6 +276,9 @@ public class Sudoku {
return multidoku; return multidoku;
} }
/**
* Méthode du menu principal du jeu de sudoku.
*/
public static void menuGrille() { public static void menuGrille() {
Scanner scanner = new Scanner(System.in); Scanner scanner = new Scanner(System.in);
// ETAPE 1 : TAILLE GRILLE // ETAPE 1 : TAILLE GRILLE
@@ -305,7 +332,8 @@ public class Sudoku {
for (int choixContrainte : contraintesChoisies) { for (int choixContrainte : contraintesChoisies) {
switch (choixContrainte) { switch (choixContrainte) {
case 1: case 1:
sudoku.ajouterContrainte(new ContrainteBloc(sudoku.getGrille().getTaille(), sudoku.getGrille().getTaille())); sudoku.ajouterContrainte(
new ContrainteBloc(sudoku.getGrille().getTaille(), sudoku.getGrille().getTaille()));
System.out.println("Contrainte Bloc ajoutée."); System.out.println("Contrainte Bloc ajoutée.");
break; break;
case 2: case 2:

View File

@@ -1,7 +1,12 @@
package sudoku; package sudoku;
/** /**
* Classe permettant de stocker un placement de symbole dans une grille de sudoku. * Classe permettant de stocker un placement de symbole dans une grille de
* multidoku.
*
* @param sudoku : le sudoku associé
* @param offsetLigne : décalage de la ligne
* @param offsetColonne : décalage de la colonne
*/ */
public record SudokuPlacement(Sudoku sudoku, int offsetLigne, int offsetColonne) { public record SudokuPlacement(Sudoku sudoku, int offsetLigne, int offsetColonne) {
} }

View File

@@ -1,5 +1,8 @@
package sudoku; package sudoku;
/**
* Classe permettant de créer et gérer un symbole.
*/
public class Symbole { public class Symbole {
private final String valeur; private final String valeur;

View File

@@ -1,27 +1,55 @@
package sudoku.core; package sudoku.core;
/** /**
* Console classe pour afficher des messages en couleur dans la console * Console classe pour afficher des messages en couleur dans la console.
*/ */
public class Console { public class Console {
/**
* Constructeur privé pour empêcher l'instanciation de la classe Console.
*/
private Console() {
}
// Codes ANSI pour les couleurs
private static final String ANSI_RESET = "\u001B[0m"; private static final String ANSI_RESET = "\u001B[0m";
private static final String ANSI_RED = "\u001B[31m"; private static final String ANSI_RED = "\u001B[31m";
private static final String ANSI_GREEN = "\u001B[32m"; private static final String ANSI_GREEN = "\u001B[32m";
private static final String ANSI_YELLOW = "\u001B[33m"; private static final String ANSI_YELLOW = "\u001B[33m";
static final String ANSI_BOLD = "\u001B[1m"; static final String ANSI_BOLD = "\u001B[1m";
/**
* Affiche un message en rouge
*
* @param message : String
*/
public static void errorln(String message) { public static void errorln(String message) {
System.err.println(ANSI_RED + ANSI_BOLD + message + ANSI_RESET + "\n"); System.err.println(ANSI_RED + ANSI_BOLD + message + ANSI_RESET + "\n");
} }
/**
* Affiche un message en vert
*
* @param message : String
*/
public static void successln(String message) { public static void successln(String message) {
System.out.println(ANSI_GREEN + ANSI_BOLD + message + ANSI_RESET + "\n"); System.out.println(ANSI_GREEN + ANSI_BOLD + message + ANSI_RESET + "\n");
} }
/**
* Affiche un message en jaune
*
* @param message : String
*/
public static void warnln(String message) { public static void warnln(String message) {
System.out.println(ANSI_YELLOW + ANSI_BOLD + message + ANSI_RESET + "\n"); System.out.println(ANSI_YELLOW + ANSI_BOLD + message + ANSI_RESET + "\n");
} }
/**
* Affiche un message en blanc (par défaut)
*
* @param message : String
*/
public static void infoln(String message) { public static void infoln(String message) {
System.out.println(message + "\n"); System.out.println(message + "\n");
} }

View File

@@ -0,0 +1,123 @@
package sudoku.core;
import java.util.ArrayList;
import java.util.List;
/**
* Classe permettant de générer des couleurs pour les cases de la grille.
*/
public class GenerateurCouleur {
/**
* Constructeur privé pour empêcher l'instanciation de la classe
* GenerateurCouleur.
*/
private GenerateurCouleur() {
}
/**
* Classe interne Couleur représentant une couleur avec des composantes rouge,
* vert et bleu.
*/
public static class Couleur {
/** Composant rouge de la couleur, valeur entre 0 et 1 */
public float r;
/** Composant vert de la couleur, valeur entre 0 et 1 */
public float g;
/** Composant bleu de la couleur, valeur entre 0 et 1 */
public float b;
/**
* Constructeur de la classe Couleur.
*
* @param r Composant rouge (valeur entre 0 et 1)
* @param g Composant vert (valeur entre 0 et 1)
* @param b Composant bleu (valeur entre 0 et 1)
*/
public Couleur(float r, float g, float b) {
this.r = r;
this.g = g;
this.b = b;
}
}
/**
* Génère une palette de couleurs pour les cases de la grille.
*
* @param colorCount Nombre de couleurs à générer
* @return {@code List<Couleur>} Liste de couleurs générées
*/
public static List<Couleur> paletteCouleur(int colorCount) {
List<Couleur> colors = paletteCouleurEtendue(colorCount);
List<Couleur> newOrder = new ArrayList<>();
int newIndex = 0;
while (!colors.isEmpty()) {
int randomIndex = newIndex % colors.size();
newOrder.add(colors.get(randomIndex));
colors.remove(randomIndex);
newIndex += Math.sqrt(colorCount) + 1;
}
return newOrder;
}
/**
* Génère une palette de couleurs étendue pour les cases de la grille.
*
* @param colorCount Nombre de couleurs à générer
* @return {@code List<Couleur>} Liste de couleurs générées
*/
public static List<Couleur> paletteCouleurEtendue(int colorCount) {
List<Couleur> colors = new ArrayList<>();
for (int i = 0; i < colorCount; i++) {
colors.add(hslToRgb((float) (i) / (float) colorCount, 0.9f, 0.4f));
}
return colors;
}
/**
* Convertit une couleur HSL en RGB
*
* @param h : float : Hue
* @param s : float : Saturation
* @param l : float : Lightness
* @return Couleur : couleur RGB
*/
public static Couleur hslToRgb(float h, float s, float l) {
float r, g, b;
if (s == 0f) {
r = g = b = l; // achromatic
} else {
float q = l < 0.5f ? l * (1 + s) : l + s - l * s;
float p = 2 * l - q;
r = hueToRgb(p, q, h + 1f / 3f);
g = hueToRgb(p, q, h);
b = hueToRgb(p, q, h - 1f / 3f);
}
return new Couleur(r, g, b);
}
/**
* Convertit une couleur hue en RGB
*
* @param p : float
* @param q : float
* @param t : float
* @return float
*/
public static float hueToRgb(float p, float q, float t) {
if (t < 0f)
t += 1f;
if (t > 1f)
t -= 1f;
if (t < 1f / 6f)
return p + (q - p) * 6f * t;
if (t < 1f / 2f)
return q;
if (t < 2f / 3f)
return p + (q - p) * (2f / 3f - t) * 6f;
return p;
}
}

View File

@@ -1,67 +0,0 @@
package sudoku.gui;
import java.util.ArrayList;
import java.util.List;
public class ColorGenerator {
public static class Color {
public float r, g, b;
public Color(float r, float g, float b) {
this.r = r;
this.g = g;
this.b = b;
}
}
public static List<Color> greatPalette(int colorCount) {
List<Color> colors = greatScheme(colorCount);
List<Color> newOrder = new ArrayList<>();
int newIndex = 0;
while (!colors.isEmpty()) {
int randomIndex = newIndex % colors.size();
newOrder.add(colors.get(randomIndex));
colors.remove(randomIndex);
newIndex += Math.sqrt(colorCount) + 1;
}
return newOrder;
}
public static List<Color> greatScheme(int colorCount) {
List<Color> colors = new ArrayList<>();
for (int i = 0; i < colorCount; i++) {
colors.add(hslToRgb((float) (i) / (float) colorCount, 0.9f, 0.4f));
}
return colors;
}
public static Color hslToRgb(float h, float s, float l) {
float r, g, b;
if (s == 0f) {
r = g = b = l; // achromatic
} else {
float q = l < 0.5f ? l * (1 + s) : l + s - l * s;
float p = 2 * l - q;
r = hueToRgb(p, q, h + 1f / 3f);
g = hueToRgb(p, q, h);
b = hueToRgb(p, q, h - 1f / 3f);
}
return new Color(r, g, b);
}
public static float hueToRgb(float p, float q, float t) {
if (t < 0f)
t += 1f;
if (t > 1f)
t -= 1f;
if (t < 1f / 6f)
return p + (q - p) * 6f * t;
if (t < 1f / 2f)
return q;
if (t < 2f / 3f)
return p + (q - p) * (2f / 3f - t) * 6f;
return p;
}
}

View File

@@ -10,7 +10,7 @@ public class TestBlocParticuliers {
@Test @Test
public void blocParticuliers() { public void blocParticuliers() {
System.out.println("TEST BLOC PARTICULIERS : "); System.out.println("TEST BLOC PARTICULIERS : ");
System.out.println(new App().getGreeting());
// Create a new Sudoku // Create a new Sudoku
Sudoku sudoku = new Sudoku(4); Sudoku sudoku = new Sudoku(4);

View File

@@ -9,7 +9,7 @@ public class TestBlocRectangle {
@Test @Test
public void blocRectangle() { public void blocRectangle() {
System.out.println("TEST BLOC RECTANGLE : "); System.out.println("TEST BLOC RECTANGLE : ");
System.out.println(new App().getGreeting());
// Create a new Sudoku // Create a new Sudoku
Sudoku sudoku = new Sudoku(15); Sudoku sudoku = new Sudoku(15);
ArrayList<Symbole> symboles = new ArrayList<>(); ArrayList<Symbole> symboles = new ArrayList<>();

View File

@@ -11,7 +11,7 @@ public class TestDoublonBloc {
@Test @Test
public void testBloc() { public void testBloc() {
System.out.println("TEST DOUBLON BLOC : "); System.out.println("TEST DOUBLON BLOC : ");
System.out.println(new App().getGreeting());
// Create a new Sudoku // Create a new Sudoku
Sudoku sudoku = new Sudoku(9); Sudoku sudoku = new Sudoku(9);
sudoku.getGrille().setSymbolesPossibles(new ArrayList<>(Arrays.asList( sudoku.getGrille().setSymbolesPossibles(new ArrayList<>(Arrays.asList(

View File

@@ -11,7 +11,7 @@ public class TestDoublonColonne {
@Test @Test
public void testColonne() { public void testColonne() {
System.out.println("TEST DOUBLON COLONNE : "); System.out.println("TEST DOUBLON COLONNE : ");
System.out.println(new App().getGreeting());
// Create a new Sudoku // Create a new Sudoku
Sudoku sudoku = new Sudoku(9); Sudoku sudoku = new Sudoku(9);
sudoku.getGrille().setSymbolesPossibles(new ArrayList<>(Arrays.asList( sudoku.getGrille().setSymbolesPossibles(new ArrayList<>(Arrays.asList(

View File

@@ -9,7 +9,7 @@ public class TestDoublonLigne {
@Test @Test
public void testDoublonLigne() { public void testDoublonLigne() {
System.out.println("TEST DOUBLON LIGNE : "); System.out.println("TEST DOUBLON LIGNE : ");
System.out.println(new App().getGreeting());
// Create a new Sudoku // Create a new Sudoku
Sudoku sudoku = new Sudoku(9); Sudoku sudoku = new Sudoku(9);
sudoku.getGrille().setSymbolesPossibles(new ArrayList<>(Arrays.asList( sudoku.getGrille().setSymbolesPossibles(new ArrayList<>(Arrays.asList(

View File

@@ -9,7 +9,7 @@ public class TestResolveurBacktraceSimpleSudoku16 {
@Test @Test
public void testResolution() { public void testResolution() {
System.out.println("TEST RESOLVEUR BACKTRACE SIMPLE : "); System.out.println("TEST RESOLVEUR BACKTRACE SIMPLE : ");
System.out.println(new App().getGreeting());
// Create a new Sudoku // Create a new Sudoku
Sudoku sudoku = new Sudoku(16); Sudoku sudoku = new Sudoku(16);
sudoku.getGrille().setSymbolesPossibles(new ArrayList<>(Arrays.asList( sudoku.getGrille().setSymbolesPossibles(new ArrayList<>(Arrays.asList(

View File

@@ -14,7 +14,7 @@
// @Test // @Test
// public void testResolution() { // public void testResolution() {
// System.out.println("TEST RESOLVEUR BACKTRACE SIMPLE : "); // System.out.println("TEST RESOLVEUR BACKTRACE SIMPLE : ");
// System.out.println(new App().getGreeting()); //
// // Create a new Sudoku // // Create a new Sudoku
// Sudoku sudoku = new Sudoku(25); // Sudoku sudoku = new Sudoku(25);

View File

@@ -9,7 +9,7 @@ public class TestResolveurBacktraceSimpleSudoku9 {
@Test @Test
public void testResolution() { public void testResolution() {
System.out.println("TEST RESOLVEUR BACKTRACE SIMPLE : "); System.out.println("TEST RESOLVEUR BACKTRACE SIMPLE : ");
System.out.println(new App().getGreeting());
// Create a new Sudoku // Create a new Sudoku
Sudoku sudoku = new Sudoku(9); Sudoku sudoku = new Sudoku(9);
sudoku.getGrille().setSymbolesPossibles(new ArrayList<>(Arrays.asList( sudoku.getGrille().setSymbolesPossibles(new ArrayList<>(Arrays.asList(

View File

@@ -9,7 +9,7 @@ public class TestSudokuEmojis {
@Test @Test
public void sudokuEmojis() { public void sudokuEmojis() {
System.out.println("TEST SUDOKU EMOJIS : "); System.out.println("TEST SUDOKU EMOJIS : ");
System.out.println(new App().getGreeting());
// Create a new Sudoku // Create a new Sudoku
Sudoku sudoku = new Sudoku(9); Sudoku sudoku = new Sudoku(9);

View File

@@ -9,7 +9,7 @@ public class TestSudokuLettres {
@Test @Test
public void sudokuLettres() { public void sudokuLettres() {
System.out.println("TEST SUDOKU LETTRES : "); System.out.println("TEST SUDOKU LETTRES : ");
System.out.println(new App().getGreeting());
// Create a new Sudoku // Create a new Sudoku
Sudoku sudoku = new Sudoku(9); Sudoku sudoku = new Sudoku(9);

View File

@@ -9,7 +9,7 @@ public class TestSudokusString {
@Test @Test
public void sudokuString() { public void sudokuString() {
System.out.println("TEST SUDOKU STRING : "); System.out.println("TEST SUDOKU STRING : ");
System.out.println(new App().getGreeting());
// Create a new Sudoku // Create a new Sudoku
Sudoku sudoku = new Sudoku(9); Sudoku sudoku = new Sudoku(9);