Implemented en passant
This commit is contained in:
parent
cac235a0db
commit
984bedfafe
@ -109,6 +109,11 @@ public class Board implements Cloneable {
|
||||
// TODO: Select promotion
|
||||
setDest(move, new Queen(piece.getColor(), this));
|
||||
break;
|
||||
case EN_PASSANT:
|
||||
setDest(move, piece);
|
||||
setPos(move, null);
|
||||
boardArr[move.dest.x][move.dest.y - move.ySign] = null;
|
||||
break;
|
||||
case CASTLING:
|
||||
// Move the king
|
||||
setDest(move, piece);
|
||||
@ -160,6 +165,11 @@ public class Board implements Cloneable {
|
||||
setPos(move, new Pawn(getDest(move).getColor(), this));
|
||||
setDest(move, capturedPiece);
|
||||
break;
|
||||
case EN_PASSANT:
|
||||
setPos(move, getDest(move));
|
||||
setDest(move, null);
|
||||
boardArr[move.dest.x][move.dest.y - move.ySign] = new Pawn(getPos(move).getColor().opposite(), this);
|
||||
break;
|
||||
case CASTLING:
|
||||
// Move the king
|
||||
setPos(move, getDest(move));
|
||||
@ -504,4 +514,9 @@ public class Board implements Cloneable {
|
||||
* @return The active color for the next move
|
||||
*/
|
||||
public Color getActiveColor() { return log.getActiveColor(); }
|
||||
|
||||
/**
|
||||
* @return The current en passant square, or null if there isn't any
|
||||
*/
|
||||
public Position getEnPassantSquare() { return log.getLast() == null ? null : log.getLast().enPassant; }
|
||||
}
|
||||
|
@ -17,10 +17,10 @@ public class Pawn extends Piece {
|
||||
|
||||
@Override
|
||||
public boolean isValidMove(Move move) {
|
||||
// TODO: en passant
|
||||
boolean step = move.isVertical() && move.yDist == 1;
|
||||
boolean doubleStep = move.isVertical() && move.yDist == 2;
|
||||
boolean strafe = move.isDiagonal() && move.xDist == 1;
|
||||
boolean enPassant = false;
|
||||
if (getColor() == Color.WHITE) doubleStep &= move.pos.y == 6;
|
||||
else doubleStep &= move.pos.y == 1;
|
||||
|
||||
@ -28,7 +28,14 @@ public class Pawn extends Piece {
|
||||
if (move.ySign == 1 && move.pos.y == 6 || move.ySign == -1 && move.pos.y == 1)
|
||||
move.type = Move.Type.PAWN_PROMOTION;
|
||||
|
||||
return (step ^ doubleStep ^ strafe) && move.ySign == (getColor() == Color.WHITE ? -1 : 1) && isFreePath(move);
|
||||
// Mark the move as en passant if necessary
|
||||
if (strafe && move.dest.equals(board.getEnPassantSquare())) {
|
||||
enPassant = true;
|
||||
move.type = Move.Type.EN_PASSANT;
|
||||
}
|
||||
|
||||
return enPassant || (step ^ doubleStep ^ strafe) && move.ySign == (getColor() == Color.WHITE ? -1 : 1)
|
||||
&& isFreePath(move);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -72,10 +79,16 @@ public class Pawn extends Piece {
|
||||
if (isFreePath(move)) moves.add(move);
|
||||
}
|
||||
|
||||
// Mark moves as pawn promotions if necessary
|
||||
// Mark moves as pawn promotion if necessary
|
||||
if (sign == 1 && pos.y == 6 || sign == -1 && pos.y == 1)
|
||||
moves.parallelStream().forEach(m -> m.type = Move.Type.PAWN_PROMOTION);
|
||||
|
||||
// Add en passant move if necessary
|
||||
if (board.getEnPassantSquare() != null) {
|
||||
Move move = new Move(pos, board.getEnPassantSquare(), Move.Type.EN_PASSANT);
|
||||
if (move.isDiagonal() && move.xDist == 1) moves.add(move);
|
||||
}
|
||||
|
||||
return moves;
|
||||
}
|
||||
|
||||
|
@ -86,7 +86,7 @@ public class Game {
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
players.forEach((k, v) -> v.cancelMove());
|
||||
players.values().forEach(Player::cancelMove);
|
||||
board.initializeDefaultPositions();
|
||||
boardComponent.repaint();
|
||||
overlayComponent.clearDots();
|
||||
@ -94,7 +94,7 @@ public class Game {
|
||||
}
|
||||
|
||||
/**
|
||||
* Removed all connections between the game and the ui.
|
||||
* Removed all connections between the game and the UI.
|
||||
*/
|
||||
public void disconnect() {
|
||||
players.values().forEach(Player::disconnect);
|
||||
|
Reference in New Issue
Block a user