diff --git a/.gitignore b/.gitignore index 1b6985c..2fd3480 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,8 @@ # Ignore Gradle build output directory build + +.vscode +.idea + +output.puml \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 4f19f0e..187d39d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,6 +22,9 @@ dependencies { // This dependency is used by the application. implementation 'com.google.guava:guava:31.1-jre' + + // uml + implementation 'com.github.javaparser:javaparser-symbol-solver-core:3.26.2' } application { diff --git a/app/src/main/java/sudoku/Bloc.java b/app/src/main/java/sudoku/Bloc.java index 39f1e90..ab3636f 100644 --- a/app/src/main/java/sudoku/Bloc.java +++ b/app/src/main/java/sudoku/Bloc.java @@ -1,14 +1,16 @@ package sudoku; -public class Bloc { +import java.util.List; - private final Case[] cases; +public class Bloc { - public Bloc(Case[] cases) { + private final List cases; + + public Bloc(List cases) { this.cases = cases; } - public Case[] getCases() { + public List getCases() { return cases; } diff --git a/app/src/main/java/sudoku/Case.java b/app/src/main/java/sudoku/Case.java index 17dc143..7f340ad 100644 --- a/app/src/main/java/sudoku/Case.java +++ b/app/src/main/java/sudoku/Case.java @@ -1,18 +1,46 @@ package sudoku; -public class Case { +public class Case { - private Symbole symbole; + private static int NOSYMBOLE = -1; + private int symboleIndex; + private Bloc bloc = null; - public Case(Symbole symbole) { - this.symbole = symbole; + public Case(int symboleIndex) { + this.symboleIndex = symboleIndex; } - public Symbole getSymbole() { - return this.symbole; + /** + * @brief Default constructor, empty square + */ + public Case() { + this(NOSYMBOLE); } - public void setSymbole(Symbole symbole) { - this.symbole = symbole; + public int getSymboleIndex() { + return symboleIndex; + } + + public void setSymboleIndex(int symboleIndex) { + this.symboleIndex = symboleIndex; + } + + public void clear() { + setSymboleIndex(NOSYMBOLE); + } + + public Bloc getBloc() { + return this.bloc; + } + + void setBloc(Bloc bloc) { + this.bloc = bloc; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Case autreCase) + return autreCase.getSymboleIndex() == this.getSymboleIndex(); + return super.equals(obj); } } diff --git a/app/src/main/java/sudoku/Main.java b/app/src/main/java/sudoku/Main.java index 7479a56..0084166 100644 --- a/app/src/main/java/sudoku/Main.java +++ b/app/src/main/java/sudoku/Main.java @@ -10,5 +10,6 @@ public class Main { public static void main(String[] args) { System.out.println(new Main().getGreeting()); + // var test = SudokuFactory.createBasicEmptySudoku(9); } } diff --git a/app/src/main/java/sudoku/MultiDoku.java b/app/src/main/java/sudoku/MultiDoku.java index 7561ad1..ac64057 100644 --- a/app/src/main/java/sudoku/MultiDoku.java +++ b/app/src/main/java/sudoku/MultiDoku.java @@ -1,6 +1,5 @@ package sudoku; -import java.util.ArrayList; import java.util.List; /** @@ -8,12 +7,12 @@ import java.util.List; * @brief Représente une grille de Multidoku. * Une grille de sudoku est un multidoku avec un seul sous-sudoku */ -public class MultiDoku { +public class MultiDoku { - private final List> sousGrilles; + private final List sousGrilles; - public MultiDoku(List> symboles) { - this.sousGrilles = new ArrayList<>(); + public MultiDoku(List sousGrilles) { + this.sousGrilles = sousGrilles; } } diff --git a/app/src/main/java/sudoku/Sudoku.java b/app/src/main/java/sudoku/Sudoku.java index a5d8567..da29fba 100644 --- a/app/src/main/java/sudoku/Sudoku.java +++ b/app/src/main/java/sudoku/Sudoku.java @@ -1,27 +1,36 @@ package sudoku; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; /** * @class Sudoku * @brief Représente une grille de sudoku avec N symboles */ -public class Sudoku { +public class Sudoku { - private final List> symboles; - private final List> blocs; - private final List> cases; + private final List blocs; + private final List cases; - public Sudoku(List> symboles) { - this.symboles = symboles; - // initialisation des cases - this.cases = new ArrayList<>(this.symboles.size() * this.symboles.size()); - Collections.fill(this.cases, new Case<>(null)); - // initialisation des blocs - this.blocs = new ArrayList<>(this.symboles.size()); - Collections.fill(this.blocs, new Bloc<>(null)); + public Sudoku(List cases, List blocs) { + // assert(symbolCount >= 2); + // // initialisation des cases + // this.cases = new ArrayList<>(symbolCount * symbolCount); + // Collections.fill(this.cases, new Case()); + // // initialisation des blocs + // this.blocs = new ArrayList<>(symbolCount); + // Collections.fill(this.blocs, new Bloc(null)); + this.cases = cases; + this.blocs = blocs; + } + + public Case getCase(int x, int y) { + int index = y * getSize() + x; + assert(index < getSize() * getSize()); + return this.cases.get(index); + } + + public int getSize() { + return this.blocs.size(); } } diff --git a/app/src/main/java/sudoku/Symbole.java b/app/src/main/java/sudoku/Symbole.java deleted file mode 100644 index fd51d68..0000000 --- a/app/src/main/java/sudoku/Symbole.java +++ /dev/null @@ -1,15 +0,0 @@ -package sudoku; - -public class Symbole { - - private final S valeur; - - public Symbole(S valeur) { - this.valeur = valeur; - } - - public S getValeur() { - return valeur; - } - -} diff --git a/app/src/main/java/sudoku/constraint/BlockConstraint.java b/app/src/main/java/sudoku/constraint/BlockConstraint.java new file mode 100644 index 0000000..dc537e1 --- /dev/null +++ b/app/src/main/java/sudoku/constraint/BlockConstraint.java @@ -0,0 +1,15 @@ +package sudoku.constraint; + +import sudoku.Bloc; +import sudoku.Case; +import sudoku.Sudoku; + +public class BlockConstraint implements IConstraint{ + + @Override + public boolean canBePlaced(final Sudoku s, int x, int y, int newSymbolIndex) { + Bloc bloc = s.getCase(x, y).getBloc(); + return !bloc.getCases().contains(new Case(newSymbolIndex)); + } + +} diff --git a/app/src/main/java/sudoku/constraint/ColumnConstraint.java b/app/src/main/java/sudoku/constraint/ColumnConstraint.java new file mode 100644 index 0000000..ef71445 --- /dev/null +++ b/app/src/main/java/sudoku/constraint/ColumnConstraint.java @@ -0,0 +1,16 @@ +package sudoku.constraint; + +import sudoku.Sudoku; + +public class ColumnConstraint implements IConstraint { + + @Override + public boolean canBePlaced(final Sudoku s, int x, int y, int newSymbolIndex) { + for (int i = 0; i < s.getSize(); i++) { + if (s.getCase(x, newSymbolIndex).getSymboleIndex() == newSymbolIndex) + return false; + } + return true; + } + +} diff --git a/app/src/main/java/sudoku/constraint/IConstraint.java b/app/src/main/java/sudoku/constraint/IConstraint.java new file mode 100644 index 0000000..3d7fca9 --- /dev/null +++ b/app/src/main/java/sudoku/constraint/IConstraint.java @@ -0,0 +1,22 @@ +package sudoku.constraint; + +import java.util.ArrayList; +import java.util.List; + +import sudoku.Sudoku; + +public interface IConstraint { + + boolean canBePlaced(final Sudoku s, int x, int y, int newSymbolIndex); + + default List getPossibleSymbols(final Sudoku s, int x, int y) { + List possibilities = new ArrayList<>(); + for (int i = 0; i < s.getSize(); i++) { + if (canBePlaced(s, x, y, i)) { + possibilities.add(i); + } + } + return possibilities; + } + +} diff --git a/app/src/main/java/sudoku/constraint/LineConstraint.java b/app/src/main/java/sudoku/constraint/LineConstraint.java new file mode 100644 index 0000000..f6836cd --- /dev/null +++ b/app/src/main/java/sudoku/constraint/LineConstraint.java @@ -0,0 +1,16 @@ +package sudoku.constraint; + +import sudoku.Sudoku; + +public class LineConstraint implements IConstraint { + + @Override + public boolean canBePlaced(final Sudoku s, int x, int y, int newSymbolIndex) { + for (int i = 0; i < s.getSize(); i++) { + if (s.getCase(newSymbolIndex, y).getSymboleIndex() == newSymbolIndex) + return false; + } + return true; + } + +} diff --git a/java2plantuml.jar b/java2plantuml.jar new file mode 100644 index 0000000..a81680d Binary files /dev/null and b/java2plantuml.jar differ