public BoardState ApplyMove(BoardState currentState, Move move, MoveValidationResult moveValidation) { var newBoardState = new BoardState(); Piece[,] piecePositions = (Piece[, ])currentState.PiecePositions.Clone(); MovePiece(move, piecePositions); MovePiece(moveValidation.CastleRookMove, piecePositions); RemoveEnPassantCapture(moveValidation, piecePositions); PromotePawn(move, moveValidation, piecePositions); newBoardState.PiecePositions = piecePositions; newBoardState.EnPassantTarget = moveValidation.NewEnPassantTarget; newBoardState.ActiveColor = currentState.ActiveColor == Color.White ? Color.Black : Color.White; newBoardState.CastlingState = GetNewCastlingState(move, currentState); if (currentState.ActiveColor == Color.Black) { newBoardState.FullmoveNumber += 1; } if (moveValidation.ShouldResetHalfmoveClock) { newBoardState.HalfmoveClock = 0; } else { newBoardState.HalfmoveClock += 1; } return(newBoardState); }
private void RemoveEnPassantCapture(MoveValidationResult moveValidation, Piece[,] piecePositions) { var enPassantCapture = moveValidation.EnPassantCapture; if (enPassantCapture == null) { return; } piecePositions[enPassantCapture.X, enPassantCapture.Y] = null; }
private void PromotePawn(Move move, MoveValidationResult moveValidation, Piece[,] piecePositions) { if (moveValidation.Promotion != null) { var piece = piecePositions[move.EndPosition.X, move.EndPosition.Y]; piecePositions[move.EndPosition.X, move.EndPosition.Y] = new Piece { Color = piece.Color, Type = moveValidation.Promotion.Value }; } }