private static bool CanMakeEnPassantMove(Piece pieceToMove, ChessMoveStepInfo lastMoveStep, Piece pieceOnTheSide) { return(!pieceOnTheSide.IsNone() && pieceOnTheSide.Type == PieceType.Pawn && pieceOnTheSide.Player != pieceToMove.Player && pieceOnTheSide.NumberOfPlayedMoves == 1 && lastMoveStep.NewPosition.Equals(pieceOnTheSide.Position) && Math.Abs((int)lastMoveStep.OldPosition.VerticalPosition - (int)lastMoveStep.NewPosition.VerticalPosition) == 2); }
private static List <ChessMoveInfo> GetCastlingMoves(ChessBoard board, Piece kingPiece) { var moves = new List <ChessMoveInfo>(); var verticalPosition = kingPiece.Position.VerticalPosition; var shortCastlingRookPosition = new PiecePosition(PieceHorizontalPosition.P_H, verticalPosition); var shortCastlingRookPiece = board.GetPiece(shortCastlingRookPosition); var canDoShortCastling = CanDoCastling(board, kingPiece, shortCastlingRookPiece); if (canDoShortCastling) { var newRookPosition = new PiecePosition(PieceHorizontalPosition.P_F, verticalPosition); var newKingPosition = new PiecePosition(PieceHorizontalPosition.P_G, verticalPosition); var firstMoveStep = new ChessMoveStepInfo(shortCastlingRookPosition, newRookPosition, shortCastlingRookPiece); var secondMoveStep = new ChessMoveStepInfo(kingPiece.Position, newKingPosition, kingPiece); var steps = new List <ChessMoveStepInfo> { firstMoveStep, secondMoveStep }; var move = new ChessMoveInfo(kingPiece.Player, steps, false, isCastling: true); moves.Add(move); } var longCastlingRookPosition = new PiecePosition(PieceHorizontalPosition.P_A, verticalPosition); var longCastlingRookPiece = board.GetPiece(longCastlingRookPosition); var canDoLongCastling = CanDoCastling(board, kingPiece, longCastlingRookPiece); if (canDoLongCastling) { var newRookPosition = new PiecePosition(PieceHorizontalPosition.P_D, verticalPosition); var newKingPosition = new PiecePosition(PieceHorizontalPosition.P_C, verticalPosition); var firstMoveStep = new ChessMoveStepInfo(longCastlingRookPosition, newRookPosition, longCastlingRookPiece); var secondMoveStep = new ChessMoveStepInfo(kingPiece.Position, newKingPosition, kingPiece); var steps = new List <ChessMoveStepInfo> { firstMoveStep, secondMoveStep }; var move = new ChessMoveInfo(kingPiece.Player, steps, false, isCastling: true); moves.Add(move); } return(moves); }