This commit is contained in:
bensefia 2025-05-13 15:43:04 +02:00
parent acceabcc0b
commit fe7abc9b4a
1 changed files with 32 additions and 12 deletions

View File

@ -89,6 +89,7 @@ public class Board {
if (gameOver) return; if (gameOver) return;
Piece clickedPiece = getPieceAt(x, y); Piece clickedPiece = getPieceAt(x, y);
if (selectedX == null || selectedY == null) { if (selectedX == null || selectedY == null) {
if (clickedPiece != null && clickedPiece.isWhite() == turnIsWhite) { if (clickedPiece != null && clickedPiece.isWhite() == turnIsWhite) {
selectedX = x; selectedX = x;
@ -98,31 +99,50 @@ public class Board {
} else { } else {
Piece selectedPiece = getPieceAt(selectedX, selectedY); Piece selectedPiece = getPieceAt(selectedX, selectedY);
if (selectedPiece != null && selectedPiece.isWhite() == turnIsWhite) { if (selectedPiece != null && selectedPiece.isWhite() == turnIsWhite) {
Piece captured = getPieceAt(x, y);
pieces.removeIf(p -> p.getX() == x && p.getY() == y); // simulate move
pieces.removeIf(p -> p.getX() == selectedX && p.getY() == selectedY); Board simulation = new Board(this);
Piece moved = new Piece( simulation.pieces.removeIf(p -> p.getX() == selectedX && p.getY() == selectedY);
simulation.pieces.removeIf(p -> p.getX() == x && p.getY() == y);
simulation.pieces.add(new Piece(
selectedPiece.isWhite(), selectedPiece.isWhite(),
selectedPiece.getType(), selectedPiece.getType(),
x, x,
y y
); ));
pieces.add(moved);
// check if move is legal (king remains safe)
if (!simulation.isKingInCheck(turnIsWhite)) {
Piece captured = getPieceAt(x, y);
pieces.removeIf(p -> p.getX() == x && p.getY() == y);
pieces.removeIf(p -> p.getX() == selectedX && p.getY() == selectedY);
pieces.add(new Piece(
selectedPiece.isWhite(),
selectedPiece.getType(),
x,
y
));
Move move = new Move(selectedPiece, selectedX, selectedY, x, y, captured); Move move = new Move(selectedPiece, selectedX, selectedY, x, y, captured);
moveHistory.push(move); moveHistory.push(move);
turnNumber++; turnNumber++;
turnIsWhite = !turnIsWhite; turnIsWhite = !turnIsWhite;
// check for checkmate on the opponent
if (isCheckmate(!turnIsWhite)) { if (isCheckmate(!turnIsWhite)) {
gameOver = true; gameOver = true;
} }
} }
}
// deselect in all cases
selectedX = null; selectedX = null;
selectedY = null; selectedY = null;
highlightedPositions.clear(); highlightedPositions.clear();
} }
} }
public void undoLastMove() { public void undoLastMove() {
if (!moveHistory.isEmpty()) { if (!moveHistory.isEmpty()) {
Move lastMove = moveHistory.pop(); Move lastMove = moveHistory.pop();