beaucoup
All checks were successful
Linux arm64 / Build (push) Successful in 1m47s

This commit is contained in:
2025-01-10 14:47:20 +01:00
parent 34cf7b5da8
commit 09ba8c00cb
13 changed files with 147 additions and 46 deletions

5
.gitignore vendored
View File

@@ -3,3 +3,8 @@
# Ignore Gradle build output directory
build
.vscode
.idea
output.puml

View File

@@ -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 {

View File

@@ -1,14 +1,16 @@
package sudoku;
public class Bloc<S> {
import java.util.List;
private final Case<S>[] cases;
public class Bloc {
public Bloc(Case<S>[] cases) {
private final List<Case> cases;
public Bloc(List<Case> cases) {
this.cases = cases;
}
public Case<S>[] getCases() {
public List<Case> getCases() {
return cases;
}

View File

@@ -1,18 +1,46 @@
package sudoku;
public class Case<S> {
public class Case {
private Symbole<S> symbole;
private static int NOSYMBOLE = -1;
private int symboleIndex;
private Bloc bloc = null;
public Case(Symbole<S> symbole) {
this.symbole = symbole;
public Case(int symboleIndex) {
this.symboleIndex = symboleIndex;
}
public Symbole<S> getSymbole() {
return this.symbole;
/**
* @brief Default constructor, empty square
*/
public Case() {
this(NOSYMBOLE);
}
public void setSymbole(Symbole<S> 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);
}
}

View File

@@ -10,5 +10,6 @@ public class Main {
public static void main(String[] args) {
System.out.println(new Main().getGreeting());
// var test = SudokuFactory.createBasicEmptySudoku(9);
}
}

View File

@@ -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<S> {
public class MultiDoku {
private final List<Sudoku<S>> sousGrilles;
private final List<Sudoku> sousGrilles;
public MultiDoku(List<Symbole<S>> symboles) {
this.sousGrilles = new ArrayList<>();
public MultiDoku(List<Sudoku> sousGrilles) {
this.sousGrilles = sousGrilles;
}
}

View File

@@ -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<S> {
public class Sudoku {
private final List<Symbole<S>> symboles;
private final List<Bloc<S>> blocs;
private final List<Case<S>> cases;
private final List<Bloc> blocs;
private final List<Case> cases;
public Sudoku(List<Symbole<S>> 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<Case> cases, List<Bloc> 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();
}
}

View File

@@ -1,15 +0,0 @@
package sudoku;
public class Symbole<S> {
private final S valeur;
public Symbole(S valeur) {
this.valeur = valeur;
}
public S getValeur() {
return valeur;
}
}

View File

@@ -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));
}
}

View File

@@ -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;
}
}

View File

@@ -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<Integer> getPossibleSymbols(final Sudoku s, int x, int y) {
List<Integer> possibilities = new ArrayList<>();
for (int i = 0; i < s.getSize(); i++) {
if (canBePlaced(s, x, y, i)) {
possibilities.add(i);
}
}
return possibilities;
}
}

View File

@@ -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;
}
}

BIN
java2plantuml.jar Normal file

Binary file not shown.