5 Commits

Author SHA1 Message Date
68021b796b Fixes #28
All checks were successful
Linux arm64 / Build (push) Successful in 41s
2025-02-02 10:35:00 +01:00
06efbf649b Fixes #33
All checks were successful
Linux arm64 / Build (push) Successful in 38s
2025-02-02 10:27:42 +01:00
4ee29d8f50 Fixes #10
All checks were successful
Linux arm64 / Build (push) Successful in 39s
2025-02-02 10:17:09 +01:00
eda2a1afae Fixes #39 2025-02-02 10:14:27 +01:00
f3bbfd9e6c feat: show resolve logs
All checks were successful
Linux arm64 / Build (push) Successful in 40s
2025-02-02 00:04:52 +01:00
12 changed files with 90 additions and 58 deletions

View File

@@ -31,7 +31,7 @@ public class Main extends Application {
@Override @Override
protected void preRun() { protected void preRun() {
super.preRun(); super.preRun();
Images.loadImages(); Images.reloadImages();
} }
@Override @Override

View File

@@ -32,8 +32,8 @@ public class Images {
return textureID; return textureID;
} }
public static void loadImages() { public static void reloadImages() {
BACKGROUND = loadTexture("background.png"); BACKGROUND = loadTexture(Options.BackgroundPath);
} }
} }

View File

@@ -4,5 +4,6 @@ public class Options {
public static Symbols Symboles = Symbols.Numbers; public static Symbols Symboles = Symbols.Numbers;
public static float BackgroundSpeed = 1.0f; public static float BackgroundSpeed = 1.0f;
public static String BackgroundPath = "background.png";
} }

View File

@@ -14,12 +14,12 @@ public class ConnexionStatusView extends BaseView {
private String displayText = "Connecting ..."; private String displayText = "Connecting ...";
public ConnexionStatusView(StateMachine stateMachine, String address, short port) public ConnexionStatusView(StateMachine stateMachine, String pseudo, String address, short port)
throws UnknownHostException, IOException { throws UnknownHostException, IOException {
super(stateMachine); super(stateMachine);
Thread t = new Thread(() -> { Thread t = new Thread(() -> {
try { try {
this.client = new Client(address, port); this.client = new Client(pseudo, address, port);
bindListeners(); bindListeners();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
@@ -29,12 +29,13 @@ public class ConnexionStatusView extends BaseView {
t.start(); t.start();
} }
public ConnexionStatusView(StateMachine stateMachine, short port) throws UnknownHostException, IOException { public ConnexionStatusView(StateMachine stateMachine, String pseudo, short port)
throws UnknownHostException, IOException {
super(stateMachine); super(stateMachine);
Thread t = new Thread(() -> { Thread t = new Thread(() -> {
try { try {
this.server = new Server(port); this.server = new Server(port);
this.client = new Client("localhost", port); this.client = new Client(pseudo, "localhost", port);
bindListeners(); bindListeners();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();

View File

@@ -1,6 +1,7 @@
package gui.menu; package gui.menu;
import java.io.IOException; import java.io.IOException;
import java.util.Random;
import imgui.ImGui; import imgui.ImGui;
import imgui.ImVec2; import imgui.ImVec2;
@@ -11,6 +12,7 @@ public class MultiMenu extends BaseView {
private final ImInt port = new ImInt(25565); private final ImInt port = new ImInt(25565);
private final ImString address = new ImString("localhost"); private final ImString address = new ImString("localhost");
private final ImString pseudo = new ImString("Joueur" + new Random().nextInt());
public MultiMenu(StateMachine stateMachine) { public MultiMenu(StateMachine stateMachine) {
super(stateMachine); super(stateMachine);
@@ -22,9 +24,10 @@ public class MultiMenu extends BaseView {
ImGui.beginChild("##CreateGame", new ImVec2(displaySize.x / 2.0f, displaySize.y * 8.0f / 9.0f)); ImGui.beginChild("##CreateGame", new ImVec2(displaySize.x / 2.0f, displaySize.y * 8.0f / 9.0f));
if (ImGui.inputInt("Port", port)) if (ImGui.inputInt("Port", port))
port.set(Math.clamp(port.get(), 1, 65535)); port.set(Math.clamp(port.get(), 1, 65535));
ImGui.inputText("Pseudo", pseudo);
if (ImGui.button("Créer")) { if (ImGui.button("Créer")) {
try { try {
this.stateMachine.pushState(new ConnexionStatusView(stateMachine, (short) port.get())); this.stateMachine.pushState(new ConnexionStatusView(stateMachine, pseudo.get(), (short) port.get()));
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
@@ -38,6 +41,7 @@ public class MultiMenu extends BaseView {
ImGui.inputText("Adresse", address); ImGui.inputText("Adresse", address);
if (ImGui.inputInt("Port", port)) if (ImGui.inputInt("Port", port))
port.set(Math.clamp(port.get(), 1, 65535)); port.set(Math.clamp(port.get(), 1, 65535));
ImGui.inputText("Pseudo", pseudo);
if (ImGui.button("Rejoindre")) { if (ImGui.button("Rejoindre")) {
try { try {
this.stateMachine.pushState(new ConnexionStatusView(stateMachine, address.get(), (short) port.get())); this.stateMachine.pushState(new ConnexionStatusView(stateMachine, address.get(), (short) port.get()));

View File

@@ -1,28 +1,56 @@
package gui.menu; package gui.menu;
import gui.constants.Images;
import gui.constants.Options; import gui.constants.Options;
import gui.constants.Symbols; import gui.constants.Symbols;
import imgui.ImGui; import imgui.ImGui;
import imgui.extension.imguifiledialog.ImGuiFileDialog;
import imgui.extension.imguifiledialog.flag.ImGuiFileDialogFlags;
import imgui.type.ImInt; import imgui.type.ImInt;
public class OptionsMenu extends BaseView { public class OptionsMenu extends BaseView {
private ImInt currentValue = new ImInt(); private ImInt currentValue = new ImInt();
private float backgroundSpeed[] = new float[]{Options.BackgroundSpeed}; private float backgroundSpeed[] = new float[] { Options.BackgroundSpeed };
public OptionsMenu(StateMachine stateMachine) { public OptionsMenu(StateMachine stateMachine) {
super(stateMachine); super(stateMachine);
} }
private void renderImageSelectDialog() {
if (ImGuiFileDialog.display("browse-img", ImGuiFileDialogFlags.None)) {
if (ImGuiFileDialog.isOk()) {
var selection = ImGuiFileDialog.getSelection();
for (var entry : selection.entrySet()) {
try {
String filePath = entry.getValue();
Options.BackgroundPath = filePath;
Images.reloadImages();
} catch (Exception e) {
e.printStackTrace();
}
}
}
ImGuiFileDialog.close();
}
}
private void renderImageSelectButton() {
if (ImGui.button("Changer de fond d'écran"))
ImGuiFileDialog.openDialog("browse-img", "Choisissez un fichier", ".png,.jpg,.jpeg", ".");
renderImageSelectDialog();
}
@Override @Override
public void render() { public void render() {
ImGui.text("Options"); ImGui.text("Options");
if(ImGui.combo("Jeu de symboles", currentValue, Symbols.getSymbolsNames())){ if (ImGui.combo("Jeu de symboles", currentValue, Symbols.getSymbolsNames())) {
Options.Symboles = Symbols.values()[currentValue.get()]; Options.Symboles = Symbols.values()[currentValue.get()];
} }
if(ImGui.sliderFloat("Vitesse d'animation de l'arrière plan", backgroundSpeed, 0.0f, 10.0f)){ if (ImGui.sliderFloat("Vitesse d'animation de l'arrière plan", backgroundSpeed, 0.0f, 10.0f)) {
Options.BackgroundSpeed = backgroundSpeed[0]; Options.BackgroundSpeed = backgroundSpeed[0];
} }
renderImageSelectButton();
renderReturnButton(); renderReturnButton();
} }

View File

@@ -92,6 +92,7 @@ public class SudokuView extends BaseView {
} }
private void startSolve(Solver solver) { private void startSolve(Solver solver) {
this.doku.clearMutableCells();
resolveThread = new Thread(() -> { resolveThread = new Thread(() -> {
List<SolverStep> steps = new ArrayList<>(); List<SolverStep> steps = new ArrayList<>();
try { try {
@@ -158,6 +159,8 @@ public class SudokuView extends BaseView {
private void renderClearButton() { private void renderClearButton() {
if (centeredButton("Effacer")) { if (centeredButton("Effacer")) {
this.doku.clearMutableCells(); this.doku.clearMutableCells();
this.resolved = false;
this.unresolved = false;
} }
} }

View File

@@ -28,12 +28,10 @@ public class Client {
String disconnectReason = null; String disconnectReason = null;
public Client(String address, short port) throws UnknownHostException, IOException { public Client(String pseudo, String address, short port) throws UnknownHostException, IOException {
this.clientConnection = new ClientConnexion(address, port, this); this.clientConnection = new ClientConnexion(address, port, this);
this.game = new Game(); this.game = new Game();
// temp login(pseudo);
Random r = new Random();
login("Player" + r.nextInt());
} }
public void login(String pseudo) { public void login(String pseudo) {

View File

@@ -227,7 +227,7 @@ public class ConsoleInterface {
saveMultiDoku(doku); saveMultiDoku(doku);
break; break;
case "solution": case "solution":
solve(doku); solve(doku, listSymbols, width, height);
break; break;
case "exit": case "exit":
exit(); exit();
@@ -238,21 +238,52 @@ public class ConsoleInterface {
} }
} }
private void solve(MultiDoku doku){ private void applyStep(SolverStep step) {
System.out.println("Pick a solver to use : random ('random', default), human ('human') or mixed solver ('mixed')."); step.getCell().setSymbolIndex(step.getNewValue());
}
private boolean showStep(MultiDoku doku, List<String> listSymbols, int width, int height, SolverStep step) {
System.out.println("Here is the step : \n");
showMultidoku(doku, listSymbols, width, height);
applyStep(step);
System.out.println("\nTurns into :\n");
showMultidoku(doku, listSymbols, width, height);
System.out.println("Do you want to see the next step ? (y/n, default n)");
return reader.next().equals("y");
}
private void showSolveSteps(MultiDoku doku, List<String> listSymbols, int width, int height, List<SolverStep> steps) {
System.out.println("Would you like to see the steps of the solver ? (y/n, default n)");
doku.getStateManager().popState();
switch (reader.next()) { switch (reader.next()) {
case "human": case "y":
new HumanSolver().solve(doku); int stepCount = 0;
break; while(stepCount < steps.size() && showStep(doku, listSymbols, width, height, steps.get(stepCount))){stepCount++;}
case "mixed":
new MixedSolver().solve(doku);
break; break;
default: default:
new RandomSolver().solve(doku);
break; break;
} }
} }
private void solve(MultiDoku doku, List<String> listSymbols, int width, int height){
System.out.println("Pick a solver to use : random ('random', default), human ('human') or mixed solver ('mixed').");
List<SolverStep> steps = new ArrayList<>();
doku.getStateManager().pushState();
switch (reader.next()) {
case "human":
new HumanSolver().solve(doku, steps);
break;
case "mixed":
new MixedSolver().solve(doku, steps);
break;
default:
new RandomSolver().solve(doku, steps);
break;
}
showSolveSteps(doku, listSymbols, width, height, steps);
}
private void play(MultiDoku doku, List<String> listSymbols, int width, int height) { private void play(MultiDoku doku, List<String> listSymbols, int width, int height) {
int x, y; int x, y;
RenderableMultidoku rdoku = RenderableMultidoku.fromMultidoku(doku); RenderableMultidoku rdoku = RenderableMultidoku.fromMultidoku(doku);

View File

@@ -2,13 +2,9 @@ package sudoku.solver;
import java.util.List; import java.util.List;
import java.util.concurrent.CancellationException; import java.util.concurrent.CancellationException;
import java.util.logging.Level;
import gui.constants.Symbols;
import sudoku.io.SudokuPrinter;
import sudoku.structure.Cell; import sudoku.structure.Cell;
import sudoku.structure.MultiDoku; import sudoku.structure.MultiDoku;
import sudoku.structure.Sudoku;
public class HumanSolver implements Solver { public class HumanSolver implements Solver {
@@ -23,13 +19,6 @@ public class HumanSolver implements Solver {
if (Thread.interrupted()) if (Thread.interrupted())
throw new CancellationException("User wants to stop the solver"); throw new CancellationException("User wants to stop the solver");
Sudoku sudoku = doku.getSubGrid(0);
logger.log(Level.FINE,
'\n' + SudokuPrinter.toStringRectangleSudoku(sudoku,
sudoku.getBlockWidth() == 0 ? sudoku.getSize() : sudoku.getBlockWidth(),
sudoku.getBlockWidth() == 0 ? sudoku.getSize() : sudoku.getSize() / sudoku.getBlockWidth(),
Symbols.Numbers));
if (doku.isSolved()) { if (doku.isSolved()) {
return true; return true;
} }

View File

@@ -3,13 +3,9 @@ package sudoku.solver;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.concurrent.CancellationException; import java.util.concurrent.CancellationException;
import java.util.logging.Level;
import gui.constants.Symbols;
import sudoku.io.SudokuPrinter;
import sudoku.structure.Cell; import sudoku.structure.Cell;
import sudoku.structure.MultiDoku; import sudoku.structure.MultiDoku;
import sudoku.structure.Sudoku;
public class MixedSolver implements Solver { public class MixedSolver implements Solver {
@@ -28,14 +24,6 @@ public class MixedSolver implements Solver {
throw new CancellationException("User wants to stop the solver"); throw new CancellationException("User wants to stop the solver");
} }
Sudoku sudoku = doku.getSubGrid(0);
logger.log(Level.FINE,
'\n' + SudokuPrinter.toStringRectangleSudoku(
sudoku,
sudoku.getBlockWidth() == 0 ? sudoku.getSize() : sudoku.getBlockWidth(),
sudoku.getBlockWidth() == 0 ? sudoku.getSize() : sudoku.getSize() / sudoku.getBlockWidth(),
Symbols.Numbers));
if (doku.isSolved()) { if (doku.isSolved()) {
return true; return true;
} }

View File

@@ -3,13 +3,9 @@ package sudoku.solver;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.concurrent.CancellationException; import java.util.concurrent.CancellationException;
import java.util.logging.Level;
import gui.constants.Symbols;
import sudoku.io.SudokuPrinter;
import sudoku.structure.Cell; import sudoku.structure.Cell;
import sudoku.structure.MultiDoku; import sudoku.structure.MultiDoku;
import sudoku.structure.Sudoku;
public class RandomSolver implements Solver { public class RandomSolver implements Solver {
@@ -28,13 +24,6 @@ public class RandomSolver implements Solver {
if (Thread.interrupted()) if (Thread.interrupted())
throw new CancellationException("User wants to stop the solver"); throw new CancellationException("User wants to stop the solver");
Sudoku sudoku = doku.getSubGrid(0);
logger.log(Level.FINE,
'\n' + SudokuPrinter.toStringRectangleSudoku(sudoku,
sudoku.getBlockWidth() == 0 ? sudoku.getSize() : sudoku.getBlockWidth(),
sudoku.getBlockWidth() == 0 ? sudoku.getSize() : sudoku.getSize() / sudoku.getBlockWidth(),
Symbols.Numbers));
if (doku.isSolved()) { if (doku.isSolved()) {
return true; return true;
} }