refactor: enhance code documentation and remove unnecessary greeting outputs in tests
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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++) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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) {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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");
|
||||||
}
|
}
|
||||||
|
|||||||
123
app/src/main/java/sudoku/core/GenerateurCouleur.java
Normal file
123
app/src/main/java/sudoku/core/GenerateurCouleur.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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<>();
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user