diff --git a/app/src/main/java/sudoku/Grille.java b/app/src/main/java/sudoku/Grille.java index d3ea889..9c5545a 100644 --- a/app/src/main/java/sudoku/Grille.java +++ b/app/src/main/java/sudoku/Grille.java @@ -13,7 +13,7 @@ public class Grille { private final Case[][] cases; private final ArrayList blocs; private ArrayList symbolesPossibles; - private final Sudoku sudoku; + private final Sudoku sudoku; // Référence à Sudoku private Multidoku multidoku; // Référence à Multidoku private List generatedColors; @@ -23,8 +23,6 @@ public class Grille { this.blocs = new ArrayList<>(); this.symbolesPossibles = new ArrayList<>(); this.sudoku = sudoku; - // Pour un sudoku classique, on attend "taille" blocs, donc on génère "taille" - // couleurs. initColors(); // Initialiser les cases @@ -70,7 +68,6 @@ public class Grille { Symbole ancienSymbole = currentCase.getSymbole(); currentCase.setSymbole(symbole); - // Verify constraints including shared cases if (!sudoku.verifierToutesContraintes() || (multidoku != null && !multidoku.verifierContraintesPartagees())) { currentCase.setSymbole(ancienSymbole); @@ -134,33 +131,28 @@ public class Grille { * Crée des blocs carrés (par exemple pour un sudoku classique). */ public void creerBlocCarre() { - try { - int blocSize = (int) Math.sqrt(taille); - if (blocSize * blocSize != taille) { - throw new IllegalArgumentException("La taille de la grille doit être un carré parfait."); - } + int blocSize = (int) Math.sqrt(taille); + if (blocSize * blocSize != taille) { + 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) - for (int blocRow = 0; blocRow < blocSize; blocRow++) { - for (int blocCol = 0; blocCol < blocSize; blocCol++) { - List positions = new ArrayList<>(); + // Création des blocs en motif (par exemple 3x3 pour un sudoku 9x9) + for (int blocRow = 0; blocRow < blocSize; blocRow++) { + for (int blocCol = 0; blocCol < blocSize; blocCol++) { + List positions = new ArrayList<>(); - // Ajouter toutes les positions pour le bloc courant - for (int i = 0; i < blocSize; i++) { - for (int j = 0; j < blocSize; j++) { - positions.add(new int[] { - blocRow * blocSize + i, - blocCol * blocSize + j - }); - } + // Ajouter toutes les positions pour le bloc courant + for (int i = 0; i < blocSize; i++) { + for (int j = 0; j < blocSize; j++) { + positions.add(new int[] { + blocRow * blocSize + i, + 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. */ public void creerBlocRectangulaire(int blocHeight, int blocWidth) { - try { - if (taille % blocHeight != 0 || taille % blocWidth != 0) { - throw new IllegalArgumentException( - "La taille de la grille doit être divisible par les dimensions des blocs."); - } + if (taille % blocHeight != 0 || taille % blocWidth != 0) { + throw new IllegalArgumentException( + "La taille de la grille doit être divisible par les dimensions des blocs."); + } - int blocsParLigne = taille / blocWidth; - int blocsParColonne = taille / blocHeight; + int blocsParLigne = taille / blocWidth; + int blocsParColonne = taille / blocHeight; - // Création des blocs en motif rectangulaire - for (int blocRow = 0; blocRow < blocsParColonne; blocRow++) { - for (int blocCol = 0; blocCol < blocsParLigne; blocCol++) { - List positions = new ArrayList<>(); + // Création des blocs en motif rectangulaire + for (int blocRow = 0; blocRow < blocsParColonne; blocRow++) { + for (int blocCol = 0; blocCol < blocsParLigne; blocCol++) { + List positions = new ArrayList<>(); - // Ajouter toutes les positions pour le bloc courant - for (int i = 0; i < blocHeight; i++) { - for (int j = 0; j < blocWidth; j++) { - positions.add(new int[] { - blocRow * blocHeight + i, - blocCol * blocWidth + j - }); - } + // Ajouter toutes les positions pour le bloc courant + for (int i = 0; i < blocHeight; i++) { + for (int j = 0; j < blocWidth; j++) { + positions.add(new int[] { + blocRow * blocHeight + i, + 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(); // Calculer le nombre d'espaces à ajouter pour atteindre maxLen int pad = maxLen - cellStr.length(); - String padding = " ".repeat(pad); // nécessite Java 11 ou ultérieur + String padding = " ".repeat(pad); Bloc bloc = findBlocForCase(currentCase); if (bloc != null) { sb.append(bloc.getCouleur()) // couleur du bloc - .append(cellStr) - .append(padding) + .append(cellStr) // symbole + .append(padding) // padding pour aligner les symboles .append("\u001B[0m ") // réinitialiser la couleur .append(" "); - } else { + } else { // pas de bloc, afficher normalement sb.append(cellStr) .append(padding) .append(" "); } } - sb.append("\n"); + sb.append("\n"); // nouvelle ligne } return sb.toString(); } diff --git a/app/src/main/java/sudoku/Multidoku.java b/app/src/main/java/sudoku/Multidoku.java index e1f802b..53fb203 100644 --- a/app/src/main/java/sudoku/Multidoku.java +++ b/app/src/main/java/sudoku/Multidoku.java @@ -12,10 +12,9 @@ public class Multidoku { public void ajouterSudoku(Sudoku sudoku, int offsetLigne, int 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 cases) { ContrainteCasePartagee contrainte = new ContrainteCasePartagee(cases, this); contraintesPartagees.add(contrainte); @@ -34,7 +33,7 @@ public class Multidoku { private List collecterCellulesVides() { List cells = new ArrayList<>(); - // Ajouter d'abord les cases partagées + // Ajout d'abord des cases partagées for (ContrainteCasePartagee contrainte : contraintesPartagees) { for (Case c : contrainte.getCasesLiees()) { 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) { Sudoku s = sp.getSudoku(); Grille g = s.getGrille(); @@ -83,7 +82,8 @@ public class Multidoku { } 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); } else { c.setSymbole(symbole); @@ -132,7 +132,7 @@ public class Multidoku { return false; } - // Propagation à la case correspondante uniquement + // Propagation à la case correspondante dans les autres sudokus concernés for (ContrainteCasePartagee contrainte : contraintesPartagees) { if (contrainte.getCasesLiees().contains(c)) { Case caseCorrespondante = contrainte.getCaseCorrespondante(c); @@ -188,7 +188,7 @@ public class Multidoku { public boolean verifierContraintesPartagees() { 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) { diff --git a/app/src/main/java/sudoku/Sudoku.java b/app/src/main/java/sudoku/Sudoku.java index e1b84b7..d67610a 100644 --- a/app/src/main/java/sudoku/Sudoku.java +++ b/app/src/main/java/sudoku/Sudoku.java @@ -63,7 +63,7 @@ public class Sudoku { Scanner scanner = new Scanner(System.in); // ETAPE 1 : TAILLE 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); // ETAPE 2 : SYMBOLE POSSIBLE 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)"); String choix = scanner.nextLine(); 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)"); String choixAffichageEtapes = scanner.nextLine(); @@ -176,47 +174,48 @@ public class Sudoku { } 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 - if (carreParfait(tailleGrille)) { - System.out.println(tailleGrille + " est un carré parfait."); - sudoku.getGrille().creerBlocCarre(); - } else { - while (true) { + while (true) { + try { System.out.println("Veuillez faire votre choix"); 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("3 : Générer des blocs carrés"); int choixGenerationBloc = Integer.parseInt(scanner.nextLine()); switch (choixGenerationBloc) { case 1: - // Entrer les blocs manuellement System.out.println("Entrez les blocs manuellement."); creationBlocManuel(sudoku, scanner, tailleGrille); break; case 2: - // Entrer les blocs à l'aide de la longueur et de la largeur - boolean validDimensions = false; - while (!validDimensions) { - try { - System.out.println("Entrez les blocs à l'aide de la longueur et de la largeur."); - System.out.println("Entrez la longueur du bloc : "); - int longueurBloc = Integer.parseInt(scanner.nextLine()); - System.out.println("Entrez la largeur du bloc :"); - int largeurBloc = Integer.parseInt(scanner.nextLine()); - sudoku.getGrille().creerBlocRectangulaire(longueurBloc, largeurBloc); - validDimensions = true; // Sortir de la boucle si aucune exception n'est lancée - } catch (IllegalArgumentException e) { - Console.errorln("Erreur : " + e.getMessage()); - Console.errorln("Veuillez entrer des dimensions valides."); - } + try { + System.out.println("Entrez les blocs à l'aide de la longueur et de la largeur."); + System.out.println("Entrez la longueur du bloc : "); + int longueurBloc = Integer.parseInt(scanner.nextLine()); + System.out.println("Entrez la largeur du bloc :"); + int largeurBloc = Integer.parseInt(scanner.nextLine()); + sudoku.getGrille().creerBlocRectangulaire(longueurBloc, largeurBloc); + break; + } catch (IllegalArgumentException e) { + Console.errorln("Erreur : " + e.getMessage()); + continue; + } + case 3: + try { + sudoku.getGrille().creerBlocCarre(); + break; + } catch (IllegalArgumentException e) { + Console.errorln("Erreur : " + e.getMessage()); + continue; } - break; default: Console.errorln("Choix invalide."); 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 { Symbole s; switch (typeSymbole) { - case 1: - // Entiers + case 1: // Entiers + if (!Symbole.of(symbole).isInt()) { + throw new IllegalArgumentException("Veuillez entrer un nombre valide."); + } s = Symbole.of(Integer.parseInt(symbole)); break; - case 2: - // Lettres - if (symbole.length() == 1 && Character.isLetter(symbole.charAt(0))) { - s = Symbole.of(symbole.charAt(0)); - } else { + case 2: // Lettres + Symbole tempSymbole = Symbole.of(symbole); + if (!tempSymbole.isLetter()) { throw new IllegalArgumentException("Veuillez entrer une seule lettre."); } + s = tempSymbole; break; - case 3: - // Chaînes de caractères + case 3: // Chaînes de caractères s = Symbole.of(symbole); break; 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) { int nombreBloc = tailleGrille; // Nombre de blocs dans la grille