Main.java
package de.hs_mannheim.informatik.mvn;
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.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Paths;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.EmptyStackException;
import java.util.Scanner;
import java.util.Stack;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class Main extends JFrame implements ActionListener {
private static String[] filepath = {"", ""};
private static CardLayout cl = new CardLayout();
private static JPanel main = new JPanel(cl);
private static Timer timer = new Timer();
private static long startTime;
private static long elapsedSeconds;
public static void main(String[] args) throws FileNotFoundException {
new Main();
}
public Main(){
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<buttons.length;i++){
JButton b0 = new JButton(buttons[i]);
buttonPanel.add(b0);
int[] count = {i};
String[] num = buttons[i].split("x");
b0.addActionListener(e -> {
int j = count[0];
String currentDirectory = Paths.get("").toAbsolutePath().toString();
System.out.println("Current Working Directory: " + currentDirectory);
String[] paths = {
"C:/Users/Berat/Desktop/hitoriNew/src/main/java/de/hs_mannheim/informatik/mvn/Hitori_Spielfelder/Hitori4x4_leicht.csv",
"C:/Users/Berat/Desktop/hitoriNew/src/main/java/de/hs_mannheim/informatik/mvn/Hitori_Spielfelder/Hitori5x5leicht.csv",
"C:/Users/Berat/Desktop/hitoriNew/src/main/java/de/hs_mannheim/informatik/mvn/Hitori_Spielfelder/Hitori8x8leicht.csv",
"C:/Users/Berat/Desktop/hitoriNew/src/main/java/de/hs_mannheim/informatik/mvn/Hitori_Spielfelder/Hitori8x8medium.csv",
"C:/Users/Berat/Desktop/hitoriNew/src/main/java/de/hs_mannheim/informatik/mvn/Hitori_Spielfelder/Hitori10x10medium.csv",
"C:/Users/Berat/Desktop/hitoriNew/src/main/java/de/hs_mannheim/informatik/mvn/Hitori_Spielfelder/Hitori15x15_medium.csv"
};
System.out.println("Current Working Directory: " + Paths.get("").toAbsolutePath());
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{
ablauf(filepath);
} catch (FileNotFoundException s){
System.out.println("Fehler: " + s.getMessage());
}
});
}
JButton b = new JButton("Highscores");
b.addActionListener(e -> {
highscoreScreen();
});
buttonPanel.add(b);
menuPanel.add(buttonPanel, BorderLayout.CENTER);
JLabel text0 = new JLabel("Wählen Sie ein Level aus!");
menuPanel.add(text0, BorderLayout.NORTH);
//add(menuPanel);
setVisible(true);
setSize(600, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(main);
main.add(menuPanel, "HAUPT");
cl.show(main, "HAUPT");
}
public static void ablauf(String[] filepath) throws FileNotFoundException{
Stack<String> madeMoves = new Stack<>();
String[][] data = getData(filepath[0], Integer.parseInt(filepath[1]));
String[][] colors = makeColorArray(data.length);
JButton[][] buttons = makeButtonArray(data);
paintGame(filepath, buttons, colors, madeMoves, data);
}
private static void highscoreScreen(){
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<buttons.length;i++){
JButton b0 = new JButton(buttons[i]);
buttonPanel.add(b0);
int[] count = {i};
b0.addActionListener(e -> {
int j = count[0];
String[] paths = {
"C:/Users/Berat/Desktop/hitoriNew/src/main/java/de/hs_mannheim/informatik/mvn/Hitori_Highscores/Hitori4x4_leicht.txt",
"C:/Users/Berat/Desktop/hitoriNew/src/main/java/de/hs_mannheim/informatik/mvn/Hitori_Highscores/Hitori5x5leicht.txt",
"C:/Users/Berat/Desktop/hitoriNew/src/main/java/de/hs_mannheim/informatik/mvn/Hitori_Highscores/Hitori8x8leicht.txt",
"C:/Users/Berat/Desktop/hitoriNew/src/main/java/de/hs_mannheim/informatik/mvn/Hitori_Highscores/Hitori8x8medium.txt",
"C:/Users/Berat/Desktop/hitoriNew/src/main/java/de/hs_mannheim/informatik/mvn/Hitori_Highscores/Hitori10x10medium.txt",
"C:/Users/Berat/Desktop/hitoriNew/src/main/java/de/hs_mannheim/informatik/mvn/Hitori_Highscores/Hitori15x15_medium.txt"
};
try {
showHighscores(paths[j]);
} catch (FileNotFoundException e1) {
e1.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");
}
private static void sortByTime(String path) throws FileNotFoundException, IOException{
File file = new File(path);
ArrayList<Entry> 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();
}
}
}
private static void showHighscores(String path) throws FileNotFoundException, IOException{
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<String> lines = 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();
});
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();
});
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");
}
private static ArrayList<String> readFromFile(String path){
ArrayList<String> lines = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new FileReader(path))) {
String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
}
} catch (IOException e) {
e.printStackTrace();
}
return lines;
}
private static String[][] getData(String filepath, int rows) throws FileNotFoundException{
String filepath0 = filepath;
Scanner sc = new Scanner(new File(filepath0));
String[][] data = new String[rows][rows];
int rowInt = 0;
while (sc.hasNextLine() && rowInt < rows) {
String line = sc.nextLine();
data[rowInt] = line.split(",");
rowInt++;
}
sc.close();
return data;
}
public static String[][] makeColorArray(int size){
String[][] colors = new String[size][size];
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
colors[i][j] = "W";
}
}
return colors;
}
private static JButton[][] makeButtonArray(String[][] data){
JButton[][] buttons = new JButton[data.length][data.length];
for(int i=0;i<data.length;i++){
for(int j=0;j<data.length;j++){
String number = data[i][j];
JButton b0 = new JButton(number);
buttons[i][j] = b0;
}
}
return buttons;
}
public static void paintGame(String[] filepath, JButton[][] buttons, String[][] colors, Stack<String> madeMoves, String[][] data) throws FileNotFoundException{
elapsedSeconds = 0;
System.out.println("BB: " + filepath[0]);
System.out.println("BB: " + filepath[1]);
int num = buttons.length;
JPanel gameGrid = new JPanel(new GridLayout(num,num,0,0));
for(int i=0;i<num;i++){
for(int j=0;j<num;j++){
JButton b = buttons[i][j];
b.setOpaque(true);
b.setContentAreaFilled(true);
b.setBorderPainted(false);
b.setFocusPainted(false);
b.setBackground(Color.WHITE);
gameGrid.add(b);
String[] pos = getCords(i,j);
b.addActionListener(e -> {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 -> {
filepath[0] = "";
filepath[1] = "";
cl.show(main, "HAUPT");
});
JButton b1 = new JButton("Zurück");
b1.addActionListener(e -> {backOneStep(madeMoves, buttons, colors, gameGrid);});
JButton b2 = new JButton("Zurücksetzen");
b2.addActionListener(e -> {try {
totalResetButton(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 = 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] = 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(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");
}
private static String startTimer() {
startTime = System.currentTimeMillis();
elapsedSeconds = 0;
return "Zeit: 00:00";
}
private static String stopTimer() {
timer.cancel();
long minutes = (elapsedSeconds % 3600) / 60;
long seconds = elapsedSeconds % 60;
String endtime = String.format("Zeit: %02d:%02d", minutes, seconds);
elapsedSeconds = 0; // Reset so the next start begins at zero
return endtime;
}
private static boolean abgabeMöglich(String path, String[][] data, String[][] colors) throws FileNotFoundException{
boolean abgabeMöglich = false;
String[][] result = getResult(data, colors);
System.out.println("RESULT");
printWholeCSV(path);
ArrayList<String> filteredData = getSolution(path, result);
String[][] ergebnis1 = getErgebnisArray(result, filteredData);
System.out.println("ERGEBNIS");
int count = 0;
for(int i=0;i<result.length;i++){
for(int j=0;j<result.length;j++){
if(result[i][j].equals(ergebnis1[i][j])){
} else {
count--;
}
}
}
if(count <0){
abgabeMöglich = false;
} else {
abgabeMöglich = true;
}
return abgabeMöglich;
}
public static void printWholeCSV(String path) {
System.out.println("NOW PRINTING ALL");
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println("An error occurred while reading the file: " + e.getMessage());
}
System.out.println("DONE PRINTING ALL");
}
private static void paintButton(JButton b, String[] pos, String[][] colors, Stack<String> 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);
}
}
private static String[] getCords(int i, int j){
String yKoordinate = String.valueOf(i);
String xKoordinate = String.valueOf(j);
String[] pos = {yKoordinate, xKoordinate};
return pos;
}
public static void backOneStep(Stack<String> 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) {}
}
private static void gridUpdate(JPanel grid, JButton[][] buttons){
grid.removeAll();
grid.repaint();
for(int i = 0; i<buttons.length; i++){
for(int j = 0; j<buttons.length;j++){
JButton b0 = buttons[i][j];
grid.add(b0);
grid.repaint();
}
}
}
private static void totalResetButton(JButton[][] buttons, String[][] colors,Stack<String> madeMoves,String[][] data) throws FileNotFoundException{
madeMoves.clear();
for(int i = 0; i<data.length;i++){
for(int j = 0; j<data.length;j++){
colors[i][j] = "W";
buttons[i][j] = null;
}
JButton[][] buttons0 = makeButtonArray(data);
paintGame(filepath, buttons0, colors, madeMoves, data);
}
}
private static String[][] getResult(String[][] data, String[][] colors){
String[][] result = new String[data.length][data.length];
for(int i=0;i<data.length;i++){
for(int j=0;j<data.length;j++){
String farben = colors[i][j];
String lastColor = String.valueOf(farben.charAt(farben.length() - 1));
if(lastColor.equals("G")){
lastColor = "W";
}
result[i][j] = lastColor;
}
}
System.out.println("AAAAAAAA");
return result;
}
private static ArrayList<String> getSolution(String path, String[][] result) throws FileNotFoundException {
Scanner sc = new Scanner(new File(path));
ArrayList<String> filteredData = new ArrayList<>();
boolean isUnderComment = false;
while (sc.hasNextLine()) {
String line = sc.nextLine().trim();
if (line.equals("//Lösung (schwarze Felder)")) {
isUnderComment = true;
continue;
}
if (isUnderComment && !line.isEmpty()) {
String[] lineArray = line.split(",");
int num1 = Integer.parseInt(lineArray[0]);
int num2 = Integer.parseInt(lineArray[1]);
String newNum1 = String.valueOf(num1-1);
String newNum2 = String.valueOf(num2-1);
String newLine = newNum1+","+newNum2;
filteredData.add(newLine);
}
}
sc.close();
System.out.println("BBBBBB");
System.out.println(filteredData);
return filteredData;
}
private static String[][] getErgebnisArray(String[][] result, ArrayList<String> filteredData){
String[][] ergebnis = new String[result.length][result.length];
for(int i=0;i<result.length;i++){
for(int j=0;j<result.length;j++){
ergebnis[i][j] = "W";
}
}
for (String index : filteredData) {
String[] parts = index.split(",");
int row = Integer.parseInt(parts[0].trim());
int col = Integer.parseInt(parts[1].trim());
if (row >= 0 && row < ergebnis.length && col >= 0 && col < ergebnis[row].length) {
ergebnis[row][col] = "B";
}
}
System.out.println("ERGEBNISMETHODE");
return ergebnis;
}
public static void finish(String endtime, String[] filepath, String path, String[][] data, String[][] colors) throws FileNotFoundException{
JPanel mainPanel = new JPanel(new BorderLayout());
JLabel text = new JLabel("Geben Sie unten Ihren Namen an um sich in der Highscore Liste einzutragen.");
mainPanel.add(text, BorderLayout.NORTH);
JTextField field = new JTextField(20);
mainPanel.add(field, BorderLayout.CENTER);
JButton b = new JButton("In der Highscore Liste eintragen");
mainPanel.add(b, BorderLayout.SOUTH);
mainPanel.setVisible(true);
mainPanel.setSize(600,600);
b.addActionListener(e -> {
String username = field.getText();
try {
LogTest.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");
}
// private 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;
// 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;
// System.out.println(eintrag);
// writer.write(timePart + " " + username);
// writer.newLine();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
@Override
public void actionPerformed(ActionEvent e){
}
}
class Entry {
LocalTime time;
String name;
Entry(LocalTime time, String name) {
this.time = time;
this.name = name;
}
}
class LogDemo{
private static final Logger log = Logger.getLogger(LogDemo.class.getName());
public static void main(String[] args){
log.info("LOS GEHTS!");
try {
((Object) null).toString();
} catch (Exception e) {
log.log(Level.SEVERE, "oh oh", e);
}
log.info("GING GUT.");
}
}