diff --git a/Hitori/pom.xml b/Hitori/pom.xml
index e44b179..c5ac068 100644
--- a/Hitori/pom.xml
+++ b/Hitori/pom.xml
@@ -34,5 +34,17 @@
5.8.1
test
+
+ org.junit.jupiter
+ junit-jupiter
+ 5.8.2
+ test
+
+
+ org.mockito
+ mockito-core
+ 4.5.1
+ test
+
diff --git a/Hitori/src/main/java/PR2/HitoriSpiel/Domain/HitoriValidator.java b/Hitori/src/main/java/PR2/HitoriSpiel/Domain/HitoriValidator.java
index 7e39ad2..44e10aa 100644
--- a/Hitori/src/main/java/PR2/HitoriSpiel/Domain/HitoriValidator.java
+++ b/Hitori/src/main/java/PR2/HitoriSpiel/Domain/HitoriValidator.java
@@ -23,8 +23,8 @@ public class HitoriValidator {
public boolean validateBoard(List solutionCoordinates) {
for (String coordinate : solutionCoordinates) {
String[] parts = coordinate.split(",");
- int row = Integer.parseInt(parts[0]);
- int col = Integer.parseInt(parts[1]);
+ int row = Integer.parseInt(parts[0]) - 1;
+ int col = Integer.parseInt(parts[1]) - 1;
if (board.getCell(row,col).getState() != HitoriCell.CellState.BLACK){
return false;
@@ -34,7 +34,7 @@ public class HitoriValidator {
for (int i = 0; i < board.getSize(); i++) {
for (int j = 0; j < board.getSize(); j++) {
if (board.getCell(i,j).getState() == HitoriCell.CellState.BLACK &&
- !solutionCoordinates.contains(i + "," + j)) {
+ !solutionCoordinates.contains((i + 1) + "," + (j + 1))) {
return false;
}
}
diff --git a/Hitori/src/main/java/PR2/HitoriSpiel/GUI/BoardLoader.java b/Hitori/src/main/java/PR2/HitoriSpiel/GUI/BoardLoader.java
index 095f02c..980c5c2 100644
--- a/Hitori/src/main/java/PR2/HitoriSpiel/GUI/BoardLoader.java
+++ b/Hitori/src/main/java/PR2/HitoriSpiel/GUI/BoardLoader.java
@@ -6,6 +6,24 @@ import java.util.List;
public class BoardLoader {
+ public static class BoardData {
+ private final int[][] board;
+ private final List solution;
+
+ public BoardData(int[][] board, List solution) {
+ this.board = board;
+ this.solution = solution;
+ }
+
+ public int[][] getBoard() {
+ return board;
+ }
+
+ public List getSolution() {
+ return solution;
+ }
+ }
+
public static List loadBoardsAsList() {
List boardFiles = new ArrayList<>();
try {
@@ -30,7 +48,7 @@ public class BoardLoader {
- public static int[][] loadBoard(String resourcePath) throws IOException {
+ public static int[][] loadBoard(String resourcePath) throws IOException {
List rows = new ArrayList<>();
try (InputStream inputStream = BoardLoader.class.getResourceAsStream(resourcePath);
diff --git a/Hitori/src/main/java/PR2/HitoriSpiel/GUI/GameBoard.java b/Hitori/src/main/java/PR2/HitoriSpiel/GUI/GameBoard.java
index f9100ec..e45d4ea 100644
--- a/Hitori/src/main/java/PR2/HitoriSpiel/GUI/GameBoard.java
+++ b/Hitori/src/main/java/PR2/HitoriSpiel/GUI/GameBoard.java
@@ -1,5 +1,6 @@
package PR2.HitoriSpiel.GUI;
+import PR2.HitoriSpiel.Domain.HitoriValidator;
import PR2.HitoriSpiel.Domain.StateManager;
import PR2.HitoriSpiel.Domain.HitoriBoard;
import PR2.HitoriSpiel.Domain.HitoriCell;
@@ -150,9 +151,15 @@ public class GameBoard extends JPanel {
repaint();
}
- // TODO: Spiel validieren
public boolean validateCurrentBoard() {
- return true;
+ HitoriValidator validator = new HitoriValidator(board);
+ if (validator.validateBoard(board.getSolutionCoordinates())) {
+ JOptionPane.showMessageDialog(this, "Das Spielfeld ist korrekt gelöst!", "Erfolg", JOptionPane.INFORMATION_MESSAGE);
+ return true;
+ } else {
+ JOptionPane.showMessageDialog(this, "Das Spielfeld enthält Fehler!", "Fehler", JOptionPane.ERROR_MESSAGE);
+ return false;
+ }
}
private void showPauseMenu() {
diff --git a/Hitori/src/main/java/PR2/HitoriSpiel/GUI/HighscoreDialog.java b/Hitori/src/main/java/PR2/HitoriSpiel/GUI/HighscoreDialog.java
new file mode 100644
index 0000000..c4b974a
--- /dev/null
+++ b/Hitori/src/main/java/PR2/HitoriSpiel/GUI/HighscoreDialog.java
@@ -0,0 +1,43 @@
+package PR2.HitoriSpiel.GUI;
+
+import PR2.HitoriSpiel.Utils.HighscoreManager;
+import javax.swing.table.DefaultTableModel;
+import javax.swing.*;
+import java.awt.*;
+import java.util.List;
+
+public class HighscoreDialog extends JDialog {
+
+ public HighscoreDialog(JFrame parent) {
+ super(parent, "Highscoreliste", true);
+ setSize(500, 400);
+ setLocationRelativeTo(parent);
+
+ // Tabelle erstellen
+ String[] columnNames = {"Name", "Zeit (Sek.)", "Spielfeld"};
+ DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0);
+
+ // Highscores laden
+ List highscores = HighscoreManager.loadHighscores();
+ for (HighscoreManager.Highscore highscore : highscores) {
+ tableModel.addRow(new Object[]{highscore.getName(), highscore.getTime(), highscore.getBoard()});
+ }
+
+ JTable table = new JTable(tableModel);
+ table.setEnabled(false); // Tabelle nur lesbar
+ table.setFillsViewportHeight(true);
+
+ JScrollPane scrollPane = new JScrollPane(table);
+
+ // Button zum Schließen des Dialogs
+ JButton closeButton = new JButton("Schließen");
+ closeButton.addActionListener(e -> dispose());
+
+ JPanel buttonPanel = new JPanel();
+ buttonPanel.add(closeButton);
+
+ setLayout(new BorderLayout());
+ add(scrollPane, BorderLayout.CENTER);
+ add(buttonPanel, BorderLayout.SOUTH);
+ }
+}
diff --git a/Hitori/src/main/java/PR2/HitoriSpiel/Utils/HighscoreManager.java b/Hitori/src/main/java/PR2/HitoriSpiel/Utils/HighscoreManager.java
new file mode 100644
index 0000000..0fe924e
--- /dev/null
+++ b/Hitori/src/main/java/PR2/HitoriSpiel/Utils/HighscoreManager.java
@@ -0,0 +1,72 @@
+package PR2.HitoriSpiel.Utils;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+public class HighscoreManager {
+
+ private static final String HIGHSCORE_FILE = "highscores.txt";
+
+ public static class Highscore {
+ private final String name;
+ private final int time;
+ private final String board;
+
+ public Highscore(String name, int time, String board) {
+ this.name = name;
+ this.time = time;
+ this.board = board;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getTime() {
+ return time;
+ }
+
+ public String getBoard() {
+ return board;
+ }
+ }
+
+ public static List loadHighscores() {
+ List highscores = new ArrayList<>();
+ File file = new File(HIGHSCORE_FILE);
+
+ if (!file.exists()) {
+ return highscores;
+ }
+
+ try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ String[] parts = line.split(", ");
+ if (parts.length == 3) {
+ String name = parts[0];
+ int time = Integer.parseInt(parts[1]);
+ String board = parts[2];
+ highscores.add(new Highscore(name, time, board));
+ }
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ // Highscores nach Zeit sortieren (kürzeste Zeit zuerst)
+ highscores.sort(Comparator.comparingInt(Highscore::getTime));
+ return highscores;
+ }
+
+ public static void saveHighscore(String name, int time, String board) {
+ try (BufferedWriter writer = new BufferedWriter(new FileWriter(HIGHSCORE_FILE, true))) {
+ writer.write(name + ", " + time + ", " + board);
+ writer.newLine();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/Hitori/src/main/resources/Files/highscores.txt b/Hitori/src/main/resources/Files/highscores.txt
new file mode 100644
index 0000000..e55f47d
--- /dev/null
+++ b/Hitori/src/main/resources/Files/highscores.txt
@@ -0,0 +1,3 @@
+Name, Zeit (Sekunden), Spielfeld
+
+NameTest, 123 Sekunden, Hitori4x4_leicht.csv
\ No newline at end of file