diff --git a/PR2Projekt/.classpath b/PR2Projekt/.classpath index 57bca72..0f3d1c6 100644 --- a/PR2Projekt/.classpath +++ b/PR2Projekt/.classpath @@ -5,6 +5,7 @@ - + + diff --git a/PR2Projekt/.gitignore b/PR2Projekt/.gitignore new file mode 100644 index 0000000..e92dd92 --- /dev/null +++ b/PR2Projekt/.gitignore @@ -0,0 +1,4 @@ +/target/ +/.DS_Store +/.classpath +/.project \ No newline at end of file diff --git a/PR2Projekt/pom.xml b/PR2Projekt/pom.xml new file mode 100644 index 0000000..038f1b2 --- /dev/null +++ b/PR2Projekt/pom.xml @@ -0,0 +1,138 @@ + +4.0.0 +de.hs_mannheim +MvnDemo +0.0.1-SNAPSHOT + +UTF-8 +21 +21 + + + + org.junit.jupiter + junit-jupiter-api + 5.8.1 + test + + + org.junit.jupiter + junit-jupiter-engine + 5.8.1 + test + + + org.apache.logging.log4j + log4j-core + 2.24.2 + + + org.apache.logging.log4j + log4j-api + 2.24.2 + + + + + + +org.apache.maven.plugins +maven-compiler-plugin +3.13.0 + +${maven.compiler.source} +${maven.compiler.target} + + + + +org.apache.maven.plugins +maven-shade-plugin +3.6.0 + +false + + + +package + +shade + + + + + de.hs_mannheim.informatik.mvn.Main + + + + + + + + +org.jacoco +jacoco-maven-plugin +0.8.12 + + + +prepare-agent + + + +report +test + +report + + + + + + +org.apache.maven.plugins +maven-pmd-plugin +3.26.0 + +false +true + + + +verify + +check + + + + + +src/main/java + + + src/main/resources + + + src/test/java + + + + + +org.apache.maven.plugins +maven-javadoc-plugin +3.11.2 + +private +true + + + +org.apache.maven.plugins +maven-checkstyle-plugin +3.6.0 + + + + \ No newline at end of file diff --git a/PR2Projekt/Hitori_Highscores/Hitori10x10medium.txt b/PR2Projekt/resources/Hitori_Highscores/Hitori10x10medium.txt similarity index 100% rename from PR2Projekt/Hitori_Highscores/Hitori10x10medium.txt rename to PR2Projekt/resources/Hitori_Highscores/Hitori10x10medium.txt diff --git a/PR2Projekt/Hitori_Highscores/Hitori15x15_medium.txt b/PR2Projekt/resources/Hitori_Highscores/Hitori15x15_medium.txt similarity index 100% rename from PR2Projekt/Hitori_Highscores/Hitori15x15_medium.txt rename to PR2Projekt/resources/Hitori_Highscores/Hitori15x15_medium.txt diff --git a/PR2Projekt/Hitori_Highscores/Hitori4x4_leicht.txt b/PR2Projekt/resources/Hitori_Highscores/Hitori4x4_leicht.txt similarity index 100% rename from PR2Projekt/Hitori_Highscores/Hitori4x4_leicht.txt rename to PR2Projekt/resources/Hitori_Highscores/Hitori4x4_leicht.txt diff --git a/PR2Projekt/Hitori_Highscores/Hitori5x5leicht.txt b/PR2Projekt/resources/Hitori_Highscores/Hitori5x5leicht.txt similarity index 100% rename from PR2Projekt/Hitori_Highscores/Hitori5x5leicht.txt rename to PR2Projekt/resources/Hitori_Highscores/Hitori5x5leicht.txt diff --git a/PR2Projekt/Hitori_Highscores/Hitori8x8leicht.txt b/PR2Projekt/resources/Hitori_Highscores/Hitori8x8leicht.txt similarity index 100% rename from PR2Projekt/Hitori_Highscores/Hitori8x8leicht.txt rename to PR2Projekt/resources/Hitori_Highscores/Hitori8x8leicht.txt diff --git a/PR2Projekt/Hitori_Highscores/Hitori8x8medium.txt b/PR2Projekt/resources/Hitori_Highscores/Hitori8x8medium.txt similarity index 100% rename from PR2Projekt/Hitori_Highscores/Hitori8x8medium.txt rename to PR2Projekt/resources/Hitori_Highscores/Hitori8x8medium.txt diff --git a/PR2Projekt/Hitori_Spielfelder/Hitori10x10medium.csv b/PR2Projekt/resources/Hitori_Spielfelder/Hitori10x10medium.csv similarity index 100% rename from PR2Projekt/Hitori_Spielfelder/Hitori10x10medium.csv rename to PR2Projekt/resources/Hitori_Spielfelder/Hitori10x10medium.csv diff --git a/PR2Projekt/Hitori_Spielfelder/Hitori15x15_medium.csv b/PR2Projekt/resources/Hitori_Spielfelder/Hitori15x15_medium.csv similarity index 100% rename from PR2Projekt/Hitori_Spielfelder/Hitori15x15_medium.csv rename to PR2Projekt/resources/Hitori_Spielfelder/Hitori15x15_medium.csv diff --git a/PR2Projekt/Hitori_Spielfelder/Hitori4x4_leicht.csv b/PR2Projekt/resources/Hitori_Spielfelder/Hitori4x4_leicht.csv similarity index 100% rename from PR2Projekt/Hitori_Spielfelder/Hitori4x4_leicht.csv rename to PR2Projekt/resources/Hitori_Spielfelder/Hitori4x4_leicht.csv diff --git a/PR2Projekt/Hitori_Spielfelder/Hitori5x5leicht.csv b/PR2Projekt/resources/Hitori_Spielfelder/Hitori5x5leicht.csv similarity index 100% rename from PR2Projekt/Hitori_Spielfelder/Hitori5x5leicht.csv rename to PR2Projekt/resources/Hitori_Spielfelder/Hitori5x5leicht.csv diff --git a/PR2Projekt/Hitori_Spielfelder/Hitori8x8leicht.csv b/PR2Projekt/resources/Hitori_Spielfelder/Hitori8x8leicht.csv similarity index 100% rename from PR2Projekt/Hitori_Spielfelder/Hitori8x8leicht.csv rename to PR2Projekt/resources/Hitori_Spielfelder/Hitori8x8leicht.csv diff --git a/PR2Projekt/Hitori_Spielfelder/Hitori8x8medium.csv b/PR2Projekt/resources/Hitori_Spielfelder/Hitori8x8medium.csv similarity index 100% rename from PR2Projekt/Hitori_Spielfelder/Hitori8x8medium.csv rename to PR2Projekt/resources/Hitori_Spielfelder/Hitori8x8medium.csv diff --git a/PR2Projekt/src/de/hs_mannheim/informatik/pr2projekt/gui/GameGUI.java b/PR2Projekt/src/de/hs_mannheim/informatik/pr2projekt/gui/GameGUI.java deleted file mode 100644 index 8a204d6..0000000 --- a/PR2Projekt/src/de/hs_mannheim/informatik/pr2projekt/gui/GameGUI.java +++ /dev/null @@ -1,217 +0,0 @@ -package de.hs_mannheim.informatik.pr2projekt.gui; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.GridLayout; -import java.io.FileNotFoundException; -import java.util.EmptyStackException; -import java.util.Stack; - -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; - -import de.hs_mannheim.informatik.pr2projekt.domain.HitoriMain; - -public class GameGUI { - - public static void paintGame(String[] filepath, JButton[][] buttons, String[][] colors, Stack madeMoves, String[][] data) throws FileNotFoundException{ - JFrame frame = new JFrame(); - int num = buttons.length; - JPanel gameGrid = new JPanel(new GridLayout(num,num,0,0)); - for(int i=0;i {paintButton(b, pos, colors , madeMoves);}); - } - } - JPanel mainPanel = new JPanel(new BorderLayout()); - mainPanel.add(gameGrid, BorderLayout.CENTER); - JPanel buttonGrid = new JPanel(new GridLayout(1,4,10,10)); - JButton b0 = new JButton("Aufgeben"); - b0.addActionListener(e -> { - frame.dispose(); - try { - MenuGUI.getPath(filepath); - } catch (FileNotFoundException i) { - System.out.println("File not found: " + i.getMessage()); - } - }); - JButton b1 = new JButton("Zurück"); - b1.addActionListener(e -> {GameGUI.backOneStep(madeMoves, buttons, colors, gameGrid);}); - JButton b2 = new JButton("Zurücksetzen"); - b2.addActionListener(e -> {HitoriMain.totalResetButton(buttons, colors, madeMoves, data);}); - JButton b3 = new JButton("Abgeben"); - String path = filepath[0]; - b3.addActionListener(e -> { - try{ - boolean levelFinished = HitoriMain.abgabeMöglich(path, data, colors); - if(levelFinished == true){ - GameGUI.finish(filepath, path, data, colors); - frame.dispose(); - } else { - JLabel text1 = new JLabel("Abgabe nicht richtig!"); - mainPanel.add(text1, BorderLayout.NORTH); - mainPanel.revalidate(); - mainPanel.repaint(); - } - } catch (FileNotFoundException i) { - System.out.println("File not found: " + i.getMessage()); - } - }); - buttonGrid.add(b0);buttonGrid.add(b1);buttonGrid.add(b2);buttonGrid.add(b3); - mainPanel.add(buttonGrid, BorderLayout.SOUTH); - mainPanel.setVisible(true); - frame.add(mainPanel); - frame.setVisible(true); - frame.setSize(600,600); - } - - public static void paintButton(JButton b, String[] pos, String[][] colors, Stack madeMoves){ - int i = Integer.parseInt(pos[0]); - int j = Integer.parseInt(pos[1]); - String col = colors[Integer.parseInt(pos[0])][Integer.parseInt(pos[1])]; - if(col.endsWith("W")){ - b.setOpaque(true); - b.setForeground(Color.BLACK); - b.setContentAreaFilled(true); - b.setBorderPainted(false); - b.setFocusPainted(false); - b.setBackground(Color.lightGray); - colors[i][j] += "G"; - String logEntrance = i+"."+j+"."+"G"; - madeMoves.push(logEntrance); - } - if(col.endsWith("G")){ - b.setOpaque(true); - b.setForeground(Color.WHITE); - b.setContentAreaFilled(true); - b.setBorderPainted(false); - b.setFocusPainted(false); - b.setBackground(Color.BLACK); - colors[i][j] += "B"; - String logEntrance = i+"."+j+"."+"B"; - madeMoves.push(logEntrance); - } - if(col.endsWith("B")){ - b.setOpaque(true); - b.setForeground(Color.BLACK); - b.setContentAreaFilled(true); - b.setBorderPainted(false); - b.setFocusPainted(false); - b.setBackground(Color.WHITE); - colors[i][j] += "W"; - String logEntrance = i+"."+j+"."+"W"; - madeMoves.push(logEntrance); - } - } - - public static void backOneStep(Stack movesMade, JButton[][] buttons, String[][] colors, JPanel grid){ - try { - String move = movesMade.pop(); - String[] line = move.split("\\."); - String y = line[0]; - String x = line[1]; - String color = line[2]; - if(color.equals("W")){ - int i = Integer.parseInt(y); - int j = Integer.parseInt(x); - JButton b0 = buttons[i][j]; - b0.setOpaque(true); - b0.setForeground(Color.WHITE); - b0.setContentAreaFilled(true); - b0.setBorderPainted(false); - b0.setFocusPainted(false); - b0.setBackground(Color.BLACK); - buttons[i][j] = b0; - String str = colors[i][j]; - String str0 = str.substring(0, str.length() - 1); - colors[i][j] = str0; - grid.repaint(); - gridUpdate(grid, buttons); - }else if(color.equals("G")){ - int i = Integer.parseInt(y); - int j = Integer.parseInt(x); - JButton b0 = buttons[i][j]; - b0.setOpaque(true); - b0.setForeground(Color.BLACK); - b0.setContentAreaFilled(true); - b0.setBorderPainted(false); - b0.setFocusPainted(false); - b0.setBackground(Color.WHITE); - buttons[i][j] = b0; - String str = colors[i][j]; - String str0 = str.substring(0, str.length() - 1); - colors[i][j] = str0; - gridUpdate(grid, buttons); - } else if(color.equals("B")){ - int i = Integer.parseInt(y); - int j = Integer.parseInt(x); - JButton b0 = buttons[i][j]; - b0.setOpaque(true); - b0.setForeground(Color.BLACK); - b0.setContentAreaFilled(true); - b0.setBorderPainted(false); - b0.setFocusPainted(false); - b0.setBackground(Color.lightGray); - buttons[i][j] = b0; - String str = colors[i][j]; - String str0 = str.substring(0, str.length() - 1); - colors[i][j] = str0; - gridUpdate(grid, buttons); - } - } catch(EmptyStackException e) {} - } - - public static void gridUpdate(JPanel grid, JButton[][] buttons){ - grid.removeAll(); - grid.repaint(); - for(int i = 0; i { - String username = field.getText(); - try { - HighscoreGUI.newRecord(path, username); - frame.dispose(); - } catch (FileNotFoundException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } - try { - MenuGUI.getPath(filepath); - } catch (FileNotFoundException i) { - System.out.println("File not found: " + i.getMessage()); - } - }); - filepath[0] = ""; - filepath[1] = ""; - } -} diff --git a/PR2Projekt/src/de/hs_mannheim/informatik/pr2projekt/gui/HighscoreGUI.java b/PR2Projekt/src/de/hs_mannheim/informatik/pr2projekt/gui/HighscoreGUI.java deleted file mode 100644 index 1fec047..0000000 --- a/PR2Projekt/src/de/hs_mannheim/informatik/pr2projekt/gui/HighscoreGUI.java +++ /dev/null @@ -1,149 +0,0 @@ -package de.hs_mannheim.informatik.pr2projekt.gui; - -import java.awt.BorderLayout; -import java.awt.GridLayout; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Scanner; - -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; - -import de.hs_mannheim.informatik.pr2projekt.domain.HitoriMain; - -public class HighscoreGUI { - - public static void highscoreScreen(String[] filepath){ - String currentWorkingDir = System.getProperty("user.dir"); - System.out.println("Current working directory: " + currentWorkingDir); - JFrame frame = new JFrame("Highscores"); - JPanel highscorePanel = new JPanel(new BorderLayout()); - JPanel buttonPanel = new JPanel(new GridLayout(7,1,10,10)); - String[] buttons = { - "Highscore 4x4 - leicht", - "Highscore 5x5 - leicht", - "Highscore 8x8 - leicht", - "Highscore 8x8 - medium", - "Highscore 10x10 - medium", - "Highscore 15x15 - medium" - }; - for(int i=0;i { - int j = count[0]; - String[] paths = { - "Hitori_Highscores/Hitori4x4_leicht.txt", - "Hitori_Highscores/Hitori5x5leicht.txt", - "Hitori_Highscores/Hitori8x8leicht.txt", - "Hitori_Highscores/Hitori8x8medium.txt", - "Hitori_Highscores/Hitori10x10medium.txt", - "Hitori_Highscores/Hitori15x15_medium.txt" - }; - HighscoreGUI.showHighscores(filepath, paths[j]); - frame.dispose(); - }); - } - JButton b = new JButton("Zurück"); - b.addActionListener(e -> { - frame.dispose(); - try { - MenuGUI.getPath(filepath); - } catch (FileNotFoundException i) { - System.out.println("File not found: " + i.getMessage()); - } - }); - buttonPanel.add(b); - frame.setVisible(true); - frame.setSize(600,600); - highscorePanel.add(buttonPanel, BorderLayout.CENTER); - JLabel text0 = new JLabel("Level für Highscore Liste auswählen!"); - highscorePanel.add(text0, BorderLayout.NORTH); - frame.setDefaultCloseOperation(0); - frame.add(highscorePanel); - } - - public static void newRecord(String path, String username) throws FileNotFoundException{ - String[] parts = path.split("/"); - String filename = parts[parts.length - 1]; - int dotIndex = filename.lastIndexOf("."); - String result = filename.substring(0, dotIndex); - String ordner = "Hitori_Highscores/"; - String filetype = ".txt"; - String filepath = ordner+result+filetype; - Scanner sc = new Scanner(filepath); - while (sc.hasNextLine()) { - sc.nextLine(); - } - sc.close(); - try (BufferedWriter writer = new BufferedWriter(new FileWriter(filepath, true))) { - writer.write(username); - writer.newLine(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public static void showHighscores(String[] filepath, String path){ - String currentWorkingDir = System.getProperty("user.dir"); - System.out.println("Current working directory: " + currentWorkingDir); - JFrame frame = new JFrame("Highscore"); - JPanel mainPanel = new JPanel(new BorderLayout()); - File file = new File(path); - int i = 0; - try (Scanner scanner = new Scanner(file)) { - while (scanner.hasNextLine()) { - scanner.nextLine(); - i++; - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - JPanel highscorePanel = new JPanel(new GridLayout(i,1,10,10)); - if(i>0){ - ArrayList lines = HitoriMain.readFromFile(path); - for(String s: lines){ - JLabel text = new JLabel(s); - highscorePanel.add(text); - } - JButton b = new JButton("Zurück"); - b.addActionListener(e -> { - frame.dispose(); - highscoreScreen(filepath); - }); - mainPanel.add(b, BorderLayout.SOUTH); - } else { - JLabel text = new JLabel("Noch kein Highscore eingetragen."); - highscorePanel.add(text); - JButton b = new JButton("Zurück"); - b.addActionListener(e -> { - frame.dispose(); - highscoreScreen(filepath); - }); - mainPanel.add(b, BorderLayout.SOUTH); - } - JButton b = new JButton("Zurück"); - b.addActionListener(e ->{ - frame.dispose(); - try { - MenuGUI.getPath(filepath); - } catch (FileNotFoundException s) { - System.out.println("File not found: " + s.getMessage()); - } - }); - mainPanel.add(highscorePanel, BorderLayout.CENTER); - frame.add(mainPanel); - frame.setVisible(true); - frame.setSize(600,600); - } - -} diff --git a/PR2Projekt/src/de/hs_mannheim/informatik/pr2projekt/gui/MenuGUI.java b/PR2Projekt/src/de/hs_mannheim/informatik/pr2projekt/gui/MenuGUI.java deleted file mode 100644 index 90e84ee..0000000 --- a/PR2Projekt/src/de/hs_mannheim/informatik/pr2projekt/gui/MenuGUI.java +++ /dev/null @@ -1,66 +0,0 @@ -package de.hs_mannheim.informatik.pr2projekt.gui; - -import java.awt.BorderLayout; -import java.awt.GridLayout; -import java.io.FileNotFoundException; -import java.util.Stack; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; - - -public class MenuGUI { - - public static void getPath(String[] filepath) throws FileNotFoundException{ - - String[] filepath0 = new String[2]; - JFrame frame = new JFrame("Hitori"); - JPanel menuPanel = new JPanel(new BorderLayout()); - JPanel buttonPanel = new JPanel(new GridLayout(7,1,10,10)); - String[] buttons = { - "4x4 - leicht", - "5x5 - leicht", - "8x8 - leicht", - "8x8 - medium", - "10x10 - medium", - "15x15 - medium" - }; - for(int i=0;i { - int j = count[0]; - String[] paths = { - "Hitori_Spielfelder/Hitori4x4_leicht.csv", - "Hitori_Spielfelder/Hitori5x5leicht.csv", - "Hitori_Spielfelder/Hitori8x8leicht.csv", - "Hitori_Spielfelder/Hitori8x8medium.csv", - "Hitori_Spielfelder/Hitori10x10medium.csv", - "Hitori_Spielfelder/Hitori15x15_medium.csv" - }; - filepath0[0] = paths[j]; - filepath0[1] = row[0]; - filepath[0] = filepath0[0]; - filepath[1] = filepath0[1]; - frame.dispose(); - }); - } - JButton b = new JButton("Highscores"); - b.addActionListener(e -> { - HighscoreGUI.highscoreScreen(filepath); - frame.dispose(); - }); - buttonPanel.add(b); - frame.setVisible(true); - frame.setSize(600,600); - menuPanel.add(buttonPanel, BorderLayout.CENTER); - JLabel text0 = new JLabel("Wählen Sie ein Level aus!"); - menuPanel.add(text0, BorderLayout.NORTH); - frame.setDefaultCloseOperation(0); - frame.add(menuPanel); - } -} diff --git a/PR2Projekt/src/de/hs_mannheim/informatik/pr2projekt/domain/HitoriMain.java b/PR2Projekt/src/main/java/de/hs_mannheim/informatik/mvn/domain/HitoriMain.java similarity index 72% rename from PR2Projekt/src/de/hs_mannheim/informatik/pr2projekt/domain/HitoriMain.java rename to PR2Projekt/src/main/java/de/hs_mannheim/informatik/mvn/domain/HitoriMain.java index 23e1064..025e115 100644 --- a/PR2Projekt/src/de/hs_mannheim/informatik/pr2projekt/domain/HitoriMain.java +++ b/PR2Projekt/src/main/java/de/hs_mannheim/informatik/mvn/domain/HitoriMain.java @@ -1,43 +1,42 @@ package de.hs_mannheim.informatik.pr2projekt.domain; +import java.awt.CardLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; +import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; +import java.io.FileWriter; import java.io.IOException; +import java.time.LocalTime; import java.util.ArrayList; +import java.util.Comparator; import java.util.Scanner; import java.util.Stack; import java.io.File; import javax.swing.JButton; import javax.swing.JFrame; +import javax.swing.JPanel; import de.hs_mannheim.informatik.pr2projekt.gui.GameGUI; import de.hs_mannheim.informatik.pr2projekt.gui.MenuGUI; public class HitoriMain extends JFrame implements ActionListener{ - private static String[] filepath = new String[2]; + private static String[] filepath = {"", ""}; public static void main(String[] args) throws FileNotFoundException{ - filepath[0] = ""; - filepath[1] = ""; - new HitoriMain(); + new MenuGUI(); } - public HitoriMain() throws FileNotFoundException { + public static void ablauf(CardLayout cl, JPanel main, String[] filepath) throws FileNotFoundException { Stack madeMoves = new Stack<>(); - MenuGUI.getPath(filepath); - int i = 0; - while(filepath[0].equals("")){ - System.out.println(); - } String[][] data = getData(filepath[0], Integer.parseInt(filepath[1])); String[][] colors = makeColorArray(data.length); JButton[][] buttons = makeButtonArray(data); - GameGUI.paintGame(filepath, buttons, colors, madeMoves, data); + GameGUI.paintGame(cl, main, filepath, buttons, colors, madeMoves, data); } public static ArrayList readFromFile(String path){ @@ -54,8 +53,7 @@ public class HitoriMain extends JFrame implements ActionListener{ } public static String[][] getData(String filepath, int rows) throws FileNotFoundException{ - String filepath0 = filepath; - Scanner sc = new Scanner(new File(filepath0)); + Scanner sc = new Scanner(new File(filepath)); String[][] data = new String[rows][rows]; int rowInt = 0; while (sc.hasNextLine() && rowInt < rows) { @@ -83,8 +81,8 @@ public class HitoriMain extends JFrame implements ActionListener{ for(int i=0;i filteredData = getSolution(path, result); String[][] ergebnis1 = getErgebnisArray(result, filteredData); - int count = 0; for(int i=0;i madeMoves,String[][] data){ + public static void totalResetButton(CardLayout cl, JPanel main, JButton[][] buttons, String[][] colors,Stack madeMoves,String[][] data) throws FileNotFoundException{ madeMoves.clear(); for(int i = 0; i entries = new ArrayList<>(); + + try (BufferedReader br = new BufferedReader(new FileReader(file))) { + String line; + while ((line = br.readLine()) != null) { + String[] parts = line.split(" ", 2); + String timeStr = parts[0]; + String name = parts.length > 1 ? parts[1] : ""; + + String[] timeParts = timeStr.split(":"); + int hour = Integer.parseInt(timeParts[0]); + int minute = Integer.parseInt(timeParts[1]); + LocalTime time = LocalTime.of(hour, minute); + + entries.add(new Entry(time, name)); + } + } + + entries.sort(Comparator.comparing(e -> e.time)); + + try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) { + for (Entry e : entries) { + String formattedTime = String.format("%02d:%02d", e.time.getHour(), e.time.getMinute()); + bw.write(formattedTime + " " + e.name); + bw.newLine(); + } + } + } @Override public void actionPerformed(ActionEvent e) { @@ -199,3 +223,13 @@ public class HitoriMain extends JFrame implements ActionListener{ } } + +class Entry { + LocalTime time; + String name; + + Entry(LocalTime time, String name) { + this.time = time; + this.name = name; + } +} diff --git a/PR2Projekt/src/main/java/de/hs_mannheim/informatik/mvn/domain/LogHighscores.java b/PR2Projekt/src/main/java/de/hs_mannheim/informatik/mvn/domain/LogHighscores.java new file mode 100644 index 0000000..0d1fc7d --- /dev/null +++ b/PR2Projekt/src/main/java/de/hs_mannheim/informatik/mvn/domain/LogHighscores.java @@ -0,0 +1,40 @@ +package de.hs_mannheim.informatik.pr2projekt.domain; + +import java.io.BufferedWriter; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Scanner; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class LogHighscores { + private static final Logger logger = LogManager.getLogger(LogHighscore.class); + + public static void newRecord(String path, String username, String time) throws FileNotFoundException { + String timePart = time.substring("Zeit: ".length()).trim(); + String[] parts = path.split("/"); + String filename = parts[parts.length - 1]; + int dotIndex = filename.lastIndexOf("."); + String result = filename.substring(0, dotIndex); + String ordner = "Hitori_Highscores/"; + String filetype = ".txt"; + String filepath = ordner + result + filetype; + System.out.println("A: " + filepath); + Scanner sc = new Scanner(filepath); + while (sc.hasNextLine()) { + sc.nextLine(); + } + sc.close(); + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(filepath, true))) { + String eintrag = timePart + " " + username; + logger.info("Neuer Eintrag: {}", eintrag); + + writer.write(eintrag); + writer.newLine(); + } catch (IOException e) { + logger.error("Fehler beim Schreiben in die Datei: " + filepath, e); + } + } +} diff --git a/PR2Projekt/src/main/java/de/hs_mannheim/informatik/mvn/gui/GameGUI.java b/PR2Projekt/src/main/java/de/hs_mannheim/informatik/mvn/gui/GameGUI.java new file mode 100644 index 0000000..94999ac --- /dev/null +++ b/PR2Projekt/src/main/java/de/hs_mannheim/informatik/mvn/gui/GameGUI.java @@ -0,0 +1,281 @@ +package de.hs_mannheim.informatik.pr2projekt.gui; + +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Color; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.FileNotFoundException; +import java.util.EmptyStackException; +import java.util.Stack; +import java.util.Timer; +import java.util.TimerTask; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.SwingUtilities; + +import de.hs_mannheim.informatik.pr2projekt.domain.HitoriMain; +import de.hs_mannheim.informatik.pr2projekt.domain.LogHighscores; + +public class GameGUI extends JFrame implements ActionListener { + + private static Timer timer = new Timer(); + private static long startTime; + private static long elapsedSeconds; + + public static void paintGame(CardLayout cl, JPanel main, String[] filepath, JButton[][] buttons, String[][] colors, Stack madeMoves, String[][] data) throws FileNotFoundException{ + elapsedSeconds = 0; + int num = buttons.length; + JPanel gameGrid = new JPanel(new GridLayout(num,num,0,0)); + for(int i=0;i {paintButton(cl, main, b, pos, colors , madeMoves);}); + } + } + JPanel mainPanel = new JPanel(new BorderLayout()); + mainPanel.add(gameGrid, BorderLayout.CENTER); + JPanel buttonGrid = new JPanel(new GridLayout(1,4,10,10)); + JButton b0 = new JButton("Aufgeben"); + b0.addActionListener(e -> { + filepath[0] = ""; + filepath[1] = ""; + cl.show(main, "HAUPT"); + }); + JButton b1 = new JButton("Zurück"); + b1.addActionListener(e -> {backOneStep(cl, main, madeMoves, buttons, colors, gameGrid);}); + JButton b2 = new JButton("Zurücksetzen"); + b2.addActionListener(e -> {try { + HitoriMain.totalResetButton(cl, main, buttons, colors, madeMoves, data); + } catch (FileNotFoundException e1) { + e1.printStackTrace(); + }}); + JButton b3 = new JButton("Abgeben"); + String path = filepath[0]; + boolean[] levelFinished = {false}; + JPanel topGrid = new JPanel(new GridLayout(1,2,10,10)); + mainPanel.add(topGrid, BorderLayout.NORTH); + JLabel timeLabel = new JLabel("Zeit: 00:00"); + topGrid.add(timeLabel); + topGrid.revalidate(); + topGrid.repaint(); + boolean isOkay = HitoriMain.abgabeMöglich(path, data, colors); + levelFinished[0] = isOkay; + Timer timer = new Timer(); + startTimer(); + timer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + elapsedSeconds = (System.currentTimeMillis() - startTime) / 1000; + long minutes = (elapsedSeconds % 3600) / 60; + long seconds = elapsedSeconds % 60; + String newTime = String.format("Zeit: %02d:%02d", minutes, seconds); + + SwingUtilities.invokeLater(() -> { + timeLabel.setText(newTime); + timeLabel.revalidate(); + timeLabel.repaint(); + }); + } + }, 0, 1000); + + JLabel luecke = new JLabel(""); + topGrid.add(luecke); + + b3.addActionListener(e -> { + try { + levelFinished[0] = HitoriMain.abgabeMöglich(path, data, colors); + System.out.println("0000: " + levelFinished[0]); + } catch (FileNotFoundException e1) { + e1.printStackTrace(); + } + if (levelFinished[0] == true) { + System.out.println("1111: " + levelFinished[0]); + String endtime = stopTimer(); + timer.cancel(); + try { + finish(cl, main, endtime, filepath, path, data, colors); + } catch (FileNotFoundException e1) { + e1.printStackTrace(); + } + } else { + System.out.println("2222: " + levelFinished[0]); + luecke.setText("Abgabe nicht richtig!"); + mainPanel.revalidate(); + mainPanel.repaint(); + } + }); + + buttonGrid.add(b0);buttonGrid.add(b1);buttonGrid.add(b2);buttonGrid.add(b3); + mainPanel.add(buttonGrid, BorderLayout.SOUTH); + mainPanel.setVisible(true); + main.add(mainPanel, "GAME"); + cl.show(main, "GAME"); + } + + public static void paintButton(CardLayout cl, JPanel main, JButton b, String[] pos, String[][] colors, Stack madeMoves){ + int i = Integer.parseInt(pos[0]); + int j = Integer.parseInt(pos[1]); + String col = colors[Integer.parseInt(pos[0])][Integer.parseInt(pos[1])]; + if(col.endsWith("W")){ + b.setOpaque(true); + b.setForeground(Color.BLACK); + b.setContentAreaFilled(true); + b.setBorderPainted(false); + b.setFocusPainted(false); + b.setBackground(Color.lightGray); + colors[i][j] += "G"; + String logEntrance = i+"."+j+"."+"G"; + madeMoves.push(logEntrance); + } + if(col.endsWith("G")){ + b.setOpaque(true); + b.setForeground(Color.WHITE); + b.setContentAreaFilled(true); + b.setBorderPainted(false); + b.setFocusPainted(false); + b.setBackground(Color.BLACK); + colors[i][j] += "B"; + String logEntrance = i+"."+j+"."+"B"; + madeMoves.push(logEntrance); + } + if(col.endsWith("B")){ + b.setOpaque(true); + b.setForeground(Color.BLACK); + b.setContentAreaFilled(true); + b.setBorderPainted(false); + b.setFocusPainted(false); + b.setBackground(Color.WHITE); + colors[i][j] += "W"; + String logEntrance = i+"."+j+"."+"W"; + madeMoves.push(logEntrance); + } + } + + public static void backOneStep(CardLayout cl, JPanel main, Stack movesMade, JButton[][] buttons, String[][] colors, JPanel grid){ + try { + String move = movesMade.pop(); + String[] line = move.split("\\."); + String y = line[0]; + String x = line[1]; + String color = line[2]; + if(color.equals("W")){ + int i = Integer.parseInt(y); + int j = Integer.parseInt(x); + JButton b0 = buttons[i][j]; + b0.setOpaque(true); + b0.setForeground(Color.WHITE); + b0.setContentAreaFilled(true); + b0.setBorderPainted(false); + b0.setFocusPainted(false); + b0.setBackground(Color.BLACK); + buttons[i][j] = b0; + String str = colors[i][j]; + String str0 = str.substring(0, str.length() - 1); + colors[i][j] = str0; + grid.repaint(); + gridUpdate(grid, buttons); + }else if(color.equals("G")){ + int i = Integer.parseInt(y); + int j = Integer.parseInt(x); + JButton b0 = buttons[i][j]; + b0.setOpaque(true); + b0.setForeground(Color.BLACK); + b0.setContentAreaFilled(true); + b0.setBorderPainted(false); + b0.setFocusPainted(false); + b0.setBackground(Color.WHITE); + buttons[i][j] = b0; + String str = colors[i][j]; + String str0 = str.substring(0, str.length() - 1); + colors[i][j] = str0; + gridUpdate(grid, buttons); + } else if(color.equals("B")){ + int i = Integer.parseInt(y); + int j = Integer.parseInt(x); + JButton b0 = buttons[i][j]; + b0.setOpaque(true); + b0.setForeground(Color.BLACK); + b0.setContentAreaFilled(true); + b0.setBorderPainted(false); + b0.setFocusPainted(false); + b0.setBackground(Color.lightGray); + buttons[i][j] = b0; + String str = colors[i][j]; + String str0 = str.substring(0, str.length() - 1); + colors[i][j] = str0; + gridUpdate(grid, buttons); + } + } catch(EmptyStackException e) {} + } + + public static void gridUpdate(JPanel grid, JButton[][] buttons){ + grid.removeAll(); + grid.repaint(); + for(int i = 0; i { + String username = field.getText(); + try { + LogHighscores.newRecord(path, username, endtime); + filepath[0] = ""; + filepath[1] = ""; + cl.show(main, "HAUPT"); + } catch (FileNotFoundException e1) { + e1.printStackTrace(); + } + }); + main.add(mainPanel, "HIGHSCORENEU"); + cl.show(main, "HIGHSCORENEU"); + } + + @Override + public void actionPerformed(ActionEvent e) { + // TODO Auto-generated method stub + + } +} diff --git a/PR2Projekt/src/main/java/de/hs_mannheim/informatik/mvn/gui/HighscoreGUI.java b/PR2Projekt/src/main/java/de/hs_mannheim/informatik/mvn/gui/HighscoreGUI.java new file mode 100644 index 0000000..b908737 --- /dev/null +++ b/PR2Projekt/src/main/java/de/hs_mannheim/informatik/mvn/gui/HighscoreGUI.java @@ -0,0 +1,122 @@ +package de.hs_mannheim.informatik.pr2projekt.gui; + +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Scanner; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import de.hs_mannheim.informatik.pr2projekt.domain.HitoriMain; + +public class HighscoreGUI extends JFrame implements ActionListener { + + public static void highscoreScreen(CardLayout cl, JPanel main){ + JPanel highscorePanel = new JPanel(new BorderLayout()); + JPanel buttonPanel = new JPanel(new GridLayout(7,1,10,10)); + String[] buttons = { + "Highscore 4x4 - leicht", + "Highscore 5x5 - leicht", + "Highscore 8x8 - leicht", + "Highscore 8x8 - medium", + "Highscore 10x10 - medium", + "Highscore 15x15 - medium" + }; + for(int i=0;i { + int j = count[0]; + String[] paths = { + "resources/Hitori_Highscores/Hitori4x4_leicht.txt", + "resources/Hitori_Highscores/Hitori5x5leicht.txt", + "resources/Hitori_Highscores/Hitori8x8leicht.txt", + "resources/Hitori_Highscores/Hitori8x8medium.txt", + "resources/Hitori_Highscores/Hitori10x10medium.txt", + "resources/Hitori_Highscores/Hitori15x15_medium.txt" + }; + try { + showHighscores(cl, main, paths[j]); + } catch (FileNotFoundException e0) { + e0.printStackTrace(); + } catch (IOException e1) { + e1.printStackTrace(); + } + }); + } + JButton b = new JButton("Zurück"); + b.addActionListener(e -> { + cl.show(main, "HAUPT"); + }); + buttonPanel.add(b); + highscorePanel.setVisible(true); + highscorePanel.setSize(600,600); + highscorePanel.add(buttonPanel, BorderLayout.CENTER); + JLabel text0 = new JLabel("Level für Highscore Liste auswählen!"); + highscorePanel.add(text0, BorderLayout.NORTH); + main.add(highscorePanel, "HIGHSCORES"); + cl.show(main, "HIGHSCORES"); + } + + public static void showHighscores(CardLayout cl, JPanel main, String path) throws FileNotFoundException, IOException{ + HitoriMain.sortByTime(path); + JPanel mainPanel = new JPanel(new BorderLayout()); + File file = new File(path); + int i = 0; + try (Scanner scanner = new Scanner(file)) { + while (scanner.hasNextLine()) { + scanner.nextLine(); + i++; + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + JPanel highscorePanel = new JPanel(new GridLayout(i,1,10,10)); + if(i>0){ + ArrayList lines = HitoriMain.readFromFile(path); + for(String s: lines){ + JLabel text = new JLabel(s); + highscorePanel.add(text); + } + JButton b = new JButton("Zurück"); + b.addActionListener(e -> { + cl.show(main, "HIGHSCORES"); + highscoreScreen(cl, main); + }); + mainPanel.add(b, BorderLayout.SOUTH); + } else { + JLabel text = new JLabel("Noch kein Highscore eingetragen."); + highscorePanel.add(text); + JButton b = new JButton("Zurück"); + b.addActionListener(e -> { + cl.show(main, "HIGHSCORES"); + highscoreScreen(cl, main); + }); + mainPanel.add(b, BorderLayout.SOUTH); + } + mainPanel.add(highscorePanel, BorderLayout.CENTER); + mainPanel.setVisible(true); + mainPanel.setSize(600,600); + main.add(mainPanel, "HIGHSCORES"); + cl.show(main, "HIGHSCORES"); + } + + @Override + public void actionPerformed(ActionEvent e) { + // TODO Auto-generated method stub + + } + +} diff --git a/PR2Projekt/src/main/java/de/hs_mannheim/informatik/mvn/gui/MenuGUI.java b/PR2Projekt/src/main/java/de/hs_mannheim/informatik/mvn/gui/MenuGUI.java new file mode 100644 index 0000000..755a26d --- /dev/null +++ b/PR2Projekt/src/main/java/de/hs_mannheim/informatik/mvn/gui/MenuGUI.java @@ -0,0 +1,94 @@ +package de.hs_mannheim.informatik.pr2projekt.gui; + +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.FileNotFoundException; +import java.nio.file.Paths; +import java.util.Stack; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import de.hs_mannheim.informatik.pr2projekt.domain.HitoriMain; + + +public class MenuGUI extends JFrame implements ActionListener { + + private static CardLayout cl = new CardLayout(); + private static JPanel main = new JPanel(cl); + private static String[] filepath = {"", ""}; + + public MenuGUI(){ + JPanel menuPanel = new JPanel(new BorderLayout()); + JPanel buttonPanel = new JPanel(new GridLayout(7,1,10,10)); + String[] buttons = { + "4x4 - leicht", + "5x5 - leicht", + "8x8 - leicht", + "8x8 - medium", + "10x10 - medium", + "15x15 - medium" + }; + for(int i=0;i { + int j = count[0]; + String currentDirectory = Paths.get("").toAbsolutePath().toString(); + System.out.println("Current Working Directory: " + currentDirectory); + String[] paths = { + "resources/Hitori_Spielfelder/Hitori4x4_leicht.csv", + "resources/Hitori_Spielfelder/Hitori5x5leicht.csv", + "resources/Hitori_Spielfelder/Hitori8x8leicht.csv", + "resources/Hitori_Spielfelder/Hitori8x8medium.csv", + "resources/Hitori_Spielfelder/Hitori10x10medium.csv", + "resources/Hitori_Spielfelder/Hitori15x15_medium.csv" + }; + for (String path : paths) { + File file = new File(path); + if (file.exists()) { + System.out.println("File found: " + file.getAbsolutePath()); + } else { + System.out.println("File not found: " + file.getAbsolutePath()); + } + } + + + filepath[0] = paths[j]; + filepath[1] = num[0]; + try{ + HitoriMain.ablauf(cl, main, filepath); + } catch (FileNotFoundException s){ + System.out.println("Fehler: " + s.getMessage()); + } + }); + } + JButton b = new JButton("Highscores"); + b.addActionListener(e -> { + HighscoreGUI.highscoreScreen(cl, main); + }); + buttonPanel.add(b); + menuPanel.add(buttonPanel, BorderLayout.CENTER); + JLabel text0 = new JLabel("Wählen Sie ein Level aus!"); + menuPanel.add(text0, BorderLayout.NORTH); + setVisible(true); + setSize(600, 600); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + add(main); + main.add(menuPanel, "HAUPT"); + cl.show(main, "HAUPT"); + } + + @Override + public void actionPerformed(ActionEvent e) { + // TODO Auto-generated method stub + + } +} diff --git a/PR2Projekt/src/test/java/java/de/hs_mannheim/informatik/mvn/test/HitoriTest.java b/PR2Projekt/src/test/java/java/de/hs_mannheim/informatik/mvn/test/HitoriTest.java new file mode 100644 index 0000000..c846e55 --- /dev/null +++ b/PR2Projekt/src/test/java/java/de/hs_mannheim/informatik/mvn/test/HitoriTest.java @@ -0,0 +1,133 @@ +package de.hs_mannheim.informatik.pr2projekt.test; + +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + +import de.hs_mannheim.informatik.pr2projekt.domain.HitoriMain; +import de.hs_mannheim.informatik.pr2projekt.gui.GameGUI; + +import java.io.FileNotFoundException; +import java.util.Arrays; + +class HitoriTest{ + + @Test + void test1() { + String[][] array3x3 = { + {"W", "W", "W"}, + {"W", "W", "W"}, + {"W", "W", "W"} + }; + assertTrue(Arrays.deepEquals(array3x3, HitoriMain.makeColorArray(3))); + } + + @Test + void test2() { + String[][] array3x2 = { + {"W", "W", "W"}, + {"W", "W", "W"}, + }; + assertFalse(Arrays.deepEquals(array3x2, HitoriMain.makeColorArray(3))); + } + + @Test + void test3() { + assertEquals("Zeit: 00:00", GameGUI.startTimer()); + } + + @Test + void test4() { + String[][] data = { + {"W", "B", "W", "W"}, + {"W", "W", "W", "B"}, + {"W", "B", "W", "W"}, + {"B", "W", "W", "B"}}; + String[][] colors = { + {"W", "W", "W", "W"}, + {"W", "W", "W", "B"}, + {"W", "B", "W", "W"}, + {"B", "W", "W", "B"}}; + String path = "C:/Users/Berat/Desktop/hitoriNew/src/main/java/de/hs_mannheim/informatik/mvn/Hitori_Highscores/Hitori4x4_leicht.txt"; + try { + assertFalse(HitoriMain.abgabeMöglich(path, data, colors)); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + @Test + void test5() { + String[][] data = { + {"W", "B", "W", "W"}, + {"W", "W", "W", "B"}, + {"W", "B", "W", "W"}, + {"B", "W", "W", "B"}}; + String[][] colors = { + {"W", "B", "W", "W"}, + {"W", "W", "W", "B"}, + {"W", "B", "W", "W"}, + {"B", "W", "W", "B"}}; + String path = "C:/Users/Berat/Desktop/hitoriNew/src/main/java/de/hs_mannheim/informatik/mvn/Hitori_Spielfelder/Hitori4x4_leicht.csv"; + try { + assertTrue(HitoriMain.abgabeMöglich(path, data, colors)); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + @Test + void test6() { + String[][] data = { + {"B", "W", "W", "B", "W"}, + {"W", "W", "B", "W", "W"}, + {"B", "W", "W", "B", "W"}, + {"W", "W", "B", "W", "W"}, + {"B", "W", "W", "W", "B"}}; + String[][] colors = { + {"W", "W", "W", "W", "W"}, + {"W", "W", "W", "B", "W"}, + {"W", "B", "W", "W", "W"}, + {"W", "B", "W", "W", "W"}, + {"W", "B", "W", "W", "W"}}; + String path = "C:/Users/Berat/Desktop/hitoriNew/src/main/java/de/hs_mannheim/informatik/mvn/Hitori_Spielfelder/Hitori5x5_leicht.csv"; + try { + assertFalse(HitoriMain.abgabeMöglich(path, data, colors)); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + @Test + void test7() { + String[][] data = { + {"B", "W", "W", "B", "W"}, + {"W", "W", "B", "W", "W"}, + {"B", "W", "W", "B", "W"}, + {"W", "W", "B", "W", "W"}, + {"B", "W", "W", "W", "B"}}; + String[][] colors = { + {"B", "W", "W", "B", "W"}, + {"W", "W", "B", "W", "W"}, + {"B", "W", "W", "B", "W"}, + {"W", "W", "B", "W", "W"}, + {"B", "W", "W", "W", "B"}}; + String path = "C:/Users/Berat/Desktop/hitoriNew/src/main/java/de/hs_mannheim/informatik/mvn/Hitori_Spielfelder/Hitori5x5_leicht.csv"; + try { + assertTrue(HitoriMain.abgabeMöglich(path, data, colors)); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + @Test + void test8() { + String[] array = {"3", "4"}; + assertFalse(Arrays.deepEquals(array, HitoriMain.getCords(3, 3))); + } + + @Test + void test9() { + String[] array = {"3", "4"}; + assertTrue(Arrays.deepEquals(array, HitoriMain.getCords(3, 4))); + } +} diff --git a/PR2Projekt/src/test/java/java/de/hs_mannheim/informatik/mvn/test/resources/log4j2.xml b/PR2Projekt/src/test/java/java/de/hs_mannheim/informatik/mvn/test/resources/log4j2.xml new file mode 100644 index 0000000..5d2ccbf --- /dev/null +++ b/PR2Projekt/src/test/java/java/de/hs_mannheim/informatik/mvn/test/resources/log4j2.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + \ No newline at end of file