04/02/2025 : Ajout de la JavaDoc
This commit is contained in:
29
.idea/workspace.xml
generated
29
.idea/workspace.xml
generated
@@ -5,6 +5,17 @@
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="78fccc4f-112b-4fb4-8f59-c375aeac8595" name="Changes" comment="">
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/sudoku/App.java" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/sudoku/App.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/sudoku/Bloc.java" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/sudoku/Bloc.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/sudoku/Case.java" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/sudoku/Case.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/sudoku/Contrainte.java" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/sudoku/Contrainte.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/sudoku/ContrainteBloc.java" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/sudoku/ContrainteBloc.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/sudoku/ContrainteColonne.java" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/sudoku/ContrainteColonne.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/sudoku/ContrainteLigne.java" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/sudoku/ContrainteLigne.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/sudoku/Grille.java" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/sudoku/Grille.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/sudoku/ResolveurBacktraceSimple.java" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/sudoku/ResolveurBacktraceSimple.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/sudoku/Sudoku.java" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/sudoku/Sudoku.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/sudoku/Symbole.java" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/sudoku/Symbole.java" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
@@ -20,9 +31,9 @@
|
||||
<component name="Git.Settings">
|
||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||
</component>
|
||||
<component name="ProjectColorInfo"><![CDATA[{
|
||||
"associatedIndex": 6
|
||||
}]]></component>
|
||||
<component name="ProjectColorInfo">{
|
||||
"associatedIndex": 6
|
||||
}</component>
|
||||
<component name="ProjectId" id="2rwHskpjH0QskAu0G8vmtPc1Ozz" />
|
||||
<component name="ProjectViewState">
|
||||
<option name="hideEmptyMiddlePackages" value="true" />
|
||||
@@ -30,9 +41,11 @@
|
||||
</component>
|
||||
<component name="PropertiesComponent"><![CDATA[{
|
||||
"keyToString": {
|
||||
"Gradle.Sudoku:app [:app:sudoku.App.main()].executor": "Run",
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"RunOnceActivity.git.unshallow": "true",
|
||||
"git-widget-placeholder": "feature/solveur",
|
||||
"git-widget-placeholder": "Gwendal",
|
||||
"ignore.virus.scanning.warn.message": "true",
|
||||
"kotlin-language-version-configured": "true",
|
||||
"last_opened_file_path": "/usr/lib/jvm/java-21-openjdk",
|
||||
"node.js.detected.package.eslint": "true",
|
||||
@@ -58,14 +71,6 @@
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
</component>
|
||||
<component name="SharedIndexes">
|
||||
<attachedChunks>
|
||||
<set>
|
||||
<option value="bundled-jdk-9823dce3aa75-125ca727e0f0-intellij.indexing.shared.core-IU-243.23654.117" />
|
||||
<option value="bundled-js-predefined-d6986cc7102b-822845ee3bb5-JavaScript-IU-243.23654.117" />
|
||||
</set>
|
||||
</attachedChunks>
|
||||
</component>
|
||||
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
||||
<component name="TaskManager">
|
||||
<task active="true" id="Default" summary="Default task">
|
||||
|
||||
@@ -5,6 +5,10 @@ public class App {
|
||||
return "Hello World!";
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode main permettant de lancer l'application sudoku et d'afficher les erreurs s'il y en a.
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
System.out.println(new App().getGreeting());
|
||||
/*
|
||||
|
||||
@@ -2,22 +2,35 @@ package sudoku;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class Bloc {
|
||||
private final List<Case> cases;
|
||||
private final String couleur;
|
||||
private final int couleurIndex;
|
||||
|
||||
/**
|
||||
* Constructeur permettant de créer un bloc de couleur
|
||||
* @param couleur
|
||||
* @param couleurIndex
|
||||
*/
|
||||
public Bloc(String couleur, int couleurIndex) {
|
||||
this.cases = new ArrayList<>();
|
||||
this.couleur = couleur;
|
||||
this.couleurIndex = couleurIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant d'ajouter une case à un bloc
|
||||
* @param c
|
||||
*/
|
||||
public void ajouterCase(Case c) {
|
||||
cases.add(c);
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de savoir si une case contient un symbole précis
|
||||
* @param s
|
||||
* @return
|
||||
*/
|
||||
public boolean contains(Symbole s) {
|
||||
for (Case c : cases) {
|
||||
if (c.getSymbole().equals(s)) {
|
||||
@@ -27,18 +40,34 @@ public class Bloc {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de renvoyer la couleur d'un bloc
|
||||
* @return
|
||||
*/
|
||||
public String getCouleur() {
|
||||
return couleur;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de renvoyer l'index de couleur d'un bloc
|
||||
* @return
|
||||
*/
|
||||
public int getCouleurIndex() {
|
||||
return couleurIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de renvoyer une liste de cases associée à un bloc
|
||||
* @return
|
||||
*/
|
||||
public List<Case> getCases() {
|
||||
return cases;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant d'afficher un bloc complet avec les cases qui le compose
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Bloc{" +
|
||||
|
||||
@@ -5,28 +5,54 @@ public class Case {
|
||||
private final int colonne;
|
||||
private Symbole symbole;
|
||||
|
||||
/**
|
||||
* Constructeur permettant de créer une case grace aux paramètres suivants :
|
||||
* @param ligne
|
||||
* @param colonne
|
||||
* @param symbole
|
||||
*/
|
||||
public Case(int ligne, int colonne, Symbole symbole) {
|
||||
this.ligne = ligne;
|
||||
this.colonne = colonne;
|
||||
this.symbole = symbole;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de renvoyer la coordonnée de la ligne qui compose la case
|
||||
* @return
|
||||
*/
|
||||
public int getLigne() {
|
||||
return ligne;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de renvoyer la coordonnée de la colonne qui compose la case
|
||||
* @return
|
||||
*/
|
||||
public int getColonne() {
|
||||
return colonne;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de renvoyer le symbole qui compose la case
|
||||
* @return
|
||||
*/
|
||||
public Symbole getSymbole() {
|
||||
return symbole;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de modifier le symbole qui compose la case
|
||||
* @param symbole
|
||||
*/
|
||||
public void setSymbole(Symbole symbole) {
|
||||
this.symbole = symbole;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode qui permet d'afficher le symbole de la case ou "-" si la case est vide
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return (symbole == null) ? "-" : symbole.toString();
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
package sudoku;
|
||||
|
||||
/**
|
||||
* Interface permettant d'évaluer toutes les contraintes et de retourner un boolean indiquant si elles ont étés respectées.
|
||||
*/
|
||||
public interface Contrainte {
|
||||
boolean estRespectee(Grille grille, Case c);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,14 @@
|
||||
package sudoku;
|
||||
|
||||
public class ContrainteBloc implements Contrainte {
|
||||
/**
|
||||
* Méthode permettant de savoir si l'ensemble des contraintes concernant le bloc sont respectées.</br>
|
||||
* Renvoie 0 si au moins l'une des contraintes n'est pas respectée </br>
|
||||
* Renvoie 1 si toutes les contraintes sont respectées
|
||||
* @param grille
|
||||
* @param c
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean estRespectee(Grille grille, Case c) {
|
||||
int blocSize = (int) Math.sqrt(grille.getTaille());
|
||||
|
||||
@@ -1,6 +1,14 @@
|
||||
package sudoku;
|
||||
|
||||
public class ContrainteColonne implements Contrainte {
|
||||
/**
|
||||
* Méthode permettant de savoir si l'ensemble des contraintes concernant la colonne sont respectées.</br>
|
||||
* Renvoie 0 si au moins l'une des contraintes n'est pas respectée</br>
|
||||
* Renvoie 1 si toutes les contraintes sont respectées
|
||||
* @param grille
|
||||
* @param c
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean estRespectee(Grille grille, Case c) {
|
||||
int colonne = c.getColonne();
|
||||
|
||||
@@ -1,6 +1,14 @@
|
||||
package sudoku;
|
||||
|
||||
public class ContrainteLigne implements Contrainte {
|
||||
/**
|
||||
* Méthode permettant de savoir si l'ensemble des contraintes concernant la ligne sont respectées.</br>
|
||||
* Renvoie 0 si au moins l'une des contraintes n'est pas respectée</br>
|
||||
* Renvoie 1 si toutes les contraintes sont respectées
|
||||
* @param grille
|
||||
* @param c
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean estRespectee(Grille grille, Case c) {
|
||||
int ligne = c.getLigne();
|
||||
|
||||
@@ -14,6 +14,11 @@ public class Grille {
|
||||
private ArrayList<Symbole> symbolesPossibles;
|
||||
private final Sudoku sudoku;
|
||||
|
||||
/**
|
||||
* Constructeur permettant d'initialiser une griller grace aux paramètres suivants :
|
||||
* @param taille
|
||||
* @param sudoku
|
||||
*/
|
||||
public Grille(int taille, Sudoku sudoku) {
|
||||
this.taille = taille;
|
||||
this.cases = new Case[taille][taille];
|
||||
@@ -29,6 +34,12 @@ public class Grille {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de fixer la valeur d'une case dans une grille à l'aide des paramètres suivants :
|
||||
* @param ligne
|
||||
* @param colonne
|
||||
* @param symbole
|
||||
*/
|
||||
public void setCase(int ligne, int colonne, Symbole symbole) {
|
||||
try {
|
||||
if (symbole != null && !symbolesPossibles.contains(symbole)) {
|
||||
@@ -52,10 +63,19 @@ public class Grille {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de connaitre la valeur d'une case (symbole) grace aux paramètres suivants :
|
||||
* @param ligne
|
||||
* @param colonne
|
||||
* @return
|
||||
*/
|
||||
public Case getCase(int ligne, int colonne) {
|
||||
return cases[ligne][colonne];
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de déterminer les couleur qui seront utilisées dans le sudoku
|
||||
*/
|
||||
private static final String[] QUATRE_COULEURS = {
|
||||
"\u001B[31m", // Rouge
|
||||
"\u001B[32m", // Vert
|
||||
@@ -63,6 +83,14 @@ public class Grille {
|
||||
"\u001B[33m" // Jaune
|
||||
};
|
||||
|
||||
/**
|
||||
* Méthode permettant de connaitre les couleurs disponibles pour un bloc. Cette méthode applique le théorème des quatres couleurs
|
||||
* @param blocRow
|
||||
* @param blocCol
|
||||
* @param blocHeight
|
||||
* @param blocWidth
|
||||
* @return
|
||||
*/
|
||||
private int getCouleurDisponible(int blocRow, int blocCol, int blocHeight, int blocWidth) {
|
||||
List<Integer> couleursUtilisees = new ArrayList<>();
|
||||
int blocsParLigne = taille / blocWidth;
|
||||
@@ -100,19 +128,19 @@ public class Grille {
|
||||
}
|
||||
|
||||
/**
|
||||
* Crée un bloc à partir des positions spécifiées
|
||||
*
|
||||
* Exemple :
|
||||
* sudoku.getGrille().creerBloc(Arrays.asList(
|
||||
* new int[] { 0, 0 },
|
||||
* new int[] { 0, 1 },
|
||||
* new int[] { 0, 2 },
|
||||
* new int[] { 1, 0 },
|
||||
* new int[] { 1, 1 },
|
||||
* new int[] { 1, 2 },
|
||||
* new int[] { 2, 0 },
|
||||
* new int[] { 2, 1 },
|
||||
* new int[] { 2, 2 }));
|
||||
*Méthode permettant de crée un bloc à partir des positions spécifiées. Voici comment l'utiliser : </br>
|
||||
* </br>
|
||||
* Exemple :</br>
|
||||
* sudoku.getGrille().creerBloc(Arrays.asList(</br>
|
||||
* new int[] { 0, 0 },</br>
|
||||
* new int[] { 0, 1 },</br>
|
||||
* new int[] { 0, 2 },</br>
|
||||
* new int[] { 1, 0 },</br>
|
||||
* new int[] { 1, 1 },</br>
|
||||
* new int[] { 1, 2 },</br>
|
||||
* new int[] { 2, 0 },</br>
|
||||
* new int[] { 2, 1 },</br>
|
||||
* new int[] { 2, 2 }));</br>
|
||||
*
|
||||
* @param positions
|
||||
* @return
|
||||
@@ -168,6 +196,10 @@ public class Grille {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de créer des bloc carrés si la taille de la grille représente un carré parfait.
|
||||
* Ne fonctionne pas pour les tailles de grilles qui sont des carrés parfaits
|
||||
*/
|
||||
public void creerBlocCarre() {
|
||||
try {
|
||||
int blocSize = (int) Math.sqrt(taille);
|
||||
@@ -205,11 +237,10 @@ public class Grille {
|
||||
}
|
||||
|
||||
/**
|
||||
* Crée des blocs rectangles automatiquement à partir de la taille de la grille
|
||||
* Méthode permettant de créer des blocs rectangles automatiquement à partir de la taille de la grille
|
||||
* Ne fonctionne pas pour les tailles de grilles qui sont des carrés parfaits
|
||||
*
|
||||
* @param blocRow
|
||||
* @param blocCol
|
||||
*
|
||||
* @param blocHeight
|
||||
* @param blocWidth
|
||||
*/
|
||||
@@ -252,12 +283,26 @@ public class Grille {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode pour afficher un bloc dans le terminal
|
||||
*/
|
||||
public void printBlocs() {
|
||||
for (Bloc bloc : blocs) {
|
||||
System.out.println(bloc.toString());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant à l'utilisateur de saisir une liste de symbole qu'il devra utiliser. Le nombre de symbole correspond à la taille de la grille.</br>
|
||||
* 3 choix sont passibles :</br>
|
||||
* --> 1 : L'utilisateur jouera avec des nombres entiers</br>
|
||||
* --> 2 : L'utilisateur jouera avec des lettres</br>
|
||||
* --> 3 : L'utilisateur jouera avec des chaines de caractères / symboles</br></br>
|
||||
* Cette méthode intègre des mécanismes de sécurité tels que : </br>
|
||||
* - La vérification que le type de caractère saisit par l'utilisateur est conforme avec son choix</br>
|
||||
* - La vérification que le choix de l'utilisateur se fait bien entre 1 et 3</br>
|
||||
* - La vérification que l'utilisateur ne saisit pas un symbole 2 fois
|
||||
*/
|
||||
public void askSetSymbolesPossibles() {
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
try {
|
||||
@@ -334,14 +379,25 @@ public class Grille {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de retourner la liste des symboles possible. Cela dépend de ce qu'a saisit l'utilisateur dans la méthode askSetSymbolesPossibles
|
||||
* @return
|
||||
*/
|
||||
public List<Symbole> getSymbolesPossibles() {
|
||||
return symbolesPossibles;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant d'ajouter un symbole à la liste des symboles possibles
|
||||
* @param symbolesPossibles
|
||||
*/
|
||||
public void setSymbolesPossibles(ArrayList<Symbole> symbolesPossibles) {
|
||||
this.symbolesPossibles = symbolesPossibles;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant d'afficher la liste des symboles possibles
|
||||
*/
|
||||
public void printSymbolesPossibles() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (Symbole symbole : symbolesPossibles) {
|
||||
@@ -350,10 +406,19 @@ public class Grille {
|
||||
System.out.println(sb.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de retourner la taille de la grille
|
||||
* @return
|
||||
*/
|
||||
public int getTaille() {
|
||||
return taille;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de retourner le bloc d'appartenance d'une case passée en paramètre.
|
||||
* @param target
|
||||
* @return
|
||||
*/
|
||||
private Bloc findBlocForCase(Case target) {
|
||||
for (Bloc bloc : blocs) {
|
||||
if (bloc.getCases().contains(target)) {
|
||||
@@ -364,8 +429,8 @@ public class Grille {
|
||||
}
|
||||
|
||||
/**
|
||||
* Vérifie si toutes les contraintes sont respectées
|
||||
* S'arrête dès qu'une contrainte n'est pas respectée
|
||||
* Vérifie si toutes les contraintes sont respectées.</br>
|
||||
* S'arrête dès qu'une contrainte n'est pas respectée.
|
||||
*
|
||||
* @param contraintes
|
||||
* @return
|
||||
@@ -391,6 +456,10 @@ public class Grille {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de retourner les cases libres
|
||||
* @return
|
||||
*/
|
||||
public Case getCaseLibre() {
|
||||
for (int i = 0; i < taille; i++) {
|
||||
for (int j = 0; j < taille; j++) {
|
||||
@@ -402,6 +471,10 @@ public class Grille {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de retourner la longueure du symbole le plus long pour dimensionner corectement les cases et la grille
|
||||
* @return
|
||||
*/
|
||||
public int getLongueurSymboleLePlusLong() {
|
||||
int max = 0;
|
||||
for (Symbole symbole : symbolesPossibles) {
|
||||
@@ -412,6 +485,10 @@ public class Grille {
|
||||
return max;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant d'afficher la grille
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
// public String toString() {
|
||||
// StringBuilder sb = new StringBuilder();
|
||||
@@ -438,6 +515,9 @@ public class Grille {
|
||||
|
||||
// return sb.toString();
|
||||
// }
|
||||
/**
|
||||
* Méthode permettant d'afficher la grille
|
||||
*/
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
|
||||
@@ -6,16 +6,38 @@ public class ResolveurBacktraceSimple implements Resolveur {
|
||||
|
||||
private final Sudoku sudoku;
|
||||
|
||||
/**
|
||||
* Constructeur permettant d'initialiser un resolveur à l'aide d'un sudoku en entrée
|
||||
* @param sudoku
|
||||
*/
|
||||
public ResolveurBacktraceSimple(Sudoku sudoku) {
|
||||
this.sudoku = sudoku;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de résoudre un sudoku à partir des paramètres suivant :</br>
|
||||
* - S : Sudoku</br>
|
||||
* - afficherEtape : 0 ou 1
|
||||
* @param s
|
||||
* @param afficherEtape
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean resoudre(Sudoku s, boolean afficherEtape) {
|
||||
EtatResolution etat = new EtatResolution(0, 0);
|
||||
return resoudre(s, afficherEtape, etat);
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de sésoudre un sudoku à partir des paramètre suivants :</br>
|
||||
* - S : Sudoku</br>
|
||||
* - afficherEtape : 0 ou 1</br>
|
||||
* - Etat : EtatRésolution
|
||||
* @param s
|
||||
* @param afficherEtape
|
||||
* @param etat
|
||||
* @return
|
||||
*/
|
||||
private boolean resoudre(Sudoku s, boolean afficherEtape, EtatResolution etat) {
|
||||
Grille g = s.getGrille();
|
||||
List<Symbole> symboles = g.getSymbolesPossibles();
|
||||
@@ -45,15 +67,27 @@ public class ResolveurBacktraceSimple implements Resolveur {
|
||||
return true; // Si la grille est déjà résolue
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant d'afficher le sudoku à chaque étape de sa résolution
|
||||
* @param s
|
||||
* @param compteur
|
||||
* @param compteurGeneral
|
||||
*/
|
||||
private void afficherEtapeResolution(Sudoku s, int compteur, int compteurGeneral) {
|
||||
System.out.println("Sudoku, Etape " + compteur + " (Tentative " + compteurGeneral + ")");
|
||||
System.out.println(s.getGrille().toString());
|
||||
}
|
||||
|
||||
|
||||
private static class EtatResolution {
|
||||
int compteur;
|
||||
int compteurGeneral;
|
||||
|
||||
/**
|
||||
* Méthode permettant de fixer l'état de la résolution
|
||||
* @param compteur
|
||||
* @param compteurGeneral
|
||||
*/
|
||||
EtatResolution(int compteur, int compteurGeneral) {
|
||||
this.compteur = compteur;
|
||||
this.compteurGeneral = compteurGeneral;
|
||||
|
||||
@@ -12,11 +12,19 @@ public class Sudoku {
|
||||
private final Grille grille;
|
||||
private final List<Contrainte> contraintes;
|
||||
|
||||
/**
|
||||
* Constructeur permettant d'initialiser un sudoku à partir de la taille de sa grille
|
||||
* @param taille
|
||||
*/
|
||||
public Sudoku(int taille) {
|
||||
this.grille = new Grille(taille, this);
|
||||
this.contraintes = new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant d'ajouter des contraintes de résolution
|
||||
* @param contrainte
|
||||
*/
|
||||
public void ajouterContrainte(Contrainte contrainte) {
|
||||
contraintes.add(contrainte);
|
||||
}
|
||||
@@ -25,6 +33,11 @@ public class Sudoku {
|
||||
// grille.creerBloc(positions, blocHeight, blocWidth);
|
||||
// }
|
||||
|
||||
/**
|
||||
* Méthode permettant de savoir si le sudoku est valide et si toutes les contraintes sont respectées.
|
||||
* @param c
|
||||
* @return
|
||||
*/
|
||||
public boolean estValide(Case c) {
|
||||
for (Contrainte contrainte : contraintes) {
|
||||
if (!contrainte.estRespectee(grille, c)) {
|
||||
@@ -34,14 +47,30 @@ public class Sudoku {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de vérifier que toutes les contraintes (blocs, lignes, colonnes) sont respectées.
|
||||
* @return
|
||||
*/
|
||||
public boolean verifierToutesContraintes() {
|
||||
return grille.verifierToutesContraintes(contraintes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de retourner la grille complète
|
||||
* @return
|
||||
*/
|
||||
public Grille getGrille() {
|
||||
return grille;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant d'afficher un menu utilisateur. Voici le scénario :</br>
|
||||
* --> ETAPE 1 : CHOIX DE LA TAILLE DE LA GRILLE</br>
|
||||
* --> ETAPE 2 : CHOIX DES SYMBOLES POSSIBLES VIA LA METHODE "askSetSymbolesPossibles"</br>
|
||||
* --> ETAPE 3 : REMPLIR LA GRILLE</br>
|
||||
* --> ETAPE 4 : RESOUDRE LA GRILLE
|
||||
* @return
|
||||
*/
|
||||
public static Sudoku menuGrille() {
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
// ETAPE 1 : TAILLE GRILLE
|
||||
@@ -60,6 +89,12 @@ public class Sudoku {
|
||||
return sudoku;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de fixer la taille de la grille. Cette méthode inclue des sécurités telles que : </br>
|
||||
* - La vérification que la taille de la grille est un entier positif
|
||||
* @param scanner
|
||||
* @return
|
||||
*/
|
||||
private static int setTailleGrille(Scanner scanner) {
|
||||
int tailleGrille = -1;
|
||||
while (tailleGrille <= 0) {
|
||||
@@ -75,6 +110,26 @@ public class Sudoku {
|
||||
return tailleGrille;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permetant de remplir le sudoku selon le scénarion suivant : </br>
|
||||
* ETAPE 1 : CHOIX DES TYPE DE BLOCS</br>
|
||||
* - Si la taille de la grille est un carré parfait, les bloc seront carrés</br>
|
||||
* - Si la taille n'est pas un carré parfait, l'utilisateur a deux choix :</br>
|
||||
* --> CHOIX 1 : Il entre ses blocs à la main en saisissant les coordonnées de chaque case</br>
|
||||
* --> CHOIX 2 : il entre ses blocs en saisissant leur longueur et leur largeur.</br>
|
||||
* ETAPE 2 : REMPLISSAGE DU SUDOKU (répété tant que l'utilisateur ne saisit pas la chaine de caractère "ESC")</br>
|
||||
* - L'utilisateur saisit son numéro de ligne</br>
|
||||
* - L'utilisateur saisit son numéro de colonne</br>
|
||||
* - L'utilisateur saisit son symbole</br>
|
||||
* - Des mécanismes de sécurités sont implémentés lors de la saisie de chaque paramètre :</br>
|
||||
* --> Vérification que l'entrée n'est pas vide</br>
|
||||
* --> Vérification que le type d'entrée est conforme au choix de symbole</br>
|
||||
* --> Vérification que le sybole entré est conforme aux symboles possibles </br>
|
||||
* @param sudoku
|
||||
* @param scanner
|
||||
* @param tailleGrille
|
||||
* @return
|
||||
*/
|
||||
private static Sudoku setValeursGrille(Sudoku sudoku, Scanner scanner, int tailleGrille) {
|
||||
// Etude de la taille de la grille pour choisir le type de génération
|
||||
if (carreParfait(tailleGrille)) {
|
||||
@@ -175,6 +230,11 @@ public class Sudoku {
|
||||
return sudoku;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de vérifier que la taille de la grille est un carré parfait
|
||||
* @param nombre
|
||||
* @return
|
||||
*/
|
||||
private static boolean carreParfait(int nombre) {
|
||||
if (nombre < 0) {
|
||||
return false;
|
||||
@@ -183,6 +243,17 @@ public class Sudoku {
|
||||
return racine * racine == nombre;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de créer un bloc manuellement en demandant à l'utilisateur de saisir une liste de coordonnée pour chaque case compostant le bloc.</br>
|
||||
* Cette méthode intègre des sécurités telles que : </br>
|
||||
* --> La vérification que la coordonnée saisie n'est pas déja saisie dans le bloc ou dans un autre bloc</br>
|
||||
* --> La vérification que la coordonnée saisie est bien dans la grille</br>
|
||||
* --> La vérification que la coordonnée saisie est bien balide (format, type...)</br>
|
||||
* @param sudoku
|
||||
* @param scanner
|
||||
* @param tailleGrille
|
||||
* @return
|
||||
*/
|
||||
private static Sudoku creationBlocMannuel(Sudoku sudoku, Scanner scanner, int tailleGrille) {
|
||||
int nombreBloc = tailleGrille; // Nombre de blocs dans la grille
|
||||
|
||||
|
||||
@@ -3,23 +3,46 @@ package sudoku;
|
||||
public class Symbole {
|
||||
private final String valeur;
|
||||
|
||||
/**
|
||||
* Constructeur permettant de créer un symbole
|
||||
* @param symbole
|
||||
*/
|
||||
public Symbole(String symbole) {
|
||||
this.valeur = symbole;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de créer un symbole de type String
|
||||
* @param s
|
||||
* @return
|
||||
*/
|
||||
// Factory methods pour différents types
|
||||
public static Symbole of(String s) {
|
||||
return new Symbole(s);
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de créer un symbole de type int
|
||||
* @param n
|
||||
* @return
|
||||
*/
|
||||
public static Symbole of(int n) {
|
||||
return new Symbole(String.valueOf(n));
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de créer un symbole de type char
|
||||
* @param c
|
||||
* @return
|
||||
*/
|
||||
public static Symbole of(char c) {
|
||||
return new Symbole(String.valueOf(c));
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de vérifier si un symbole est de type int
|
||||
* @return
|
||||
*/
|
||||
public boolean isInt() {
|
||||
try {
|
||||
Integer.parseInt(valeur);
|
||||
@@ -29,15 +52,28 @@ public class Symbole {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de vérifier si un symbole est de type letter (char)
|
||||
* @return
|
||||
*/
|
||||
public boolean isLetter() {
|
||||
return valeur.length() == 1 && Character.isLetter(valeur.charAt(0));
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de vérifier si un symbole est de type string
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return valeur;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de retourner un booléen si 2 objets sont identiques
|
||||
* @param obj
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
@@ -49,6 +85,10 @@ public class Symbole {
|
||||
return valeur.equals(symbole.valeur);
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de retourner le hash code
|
||||
* @return
|
||||
*/
|
||||
public int getHashCode() {
|
||||
return valeur.hashCode();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user