This commit is contained in:
2025-04-16 10:43:56 +02:00
parent 2502d2c5d3
commit 3f06a9eb17

View File

@@ -25,12 +25,6 @@ public class PgnExport {
// final Game game = new Game(new ChessBoard()); // final Game game = new Game(new ChessBoard());
// final CommandExecutor commandExecutor = new CommandExecutor(game); // final CommandExecutor commandExecutor = new CommandExecutor(game);
// // FoolCheckMate foolCheckMate = new FoolCheckMate(commandExecutor);
// // // commandExecutor.addListener(foolCheckMate);
// // PromoteTest promoteTest = new PromoteTest(commandExecutor);
// // commandExecutor.addListener(promoteTest);
// DumbAI ai1 = new DumbAI(commandExecutor, Color.White); // DumbAI ai1 = new DumbAI(commandExecutor, Color.White);
// commandExecutor.addListener(ai1); // commandExecutor.addListener(ai1);
@@ -48,6 +42,8 @@ public class PgnExport {
// commandExecutor.executeCommand(new NewGameCommand()); // commandExecutor.executeCommand(new NewGameCommand());
// } // }
private static final PiecePgnName piecePgnName = new PiecePgnName();
private static Piece pieceAt(CommandExecutor commandExecutor, Coordinate coordinate) { private static Piece pieceAt(CommandExecutor commandExecutor, Coordinate coordinate) {
GetPieceAtCommand cmd = new GetPieceAtCommand(coordinate); GetPieceAtCommand cmd = new GetPieceAtCommand(coordinate);
commandExecutor.executeCommand(cmd); commandExecutor.executeCommand(cmd);
@@ -60,6 +56,22 @@ public class PgnExport {
return cmd.getMoves(); return cmd.getMoves();
} }
private static String gameEnd(Game game) {
switch (game.checkGameStatus()) {
case Draw:
case Pat:
return "1/2-1/2";
case CheckMate:
if (game.getPlayerTurn() == Color.White)
return "1-0";
return "0-1";
default:
return "";
}
}
private static String resolveAmbiguity(CommandExecutor cmdExec, Move pieceMove) { private static String resolveAmbiguity(CommandExecutor cmdExec, Move pieceMove) {
Piece movingPiece = pieceAt(cmdExec, pieceMove.getStart()); Piece movingPiece = pieceAt(cmdExec, pieceMove.getStart());
@@ -93,9 +105,90 @@ public class PgnExport {
return ""; return "";
} }
public static String exportGame(Game game) { private static String capture(MoveCommand move, Piece movingPiece) {
String result = "";
if (move.getDeadPiece() != null) {
if (movingPiece instanceof Pawn) {
result += toString(move.getMove().getStart()).charAt(0);
}
result += "x";
}
return result;
}
// saveToFile(game.getMoves()); private static String promote(PlayerCommand nextCommand) {
if (nextCommand != null && nextCommand instanceof PromoteCommand promoteCommand) {
String result = "=";
result += switch (promoteCommand.getPromoteType()) {
case Bishop -> "B";
case Knight -> "N";
case Queen -> "Q";
case Rook -> "R";
};
return result;
}
return "";
}
private static String castling(CastlingCommand castlingCommand) {
String result = "O-O";
if (castlingCommand.isBigCastling())
result += "-O";
return result;
}
private static String checkCheckMate(Game game) {
switch (game.checkGameStatus()) {
case CheckMate:
return "#";
case Check:
return "+";
default:
return "";
}
}
private static String printMove(PlayerCommand cmd, PlayerCommand nextCommand, Game virtualGame,
CommandExecutor executor) {
String result = "";
if (cmd instanceof MoveCommand move) {
Piece movingPiece = virtualGame.getBoard().pieceAt(move.getMove().getStart());
assert movingPiece != null;
// piece name
result += piecePgnName.visit(movingPiece);
// ambiguious start
result += resolveAmbiguity(executor, move.getMove());
// capture
result += capture(move, movingPiece);
// end cell
result += toString(move.getMove().getFinish());
// promote
result += promote(nextCommand);
} else if (cmd instanceof CastlingCommand castlingCommand) {
result += castling(castlingCommand);
}
executor.executeCommand(cmd);
// check or checkmate
result += checkCheckMate(virtualGame);
result += " ";
return result;
}
public static String exportGame(Game game) {
ChessBoard board = new ChessBoard(); ChessBoard board = new ChessBoard();
Game virtualGame = new Game(board); Game virtualGame = new Game(board);
@@ -104,7 +197,6 @@ public class PgnExport {
executor.executeCommand(new NewGameCommand()); executor.executeCommand(new NewGameCommand());
List<PlayerCommand> commands = game.getMoves(); List<PlayerCommand> commands = game.getMoves();
PiecePgnName piecePgnName = new PiecePgnName();
String result = ""; String result = "";
int tour = 1; int tour = 1;
@@ -115,66 +207,13 @@ public class PgnExport {
if (i != commands.size() - 1) { if (i != commands.size() - 1) {
nextCommand = commands.get(i + 1); nextCommand = commands.get(i + 1);
} }
if (cmd instanceof MoveCommand move) { if (virtualGame.getPlayerTurn() == Color.White) {
if (virtualGame.getPlayerTurn() == Color.White) { result += tour + ".";
result += tour + "."; tour++;
tour++;
}
Piece movingPiece = virtualGame.getBoard().pieceAt(move.getMove().getStart());
assert movingPiece != null;
// piece name
result += piecePgnName.visit(movingPiece);
// capture
if (move.getDeadPiece() != null) {
if (movingPiece instanceof Pawn) {
result += toString(move.getMove().getStart()).charAt(0);
}
result += "x";
}
// ambiguious start
result += resolveAmbiguity(executor, move.getMove());
// end cell
result += toString(move.getMove().getFinish());
// promote
if (nextCommand != null && nextCommand instanceof PromoteCommand promoteCommand) {
result += "=";
result += switch (promoteCommand.getPromoteType()) {
case Bishop -> "B";
case Knight -> "N";
case Queen -> "Q";
case Rook -> "R";
};
}
} else if (cmd instanceof CastlingCommand castlingCommand) {
result += "O-O";
if (castlingCommand.isBigCastling())
result += "-O";
} }
result += printMove(cmd, nextCommand, virtualGame, executor);
executor.executeCommand(cmd);
// check or checkmate
switch (virtualGame.checkGameStatus()) {
case CheckMate:
result += "#";
break;
case Check:
result += "+";
break;
default:
break;
}
result += " ";
} }
return result; return result + " " + gameEnd(virtualGame);
} }
public static String toString(Coordinate coordinate) { public static String toString(Coordinate coordinate) {