Compare commits
3 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
57b68bb0d2 | |
|
|
8e45acb0b3 | |
|
|
a19130bb86 |
|
|
@ -1,4 +1,6 @@
|
||||||
package de.hs_mannheim.informatik.chess.main;
|
package de.hs_mannheim.informatik.chess.main;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
import de.hs_mannheim.informatik.chess.controller.Controller;
|
import de.hs_mannheim.informatik.chess.controller.Controller;
|
||||||
import de.hs_mannheim.informatik.chess.model.ChessEngine;
|
import de.hs_mannheim.informatik.chess.model.ChessEngine;
|
||||||
import de.hs_mannheim.informatik.chess.view.GameGui;
|
import de.hs_mannheim.informatik.chess.view.GameGui;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,8 @@
|
||||||
package de.hs_mannheim.informatik.chess.model;
|
package de.hs_mannheim.informatik.chess.model;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.logging.ConsoleHandler;
|
import java.util.logging.ConsoleHandler;
|
||||||
|
|
@ -10,7 +14,10 @@ import java.util.logging.SimpleFormatter;
|
||||||
import com.github.bhlangonijr.chesslib.Board;
|
import com.github.bhlangonijr.chesslib.Board;
|
||||||
import com.github.bhlangonijr.chesslib.Piece;
|
import com.github.bhlangonijr.chesslib.Piece;
|
||||||
import com.github.bhlangonijr.chesslib.Square;
|
import com.github.bhlangonijr.chesslib.Square;
|
||||||
|
import com.github.bhlangonijr.chesslib.game.Game;
|
||||||
|
import com.github.bhlangonijr.chesslib.game.GameResult;
|
||||||
import com.github.bhlangonijr.chesslib.move.Move;
|
import com.github.bhlangonijr.chesslib.move.Move;
|
||||||
|
import com.github.bhlangonijr.chesslib.pgn.PgnHolder;
|
||||||
|
|
||||||
public class ChessEngine {
|
public class ChessEngine {
|
||||||
private Board board;
|
private Board board;
|
||||||
|
|
@ -187,4 +194,71 @@ public class ChessEngine {
|
||||||
logger.info("ChessEngine wurde initialisiert.");
|
logger.info("ChessEngine wurde initialisiert.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Game> loadGamesFromPgn(String path) throws IOException {
|
||||||
|
|
||||||
|
PgnHolder pgnHolder = new PgnHolder(path);
|
||||||
|
try {
|
||||||
|
pgnHolder.loadPgn();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
List<Game> games = pgnHolder.getGames();
|
||||||
|
return games;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveAsPgn(Game game, String path, String dateiname) {
|
||||||
|
String event = game.getRound().getEvent().getName();
|
||||||
|
String site = game.getRound().getEvent().getSite();
|
||||||
|
String round = "" + game.getRound().getNumber();
|
||||||
|
String date = game.getRound().getEvent().getStartDate();
|
||||||
|
String wName = game.getWhitePlayer().getName();
|
||||||
|
String bName = game.getBlackPlayer().getName();
|
||||||
|
String result = game.getResult().getDescription();
|
||||||
|
|
||||||
|
StringBuilder header = new StringBuilder();
|
||||||
|
header.append("[Event \"" + event + "\"]\n");
|
||||||
|
header.append("[Site \"" + site + "\"]\n");
|
||||||
|
header.append("[Date \"" + date + "\"]\n");
|
||||||
|
header.append("[Round \"" + round + "\"]\n");
|
||||||
|
header.append("[White \"" + wName + "\"]\n");
|
||||||
|
header.append("[Black \"" + bName + "\"]\n");
|
||||||
|
header.append("[Result \"" + result + "\"]\n");
|
||||||
|
header.append("\n");
|
||||||
|
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
String[] sanArray = game.getHalfMoves().toSanArray();
|
||||||
|
|
||||||
|
for (int i = 0; i < sanArray.length; i++) {
|
||||||
|
if (i % 2 == 0) {
|
||||||
|
sb.append((i / 2 + 1)).append(". ");
|
||||||
|
}
|
||||||
|
sb.append(sanArray[i]).append(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.append(result); // Endergebnis muss auch am Ende stehen!
|
||||||
|
|
||||||
|
String file = header.toString() + sb.toString();
|
||||||
|
|
||||||
|
try {
|
||||||
|
Files.writeString(Path.of(path, dateiname), file, StandardCharsets.UTF_8);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loadMoves(List<Move> moveList) {
|
||||||
|
board = new Board(); // Neues leeres Brett
|
||||||
|
moves.clear();
|
||||||
|
currentMoveIndex = 0;
|
||||||
|
|
||||||
|
for (Move move : moveList) {
|
||||||
|
board.doMove(move);
|
||||||
|
moves.add(move);
|
||||||
|
currentMoveIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Kein setPositionToMoveIndex() hier aufrufen!
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,29 @@
|
||||||
package de.hs_mannheim.informatik.chess.view;
|
package de.hs_mannheim.informatik.chess.view;
|
||||||
|
|
||||||
import java.awt.*;
|
import com.github.bhlangonijr.chesslib.game.Game;
|
||||||
|
import com.github.bhlangonijr.chesslib.move.Move;
|
||||||
|
import de.hs_mannheim.informatik.chess.controller.Controller;
|
||||||
|
import de.hs_mannheim.informatik.chess.model.ChessEngine;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class MainGui {
|
public class MainGui {
|
||||||
|
|
||||||
private JFrame frame;
|
private JFrame frame;
|
||||||
private Runnable onStartGame;
|
private Runnable onStartGame;
|
||||||
|
private ChessEngine engine = new ChessEngine();
|
||||||
|
|
||||||
public MainGui(Runnable onStartGame) {
|
public MainGui(Runnable onStartGame) {
|
||||||
this.onStartGame = onStartGame;
|
this.onStartGame = onStartGame;
|
||||||
|
|
||||||
frame = new JFrame("Chess - Hauptmenü");
|
frame = new JFrame("Chess - Hauptmenü");
|
||||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||||
frame.setSize(1600, 1000);
|
frame.setSize(1600, 1000);
|
||||||
frame.setLocationRelativeTo(null);
|
frame.setLocationRelativeTo(null);
|
||||||
|
|
||||||
//Haupt-Panel mit GridBagLayout
|
|
||||||
JPanel mainPanel = new JPanel(new GridBagLayout());
|
JPanel mainPanel = new JPanel(new GridBagLayout());
|
||||||
mainPanel.setBackground(new Color(0xe0e1dd));
|
mainPanel.setBackground(new Color(0xe0e1dd));
|
||||||
|
|
||||||
|
|
@ -25,20 +32,17 @@ public class MainGui {
|
||||||
gbc.fill = GridBagConstraints.HORIZONTAL;
|
gbc.fill = GridBagConstraints.HORIZONTAL;
|
||||||
gbc.insets = new Insets(15, 0, 15, 0);
|
gbc.insets = new Insets(15, 0, 15, 0);
|
||||||
|
|
||||||
//Title
|
|
||||||
JLabel title = new JLabel("ChessDE", SwingConstants.CENTER);
|
JLabel title = new JLabel("ChessDE", SwingConstants.CENTER);
|
||||||
title.setFont(new Font("Serif", Font.BOLD, 150));
|
title.setFont(new Font("Serif", Font.BOLD, 150));
|
||||||
title.setForeground(new Color(0x1b263b));
|
title.setForeground(new Color(0x1b263b));
|
||||||
gbc.gridy = 0;
|
gbc.gridy = 0;
|
||||||
gbc.ipady = 50;
|
gbc.ipady = 50;
|
||||||
mainPanel.add(title, gbc);
|
mainPanel.add(title, gbc);
|
||||||
|
|
||||||
//Abstand nach unten
|
|
||||||
gbc.gridy = 1;
|
gbc.gridy = 1;
|
||||||
gbc.ipady = 15;
|
gbc.ipady = 15;
|
||||||
mainPanel.add(Box.createRigidArea(new Dimension(0, 20)), gbc);
|
mainPanel.add(Box.createRigidArea(new Dimension(0, 20)), gbc);
|
||||||
|
|
||||||
//Buttons
|
|
||||||
JButton btnMode1 = new JButton("Normal Mode");
|
JButton btnMode1 = new JButton("Normal Mode");
|
||||||
JButton btnMode2 = new JButton("Mode 2 (coming soon)");
|
JButton btnMode2 = new JButton("Mode 2 (coming soon)");
|
||||||
JButton btnMode3 = new JButton("Mode 3 (coming soon)");
|
JButton btnMode3 = new JButton("Mode 3 (coming soon)");
|
||||||
|
|
@ -59,24 +63,74 @@ public class MainGui {
|
||||||
|
|
||||||
gbc.gridy = 4;
|
gbc.gridy = 4;
|
||||||
mainPanel.add(btnMode3, gbc);
|
mainPanel.add(btnMode3, gbc);
|
||||||
|
|
||||||
gbc.gridy = 5;
|
gbc.gridy = 5;
|
||||||
mainPanel.add(btnCreative, gbc);
|
mainPanel.add(btnCreative, gbc);
|
||||||
|
|
||||||
gbc.gridy = 6;
|
gbc.gridy = 6;
|
||||||
mainPanel.add(btnLoadGame, gbc);
|
mainPanel.add(btnLoadGame, gbc);
|
||||||
|
|
||||||
frame.add(mainPanel);
|
frame.add(mainPanel);
|
||||||
frame.setVisible(true);
|
frame.setVisible(true);
|
||||||
|
|
||||||
//Button ActionListener für "Normal Modus"
|
|
||||||
btnMode1.addActionListener(e -> {
|
btnMode1.addActionListener(e -> {
|
||||||
frame.dispose(); // Hauptmenü schließen
|
frame.dispose();
|
||||||
onStartGame.run(); // **Ruft den Callback auf**
|
onStartGame.run();
|
||||||
|
});
|
||||||
|
|
||||||
|
btnLoadGame.addActionListener(e -> {
|
||||||
|
JFileChooser chooser = new JFileChooser();
|
||||||
|
int result = chooser.showOpenDialog(frame);
|
||||||
|
if (result == JFileChooser.APPROVE_OPTION) {
|
||||||
|
String path = chooser.getSelectedFile().getAbsolutePath();
|
||||||
|
try {
|
||||||
|
List<Game> games = engine.loadGamesFromPgn(path);
|
||||||
|
zeigeGeladeneSpiele(games);
|
||||||
|
} catch (IOException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
JOptionPane.showMessageDialog(frame, "Fehler beim Laden der PGN-Datei:\n" + ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper für Button Styling
|
private void zeigeGeladeneSpiele(List<Game> games) {
|
||||||
|
JFrame gameListFrame = new JFrame("Geladene Partien");
|
||||||
|
gameListFrame.setSize(600, 800);
|
||||||
|
gameListFrame.setLocationRelativeTo(null);
|
||||||
|
|
||||||
|
JPanel panel = new JPanel();
|
||||||
|
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
|
||||||
|
JScrollPane scrollPane = new JScrollPane(panel);
|
||||||
|
|
||||||
|
int index = 1;
|
||||||
|
for (Game game : games) {
|
||||||
|
String white = game.getWhitePlayer().getName();
|
||||||
|
String black = game.getBlackPlayer().getName();
|
||||||
|
String title = "Spiel " + index++ + ": " + white + " vs. " + black;
|
||||||
|
|
||||||
|
JButton gameButton = new JButton(title);
|
||||||
|
gameButton.setAlignmentX(Component.CENTER_ALIGNMENT);
|
||||||
|
gameButton.addActionListener(e -> {
|
||||||
|
gameListFrame.dispose();
|
||||||
|
|
||||||
|
GameGui gui = new GameGui();
|
||||||
|
ChessEngine engine = new ChessEngine();
|
||||||
|
|
||||||
|
engine.loadMoves(game.getHalfMoves());
|
||||||
|
engine.setPositionToMoveIndex(engine.getMoveListSize()); // zeige Endstellung
|
||||||
|
|
||||||
|
new Controller(gui, engine);
|
||||||
|
});
|
||||||
|
|
||||||
|
panel.add(Box.createRigidArea(new Dimension(0, 10)));
|
||||||
|
panel.add(gameButton);
|
||||||
|
}
|
||||||
|
|
||||||
|
gameListFrame.add(scrollPane);
|
||||||
|
gameListFrame.setVisible(true);
|
||||||
|
}
|
||||||
|
|
||||||
private void styleButton(JButton btn) {
|
private void styleButton(JButton btn) {
|
||||||
btn.setFont(new Font("Serif", Font.BOLD, 30));
|
btn.setFont(new Font("Serif", Font.BOLD, 30));
|
||||||
btn.setBackground(new Color(0x778da9));
|
btn.setBackground(new Color(0x778da9));
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue