public IBoard Move(IMove move) { IBoard result = this.Clone() as Board; IPiece pieceToMove = result.GetFigureAt(move.Start); IPiece attackedPiece = result.GetFigureAt(move.Destination); if (!AreAnyPiecesBetwen(move.Start, move.Destination)) { if (attackedPiece == null) { if (pieceToMove.IsAllowedMove(move)) { pieceToMove.Move(move.Destination); if (!result.IsCheck(pieceToMove.color)) { result.LastMove = move; return(result); } } else if (pieceToMove.Type == PiecesTypesEnum.Pawn && pieceToMove.IsAllowedCapture(move)) { IPiece lastMovedPiece = result.GetFigureAt(LastMove.Destination); if (lastMovedPiece.Type == PiecesTypesEnum.Pawn && LastMove.Distance() == DistanceEnum.TwoSquares && (LastMove.Destination.x == move.Start.x - 1 || LastMove.Destination.x == move.Start.x + 1) && LastMove.Destination.y == move.Start.y) { result.RemovePiece(lastMovedPiece); pieceToMove.Move(move.Destination); if (!result.IsCheck(pieceToMove.color)) { result.LastMove = move; return(result); } } } else if (pieceToMove.Type == PiecesTypesEnum.King) { IKing king = pieceToMove as IKing; List <IMove> moves = king.Castling(move, result); if (moves != null) { foreach (var item in moves) { result.GetFigureAt(item.Start).Move(item.Destination); } if (!result.IsCheck(pieceToMove.color)) { result.LastMove = move; return(result); } } } } else if (attackedPiece.color != pieceToMove.color) { if (pieceToMove.IsAllowedCapture(move)) { result.RemovePiece(attackedPiece); pieceToMove.Move(move.Destination); if (!result.IsCheck(pieceToMove.color)) { result.LastMove = move; return(result); } } } } return(null); }