From d8486a3bd71dd69f6f45b8fd2344ddeea05939e2 Mon Sep 17 00:00:00 2001 From: Morph01 Date: Sun, 5 Jan 2025 11:13:19 +0100 Subject: [PATCH] feat: implement constraint classes for Sudoku (row, column, block) --- app/src/main/java/sudoku/Contrainte.java | 5 ++++ app/src/main/java/sudoku/ContrainteBloc.java | 24 +++++++++++++++++++ .../main/java/sudoku/ContrainteColonne.java | 19 +++++++++++++++ app/src/main/java/sudoku/ContrainteLigne.java | 19 +++++++++++++++ 4 files changed, 67 insertions(+) create mode 100644 app/src/main/java/sudoku/Contrainte.java create mode 100644 app/src/main/java/sudoku/ContrainteBloc.java create mode 100644 app/src/main/java/sudoku/ContrainteColonne.java create mode 100644 app/src/main/java/sudoku/ContrainteLigne.java diff --git a/app/src/main/java/sudoku/Contrainte.java b/app/src/main/java/sudoku/Contrainte.java new file mode 100644 index 0000000..141263b --- /dev/null +++ b/app/src/main/java/sudoku/Contrainte.java @@ -0,0 +1,5 @@ +package sudoku; + +public interface Contrainte { + boolean estRespectee(Grille grille, Case c); +} diff --git a/app/src/main/java/sudoku/ContrainteBloc.java b/app/src/main/java/sudoku/ContrainteBloc.java new file mode 100644 index 0000000..a0c27f9 --- /dev/null +++ b/app/src/main/java/sudoku/ContrainteBloc.java @@ -0,0 +1,24 @@ +package sudoku; + +import sudoku.core.Console; + +public class ContrainteBloc implements Contrainte { + @Override + public boolean estRespectee(Grille grille, Case c) { + int blocSize = (int) Math.sqrt(grille.getTaille()); + int startRow = (c.getLigne() / blocSize) * blocSize; + int startCol = (c.getColonne() / blocSize) * blocSize; + Symbole symbole = c.getSymbole(); + + for (int i = 0; i < blocSize; i++) { + for (int j = 0; j < blocSize; j++) { + Case currentCase = grille.getCase(startRow + i, startCol + j); + if (currentCase != c && currentCase.getSymbole() != null && currentCase.getSymbole().equals(symbole)) { + Console.errorln("La contrainte de bloc n'est pas respectee: ligne=" + (startRow + i) + ", col=" + (startCol + j) + ", symbole=" + symbole); + return false; + } + } + } + return true; + } +} \ No newline at end of file diff --git a/app/src/main/java/sudoku/ContrainteColonne.java b/app/src/main/java/sudoku/ContrainteColonne.java new file mode 100644 index 0000000..c0744cd --- /dev/null +++ b/app/src/main/java/sudoku/ContrainteColonne.java @@ -0,0 +1,19 @@ +package sudoku; + +import sudoku.core.Console; + +public class ContrainteColonne implements Contrainte { + @Override + public boolean estRespectee(Grille grille, Case c) { + int colonne = c.getColonne(); + Symbole symbole = c.getSymbole(); + for (int ligne = 0; ligne < grille.getTaille(); ligne++) { + Case currentCase = grille.getCase(ligne, colonne); + if (currentCase != c && currentCase.getSymbole() != null && currentCase.getSymbole().equals(symbole)) { + Console.errorln("La contrainte de colonne n'est pas respectee: ligne=" + ligne + ", col=" + colonne + ", symbole=" + symbole); + return false; + } + } + return true; + } +} \ No newline at end of file diff --git a/app/src/main/java/sudoku/ContrainteLigne.java b/app/src/main/java/sudoku/ContrainteLigne.java new file mode 100644 index 0000000..4a3ca55 --- /dev/null +++ b/app/src/main/java/sudoku/ContrainteLigne.java @@ -0,0 +1,19 @@ +package sudoku; + +import sudoku.core.Console; + +public class ContrainteLigne implements Contrainte { + @Override + public boolean estRespectee(Grille grille, Case c) { + int ligne = c.getLigne(); + Symbole symbole = c.getSymbole(); + for (int col = 0; col < grille.getTaille(); col++) { + Case currentCase = grille.getCase(ligne, col); + if (currentCase != c && currentCase.getSymbole() != null && currentCase.getSymbole().equals(symbole)) { + Console.errorln("La contrainte de ligne n'est pas respectee: ligne=" + ligne + ", col=" + col + ", symbole=" + symbole); + return false; + } + } + return true; + } +} \ No newline at end of file