refactor: improve code comments and app menu
This commit is contained in:
@@ -13,7 +13,7 @@ public class Grille {
|
|||||||
private final Case[][] cases;
|
private final Case[][] cases;
|
||||||
private final ArrayList<Bloc> blocs;
|
private final ArrayList<Bloc> blocs;
|
||||||
private ArrayList<Symbole> symbolesPossibles;
|
private ArrayList<Symbole> symbolesPossibles;
|
||||||
private final Sudoku sudoku;
|
private final Sudoku sudoku; // Référence à Sudoku
|
||||||
private Multidoku multidoku; // Référence à Multidoku
|
private Multidoku multidoku; // Référence à Multidoku
|
||||||
private List<String> generatedColors;
|
private List<String> generatedColors;
|
||||||
|
|
||||||
@@ -23,8 +23,6 @@ public class Grille {
|
|||||||
this.blocs = new ArrayList<>();
|
this.blocs = new ArrayList<>();
|
||||||
this.symbolesPossibles = new ArrayList<>();
|
this.symbolesPossibles = new ArrayList<>();
|
||||||
this.sudoku = sudoku;
|
this.sudoku = sudoku;
|
||||||
// Pour un sudoku classique, on attend "taille" blocs, donc on génère "taille"
|
|
||||||
// couleurs.
|
|
||||||
initColors();
|
initColors();
|
||||||
|
|
||||||
// Initialiser les cases
|
// Initialiser les cases
|
||||||
@@ -70,7 +68,6 @@ public class Grille {
|
|||||||
Symbole ancienSymbole = currentCase.getSymbole();
|
Symbole ancienSymbole = currentCase.getSymbole();
|
||||||
currentCase.setSymbole(symbole);
|
currentCase.setSymbole(symbole);
|
||||||
|
|
||||||
// Verify constraints including shared cases
|
|
||||||
if (!sudoku.verifierToutesContraintes() ||
|
if (!sudoku.verifierToutesContraintes() ||
|
||||||
(multidoku != null && !multidoku.verifierContraintesPartagees())) {
|
(multidoku != null && !multidoku.verifierContraintesPartagees())) {
|
||||||
currentCase.setSymbole(ancienSymbole);
|
currentCase.setSymbole(ancienSymbole);
|
||||||
@@ -134,33 +131,28 @@ public class Grille {
|
|||||||
* Crée des blocs carrés (par exemple pour un sudoku classique).
|
* Crée des blocs carrés (par exemple pour un sudoku classique).
|
||||||
*/
|
*/
|
||||||
public void creerBlocCarre() {
|
public void creerBlocCarre() {
|
||||||
try {
|
int blocSize = (int) Math.sqrt(taille);
|
||||||
int blocSize = (int) Math.sqrt(taille);
|
if (blocSize * blocSize != taille) {
|
||||||
if (blocSize * blocSize != taille) {
|
throw new IllegalArgumentException("La taille de la grille doit être un carré parfait.");
|
||||||
throw new IllegalArgumentException("La taille de la grille doit être un carré parfait.");
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Création des blocs en motif (par exemple 3x3 pour un sudoku 9x9)
|
// Création des blocs en motif (par exemple 3x3 pour un sudoku 9x9)
|
||||||
for (int blocRow = 0; blocRow < blocSize; blocRow++) {
|
for (int blocRow = 0; blocRow < blocSize; blocRow++) {
|
||||||
for (int blocCol = 0; blocCol < blocSize; blocCol++) {
|
for (int blocCol = 0; blocCol < blocSize; blocCol++) {
|
||||||
List<int[]> positions = new ArrayList<>();
|
List<int[]> positions = new ArrayList<>();
|
||||||
|
|
||||||
// Ajouter toutes les positions pour le bloc courant
|
// Ajouter toutes les positions pour le bloc courant
|
||||||
for (int i = 0; i < blocSize; i++) {
|
for (int i = 0; i < blocSize; i++) {
|
||||||
for (int j = 0; j < blocSize; j++) {
|
for (int j = 0; j < blocSize; j++) {
|
||||||
positions.add(new int[] {
|
positions.add(new int[] {
|
||||||
blocRow * blocSize + i,
|
blocRow * blocSize + i,
|
||||||
blocCol * blocSize + j
|
blocCol * blocSize + j
|
||||||
});
|
});
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Affectation cyclique d'une couleur issue de la palette générée
|
|
||||||
setCouleurBloc(positions);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setCouleurBloc(positions);
|
||||||
}
|
}
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
Console.errorln(e.getMessage());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,35 +162,31 @@ public class Grille {
|
|||||||
* Ne fonctionne pas pour les grilles dont la taille est un carré parfait.
|
* Ne fonctionne pas pour les grilles dont la taille est un carré parfait.
|
||||||
*/
|
*/
|
||||||
public void creerBlocRectangulaire(int blocHeight, int blocWidth) {
|
public void creerBlocRectangulaire(int blocHeight, int blocWidth) {
|
||||||
try {
|
if (taille % blocHeight != 0 || taille % blocWidth != 0) {
|
||||||
if (taille % blocHeight != 0 || taille % blocWidth != 0) {
|
throw new IllegalArgumentException(
|
||||||
throw new IllegalArgumentException(
|
"La taille de la grille doit être divisible par les dimensions des blocs.");
|
||||||
"La taille de la grille doit être divisible par les dimensions des blocs.");
|
}
|
||||||
}
|
|
||||||
|
|
||||||
int blocsParLigne = taille / blocWidth;
|
int blocsParLigne = taille / blocWidth;
|
||||||
int blocsParColonne = taille / blocHeight;
|
int blocsParColonne = taille / blocHeight;
|
||||||
|
|
||||||
// Création des blocs en motif rectangulaire
|
// Création des blocs en motif rectangulaire
|
||||||
for (int blocRow = 0; blocRow < blocsParColonne; blocRow++) {
|
for (int blocRow = 0; blocRow < blocsParColonne; blocRow++) {
|
||||||
for (int blocCol = 0; blocCol < blocsParLigne; blocCol++) {
|
for (int blocCol = 0; blocCol < blocsParLigne; blocCol++) {
|
||||||
List<int[]> positions = new ArrayList<>();
|
List<int[]> positions = new ArrayList<>();
|
||||||
|
|
||||||
// Ajouter toutes les positions pour le bloc courant
|
// Ajouter toutes les positions pour le bloc courant
|
||||||
for (int i = 0; i < blocHeight; i++) {
|
for (int i = 0; i < blocHeight; i++) {
|
||||||
for (int j = 0; j < blocWidth; j++) {
|
for (int j = 0; j < blocWidth; j++) {
|
||||||
positions.add(new int[] {
|
positions.add(new int[] {
|
||||||
blocRow * blocHeight + i,
|
blocRow * blocHeight + i,
|
||||||
blocCol * blocWidth + j
|
blocCol * blocWidth + j
|
||||||
});
|
});
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setCouleurBloc(positions);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setCouleurBloc(positions);
|
||||||
}
|
}
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
Console.errorln(e.getMessage());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -367,23 +355,23 @@ public class Grille {
|
|||||||
String cellStr = currentCase.toString();
|
String cellStr = currentCase.toString();
|
||||||
// Calculer le nombre d'espaces à ajouter pour atteindre maxLen
|
// Calculer le nombre d'espaces à ajouter pour atteindre maxLen
|
||||||
int pad = maxLen - cellStr.length();
|
int pad = maxLen - cellStr.length();
|
||||||
String padding = " ".repeat(pad); // nécessite Java 11 ou ultérieur
|
String padding = " ".repeat(pad);
|
||||||
|
|
||||||
Bloc bloc = findBlocForCase(currentCase);
|
Bloc bloc = findBlocForCase(currentCase);
|
||||||
|
|
||||||
if (bloc != null) {
|
if (bloc != null) {
|
||||||
sb.append(bloc.getCouleur()) // couleur du bloc
|
sb.append(bloc.getCouleur()) // couleur du bloc
|
||||||
.append(cellStr)
|
.append(cellStr) // symbole
|
||||||
.append(padding)
|
.append(padding) // padding pour aligner les symboles
|
||||||
.append("\u001B[0m ") // réinitialiser la couleur
|
.append("\u001B[0m ") // réinitialiser la couleur
|
||||||
.append(" ");
|
.append(" ");
|
||||||
} else {
|
} else { // pas de bloc, afficher normalement
|
||||||
sb.append(cellStr)
|
sb.append(cellStr)
|
||||||
.append(padding)
|
.append(padding)
|
||||||
.append(" ");
|
.append(" ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sb.append("\n");
|
sb.append("\n"); // nouvelle ligne
|
||||||
}
|
}
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,10 +12,9 @@ public class Multidoku {
|
|||||||
|
|
||||||
public void ajouterSudoku(Sudoku sudoku, int offsetLigne, int offsetColonne) {
|
public void ajouterSudoku(Sudoku sudoku, int offsetLigne, int offsetColonne) {
|
||||||
placements.add(new SudokuPlacement(sudoku, offsetLigne, offsetColonne));
|
placements.add(new SudokuPlacement(sudoku, offsetLigne, offsetColonne));
|
||||||
sudoku.getGrille().setMultidoku(this); // Passer la référence de Multidoku à Grille
|
sudoku.getGrille().setMultidoku(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dans la classe Multidoku, modifier la méthode ajouterCasesPartagees :
|
|
||||||
public void ajouterCasesPartagees(List<Case> cases) {
|
public void ajouterCasesPartagees(List<Case> cases) {
|
||||||
ContrainteCasePartagee contrainte = new ContrainteCasePartagee(cases, this);
|
ContrainteCasePartagee contrainte = new ContrainteCasePartagee(cases, this);
|
||||||
contraintesPartagees.add(contrainte);
|
contraintesPartagees.add(contrainte);
|
||||||
@@ -34,7 +33,7 @@ public class Multidoku {
|
|||||||
|
|
||||||
private List<GlobalCell> collecterCellulesVides() {
|
private List<GlobalCell> collecterCellulesVides() {
|
||||||
List<GlobalCell> cells = new ArrayList<>();
|
List<GlobalCell> cells = new ArrayList<>();
|
||||||
// Ajouter d'abord les cases partagées
|
// Ajout d'abord des cases partagées
|
||||||
for (ContrainteCasePartagee contrainte : contraintesPartagees) {
|
for (ContrainteCasePartagee contrainte : contraintesPartagees) {
|
||||||
for (Case c : contrainte.getCasesLiees()) {
|
for (Case c : contrainte.getCasesLiees()) {
|
||||||
if (c.getSymbole() == null) {
|
if (c.getSymbole() == null) {
|
||||||
@@ -43,7 +42,7 @@ public class Multidoku {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Ajouter ensuite les cases non partagées
|
// Ajout ensuite des cases non partagées
|
||||||
for (SudokuPlacement sp : placements) {
|
for (SudokuPlacement sp : placements) {
|
||||||
Sudoku s = sp.getSudoku();
|
Sudoku s = sp.getSudoku();
|
||||||
Grille g = s.getGrille();
|
Grille g = s.getGrille();
|
||||||
@@ -83,7 +82,8 @@ public class Multidoku {
|
|||||||
}
|
}
|
||||||
|
|
||||||
boolean ok;
|
boolean ok;
|
||||||
if (isSharedCase(c)) {
|
if (isSharedCase(c)) { // Si la case est partagée, on doit propager la valeur dans les cases
|
||||||
|
// correspondantes des autres sudokus concernés
|
||||||
ok = setCaseAvecPropagation(gc.ligne, gc.colonne, symbole, s);
|
ok = setCaseAvecPropagation(gc.ligne, gc.colonne, symbole, s);
|
||||||
} else {
|
} else {
|
||||||
c.setSymbole(symbole);
|
c.setSymbole(symbole);
|
||||||
@@ -132,7 +132,7 @@ public class Multidoku {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Propagation à la case correspondante uniquement
|
// Propagation à la case correspondante dans les autres sudokus concernés
|
||||||
for (ContrainteCasePartagee contrainte : contraintesPartagees) {
|
for (ContrainteCasePartagee contrainte : contraintesPartagees) {
|
||||||
if (contrainte.getCasesLiees().contains(c)) {
|
if (contrainte.getCasesLiees().contains(c)) {
|
||||||
Case caseCorrespondante = contrainte.getCaseCorrespondante(c);
|
Case caseCorrespondante = contrainte.getCaseCorrespondante(c);
|
||||||
@@ -188,7 +188,7 @@ public class Multidoku {
|
|||||||
|
|
||||||
public boolean verifierContraintesPartagees() {
|
public boolean verifierContraintesPartagees() {
|
||||||
return contraintesPartagees.stream()
|
return contraintesPartagees.stream()
|
||||||
.allMatch(c -> c.estRespectee(null, null)); // Adaptation nécessaire selon votre logique
|
.allMatch(c -> c.estRespectee(null, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isSharedCase(Case c) {
|
public boolean isSharedCase(Case c) {
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ public class Sudoku {
|
|||||||
Scanner scanner = new Scanner(System.in);
|
Scanner scanner = new Scanner(System.in);
|
||||||
// ETAPE 1 : TAILLE GRILLE
|
// ETAPE 1 : TAILLE GRILLE
|
||||||
System.out.println("ETAPE 1 : Choisir la taille de la grille");
|
System.out.println("ETAPE 1 : Choisir la taille de la grille");
|
||||||
int tailleGrille = setTailleGrille(scanner); // récpère la taille de la grille
|
int tailleGrille = setTailleGrille(scanner); // récupère la taille de la grille
|
||||||
Sudoku sudoku = new Sudoku(tailleGrille);
|
Sudoku sudoku = new Sudoku(tailleGrille);
|
||||||
// ETAPE 2 : SYMBOLE POSSIBLE
|
// ETAPE 2 : SYMBOLE POSSIBLE
|
||||||
System.out.println("ETAPE 2 : Choisir les symboles possibles");
|
System.out.println("ETAPE 2 : Choisir les symboles possibles");
|
||||||
@@ -140,8 +140,6 @@ public class Sudoku {
|
|||||||
System.out.println("Voulez-vous résoudre le sudoku ? (O/N)");
|
System.out.println("Voulez-vous résoudre le sudoku ? (O/N)");
|
||||||
String choix = scanner.nextLine();
|
String choix = scanner.nextLine();
|
||||||
if (choix.equalsIgnoreCase("O")) {
|
if (choix.equalsIgnoreCase("O")) {
|
||||||
System.out.println("Résolution du sudoku.");
|
|
||||||
// resolutionSudoku(sudoku);
|
|
||||||
System.out.println("Voulez-vous afficher les étapes de la résolution ? (O/N)");
|
System.out.println("Voulez-vous afficher les étapes de la résolution ? (O/N)");
|
||||||
String choixAffichageEtapes = scanner.nextLine();
|
String choixAffichageEtapes = scanner.nextLine();
|
||||||
|
|
||||||
@@ -176,47 +174,48 @@ public class Sudoku {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void setValeursGrille(Sudoku sudoku, Scanner scanner, int tailleGrille, int typeSymbole) {
|
private static void setValeursGrille(Sudoku sudoku, Scanner scanner, int tailleGrille, int typeSymbole) {
|
||||||
// Etude de la taille de la grille pour choisir le type de génération
|
while (true) {
|
||||||
if (carreParfait(tailleGrille)) {
|
try {
|
||||||
System.out.println(tailleGrille + " est un carré parfait.");
|
|
||||||
sudoku.getGrille().creerBlocCarre();
|
|
||||||
} else {
|
|
||||||
while (true) {
|
|
||||||
System.out.println("Veuillez faire votre choix");
|
System.out.println("Veuillez faire votre choix");
|
||||||
System.out.println("1 : Entrer les blocs manuellement");
|
System.out.println("1 : Entrer les blocs manuellement");
|
||||||
System.out.println("2 : Entrer les blocs à l'aide de la longueur et de la largeur");
|
System.out.println("2 : Entrer les blocs à l'aide de la longueur et de la largeur");
|
||||||
|
System.out.println("3 : Générer des blocs carrés");
|
||||||
|
|
||||||
int choixGenerationBloc = Integer.parseInt(scanner.nextLine());
|
int choixGenerationBloc = Integer.parseInt(scanner.nextLine());
|
||||||
|
|
||||||
switch (choixGenerationBloc) {
|
switch (choixGenerationBloc) {
|
||||||
case 1:
|
case 1:
|
||||||
// Entrer les blocs manuellement
|
|
||||||
System.out.println("Entrez les blocs manuellement.");
|
System.out.println("Entrez les blocs manuellement.");
|
||||||
creationBlocManuel(sudoku, scanner, tailleGrille);
|
creationBlocManuel(sudoku, scanner, tailleGrille);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
// Entrer les blocs à l'aide de la longueur et de la largeur
|
try {
|
||||||
boolean validDimensions = false;
|
System.out.println("Entrez les blocs à l'aide de la longueur et de la largeur.");
|
||||||
while (!validDimensions) {
|
System.out.println("Entrez la longueur du bloc : ");
|
||||||
try {
|
int longueurBloc = Integer.parseInt(scanner.nextLine());
|
||||||
System.out.println("Entrez les blocs à l'aide de la longueur et de la largeur.");
|
System.out.println("Entrez la largeur du bloc :");
|
||||||
System.out.println("Entrez la longueur du bloc : ");
|
int largeurBloc = Integer.parseInt(scanner.nextLine());
|
||||||
int longueurBloc = Integer.parseInt(scanner.nextLine());
|
sudoku.getGrille().creerBlocRectangulaire(longueurBloc, largeurBloc);
|
||||||
System.out.println("Entrez la largeur du bloc :");
|
break;
|
||||||
int largeurBloc = Integer.parseInt(scanner.nextLine());
|
} catch (IllegalArgumentException e) {
|
||||||
sudoku.getGrille().creerBlocRectangulaire(longueurBloc, largeurBloc);
|
Console.errorln("Erreur : " + e.getMessage());
|
||||||
validDimensions = true; // Sortir de la boucle si aucune exception n'est lancée
|
continue;
|
||||||
} catch (IllegalArgumentException e) {
|
}
|
||||||
Console.errorln("Erreur : " + e.getMessage());
|
case 3:
|
||||||
Console.errorln("Veuillez entrer des dimensions valides.");
|
try {
|
||||||
}
|
sudoku.getGrille().creerBlocCarre();
|
||||||
|
break;
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
Console.errorln("Erreur : " + e.getMessage());
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
Console.errorln("Choix invalide.");
|
Console.errorln("Choix invalide.");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
break;
|
break; // Sort de la boucle si la création des blocs a réussi
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
Console.errorln("Erreur : Veuillez entrer un nombre valide.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,20 +277,20 @@ public class Sudoku {
|
|||||||
try {
|
try {
|
||||||
Symbole s;
|
Symbole s;
|
||||||
switch (typeSymbole) {
|
switch (typeSymbole) {
|
||||||
case 1:
|
case 1: // Entiers
|
||||||
// Entiers
|
if (!Symbole.of(symbole).isInt()) {
|
||||||
|
throw new IllegalArgumentException("Veuillez entrer un nombre valide.");
|
||||||
|
}
|
||||||
s = Symbole.of(Integer.parseInt(symbole));
|
s = Symbole.of(Integer.parseInt(symbole));
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2: // Lettres
|
||||||
// Lettres
|
Symbole tempSymbole = Symbole.of(symbole);
|
||||||
if (symbole.length() == 1 && Character.isLetter(symbole.charAt(0))) {
|
if (!tempSymbole.isLetter()) {
|
||||||
s = Symbole.of(symbole.charAt(0));
|
|
||||||
} else {
|
|
||||||
throw new IllegalArgumentException("Veuillez entrer une seule lettre.");
|
throw new IllegalArgumentException("Veuillez entrer une seule lettre.");
|
||||||
}
|
}
|
||||||
|
s = tempSymbole;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3: // Chaînes de caractères
|
||||||
// Chaînes de caractères
|
|
||||||
s = Symbole.of(symbole);
|
s = Symbole.of(symbole);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -308,14 +307,6 @@ public class Sudoku {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean carreParfait(int nombre) {
|
|
||||||
if (nombre < 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
int racine = (int) Math.sqrt(nombre);
|
|
||||||
return racine * racine == nombre;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void creationBlocManuel(Sudoku sudoku, Scanner scanner, int tailleGrille) {
|
private static void creationBlocManuel(Sudoku sudoku, Scanner scanner, int tailleGrille) {
|
||||||
int nombreBloc = tailleGrille; // Nombre de blocs dans la grille
|
int nombreBloc = tailleGrille; // Nombre de blocs dans la grille
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user