From a36960c57a0fa8c041404effbfeba3bfdcb28247 Mon Sep 17 00:00:00 2001 From: Morph01 Date: Fri, 7 Feb 2025 10:16:34 +0100 Subject: [PATCH] feat: colors in multidokus ! --- app/src/main/java/sudoku/Grille.java | 2 +- app/src/main/java/sudoku/Multidoku.java | 88 ++++++++++++++++++--- app/src/test/java/sudoku/TestMultidoku.java | 4 + 3 files changed, 81 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/sudoku/Grille.java b/app/src/main/java/sudoku/Grille.java index 37b1873..07d0dd7 100644 --- a/app/src/main/java/sudoku/Grille.java +++ b/app/src/main/java/sudoku/Grille.java @@ -313,7 +313,7 @@ public class Grille { return taille; } - private Bloc findBlocForCase(Case target) { + Bloc findBlocForCase(Case target) { for (Bloc bloc : blocs) { if (bloc.getCases().contains(target)) { return bloc; diff --git a/app/src/main/java/sudoku/Multidoku.java b/app/src/main/java/sudoku/Multidoku.java index 2428162..2796457 100644 --- a/app/src/main/java/sudoku/Multidoku.java +++ b/app/src/main/java/sudoku/Multidoku.java @@ -24,9 +24,56 @@ public class Multidoku { placements.add(new SudokuPlacement(sudoku, offsetLigne, offsetColonne)); } - // Méthode d’affichage combiné + // // Méthode d’affichage combiné + // public String toStringCombined() { + // // 1. Déterminer la taille globale de l’affichage + // int maxLigne = 0, maxColonne = 0; + // for (SudokuPlacement sp : placements) { + // int taille = sp.getSudoku().getGrille().getTaille(); + // maxLigne = Math.max(maxLigne, sp.getOffsetLigne() + taille); + // maxColonne = Math.max(maxColonne, sp.getOffsetColonne() + taille); + // } + + // // 2. Créer une matrice globale et l'initialiser (ici avec "-" pour une case + // // vide) + // String[][] global = new String[maxLigne][maxColonne]; + // for (int i = 0; i < maxLigne; i++) { + // for (int j = 0; j < maxColonne; j++) { + // global[i][j] = " "; // ou " " selon votre choix + // } + // } + + // // 3. Pour chaque sudoku, placer l’affichage de ses cases dans la grille + // globale + // for (SudokuPlacement sp : placements) { + // Grille grille = sp.getSudoku().getGrille(); + // int taille = grille.getTaille(); + // for (int i = 0; i < taille; i++) { + // for (int j = 0; j < taille; j++) { + // // Calcul des coordonnées globales + // int globalLigne = sp.getOffsetLigne() + i; + // int globalColonne = sp.getOffsetColonne() + j; + // // Ici, on récupère la représentation de la case via toString (possiblement + // avec + // // la couleur) + // global[globalLigne][globalColonne] = grille.getCase(i, j).toString(); + // } + // } + // } + + // // 4. Construire la chaîne finale d’affichage ligne par ligne + // StringBuilder sb = new StringBuilder(); + // for (int i = 0; i < maxLigne; i++) { + // for (int j = 0; j < maxColonne; j++) { + // sb.append(global[i][j]).append(" "); + // } + // sb.append("\n"); + // } + // return sb.toString(); + // } + public String toStringCombined() { - // 1. Déterminer la taille globale de l’affichage + // 1. Déterminer la taille globale de la grille combinée int maxLigne = 0, maxColonne = 0; for (SudokuPlacement sp : placements) { int taille = sp.getSudoku().getGrille().getTaille(); @@ -34,36 +81,53 @@ public class Multidoku { maxColonne = Math.max(maxColonne, sp.getOffsetColonne() + taille); } - // 2. Créer une matrice globale et l'initialiser (ici avec "-" pour une case - // vide) + // 2. Création et initialisation de la matrice globale String[][] global = new String[maxLigne][maxColonne]; for (int i = 0; i < maxLigne; i++) { for (int j = 0; j < maxColonne; j++) { - global[i][j] = " "; // ou " " selon votre choix + global[i][j] = " "; // case vide affichée par défaut } } - // 3. Pour chaque sudoku, placer l’affichage de ses cases dans la grille globale + // 3. Pour chaque sudoku, placer l'affichage de chacune de ses cases dans la + // grille globale for (SudokuPlacement sp : placements) { Grille grille = sp.getSudoku().getGrille(); int taille = grille.getTaille(); + int maxLen = grille.getLongueurSymboleLePlusLong(); // pour le padding for (int i = 0; i < taille; i++) { for (int j = 0; j < taille; j++) { - // Calcul des coordonnées globales + // Coordonnées globales calculées à partir de l'offset int globalLigne = sp.getOffsetLigne() + i; int globalColonne = sp.getOffsetColonne() + j; - // Ici, on récupère la représentation de la case via toString (possiblement avec - // la couleur) - global[globalLigne][globalColonne] = grille.getCase(i, j).toString(); + + Case currentCase = grille.getCase(i, j); + String cellStr = currentCase.toString(); + // Calcul du padding nécessaire pour un alignement uniforme + int pad = maxLen - cellStr.length(); + String padding = " ".repeat(pad); + + // Récupérer le bloc associé à la case afin d'obtenir sa couleur + Bloc bloc = grille.findBlocForCase(currentCase); + String cellDisplay; + if (bloc != null) { + // Concaténation de la couleur, du symbole, du padding, et du code de + // réinitialisation + cellDisplay = bloc.getCouleur() + cellStr + padding + "\u001B[0m "; + } else { + cellDisplay = cellStr + padding + " "; + } + // Insertion dans la matrice globale + global[globalLigne][globalColonne] = cellDisplay; } } } - // 4. Construire la chaîne finale d’affichage ligne par ligne + // 4. Construction de la chaîne d'affichage finale StringBuilder sb = new StringBuilder(); for (int i = 0; i < maxLigne; i++) { for (int j = 0; j < maxColonne; j++) { - sb.append(global[i][j]).append(" "); + sb.append(global[i][j]); } sb.append("\n"); } diff --git a/app/src/test/java/sudoku/TestMultidoku.java b/app/src/test/java/sudoku/TestMultidoku.java index 71845f4..aece6e3 100644 --- a/app/src/test/java/sudoku/TestMultidoku.java +++ b/app/src/test/java/sudoku/TestMultidoku.java @@ -39,6 +39,10 @@ public class TestMultidoku { sudoku.ajouterContrainte(new ContrainteColonne()); sudoku.ajouterContrainte(new ContrainteBloc()); sudoku.getGrille().creerBlocCarre(); + + for (int i = 0; i < sudoku.getGrille().getTaille(); i++) { + sudoku.getGrille().setCase(i, i, symboles.get(i)); + } } System.out.println("Sudoku 1 :");