From d88e35b4e22bf97ed085b1ee306a5f007a3dd044 Mon Sep 17 00:00:00 2001 From: "Ioana P." <3015825@stud.hs-mannheim.de> Date: Mon, 6 Jan 2025 19:49:08 +0100 Subject: [PATCH] Durchschnitszeit-Funktion verbessert --- .../HitoriSpiel/Fassade/HighscoreManager.java | 29 +++++++++++++++++-- .../PR2/HitoriSpiel/GUI/HighscoreDialog.java | 16 ++++++---- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/Hitori/src/main/java/PR2/HitoriSpiel/Fassade/HighscoreManager.java b/Hitori/src/main/java/PR2/HitoriSpiel/Fassade/HighscoreManager.java index 58979ef..2ab2a85 100644 --- a/Hitori/src/main/java/PR2/HitoriSpiel/Fassade/HighscoreManager.java +++ b/Hitori/src/main/java/PR2/HitoriSpiel/Fassade/HighscoreManager.java @@ -1,9 +1,7 @@ package PR2.HitoriSpiel.Fassade; import java.io.*; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; +import java.util.*; import java.util.concurrent.locks.ReentrantLock; public class HighscoreManager { @@ -96,6 +94,29 @@ public class HighscoreManager { } } + // Durchschnittszeit für jedes Spielfeld berechnen + public Map getAverageTimesByBoard() { + fileLock.lock(); + try { + Map> boardScores = new HashMap<>(); + + for (Highscore highscore : highscoreList) { + boardScores.computeIfAbsent(highscore.getBoardName(), k -> new ArrayList<>()).add(highscore.getScore()); + } + + Map averageTimes = new HashMap<>(); + for (Map.Entry> entry : boardScores.entrySet()) { + List scores = entry.getValue(); + double average = scores.stream().mapToInt(Integer::intValue).average().orElse(0.0); + averageTimes.put(entry.getKey(), average); + } + + return averageTimes; + } finally { + fileLock.unlock(); + } + } + // Highscores abrufen public List getHighscores() { return new ArrayList<>(highscoreList); // Modifizierbare Kopie zurückgeben @@ -142,6 +163,8 @@ public class HighscoreManager { return errors; } + public int getScore() {return time;} + @Override public String toString() { return playerName + "," + time + "," + boardName + "," + errors; diff --git a/Hitori/src/main/java/PR2/HitoriSpiel/GUI/HighscoreDialog.java b/Hitori/src/main/java/PR2/HitoriSpiel/GUI/HighscoreDialog.java index 41de39d..8dea59e 100644 --- a/Hitori/src/main/java/PR2/HitoriSpiel/GUI/HighscoreDialog.java +++ b/Hitori/src/main/java/PR2/HitoriSpiel/GUI/HighscoreDialog.java @@ -7,6 +7,7 @@ import javax.swing.table.DefaultTableModel; import javax.swing.*; import java.awt.*; import java.util.List; +import java.util.Map; // aktueller Stand public class HighscoreDialog extends JDialog { @@ -19,7 +20,7 @@ public class HighscoreDialog extends JDialog { super(parentFrame, "Highscoreliste", true); this.highscoreManager = new HighscoreManager(); - this.tableModel = new DefaultTableModel(new String[]{"Platz", "Name", "Zeit (Sek.)", "Fehler", "Spielfeld"}, 0); + this.tableModel = new DefaultTableModel(new String[]{"Platz", "Name", "Zeit (Sek.)", "Fehler", "Spielfeld", "Durchschnittszeit"}, 0); setLayout(new BorderLayout()); setSize(600, 400); @@ -58,6 +59,7 @@ public class HighscoreDialog extends JDialog { private void loadHighscoresForBoard(String boardName) { tableModel.setRowCount(0); // Tabelle zurücksetzen List highscores = highscoreManager.getHighscoresForBoard(boardName); + Map averageTimes = highscoreManager.getAverageTimesByBoard(); if (highscores.isEmpty()) { JOptionPane.showMessageDialog(this, @@ -69,12 +71,14 @@ public class HighscoreDialog extends JDialog { int rank = 1; for (HighscoreManager.Highscore highscore : highscores) { + double averageTime = averageTimes.getOrDefault(highscore.getBoardName(), 0.0); tableModel.addRow(new Object[]{ - rank++, // Platznummer - highscore.getPlayerName(), // Spielername - highscore.getTime(), // Zeit in Sekunden - highscore.getErrors(), // Anzahl der Fehler - highscore.getBoardName() // Spielfeldname + rank++, // Platzierung + highscore.getPlayerName(), // Name + highscore.getScore(), // Punkte + highscore.getErrors(), //Errors + highscore.getBoardName(), // Spielfeld + String.format("%.2f", averageTime) // Durchschnittszeit }); } }