> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Cómo hacer más con las tablas de clasificación

> Características avanzadas de las tablas de clasificación de PlayFab: cree tablas de clasificación de varias columnas, desempate mejorado, entidades externas y consulta de clasificaciones en torno a un jugador.

En este tutorial, vamos a cubrir características avanzadas que ofrece el servicio, como la creación de tablas de clasificación
de varias columnas, el desempate mejorado y varias maneras de consultar la tabla de clasificación.

Para este ejemplo, vamos a suponer que todo lo presentado en [Creación de una tabla de clasificación básica](/services/playfab/community/leaderboards/create-basic-leaderboard)
le resulta familiar. Vamos a empezar con un shooter altamente competitivo como ejemplo de cómo estas nuevas características podrían ayudarnos a resolver
algunos problemas. En este juego, hay un modo llamado Team Death match, que consiste en dos equipos enfrentándose entre sí. Quien llegue primero a
75 eliminaciones es el ganador. Ahora bien, este juego no se basa en una única puntuación para clasificar a los jugadores; en su lugar, se basa en el número
de eliminaciones, asistencias y muertes para definir quién es el mejor.

## Creación de una definición de tabla de clasificación de varias columnas

Para empezar con este ejemplo, necesitamos crear una definición de tabla de clasificación más compleja que la que teníamos antes.
Vamos a definir varias columnas para asignar los aspectos clave del juego: eliminaciones, asistencias y muertes.
En el ejemplo siguiente se muestra cómo crear la definición de la tabla de clasificación con el SDK de C#.

```C# theme={null}
public static async Task CreateLeaderboardDefinitionAsync(PlayFabAuthenticationContext context, string leaderboardName)
{
    PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
    CreateLeaderboardDefinitionRequest leaderboardDefinitionRequest = new CreateLeaderboardDefinitionRequest()
    {
        AuthenticationContext = context,
        Name = leaderboardName,
        SizeLimit = 1000,
        EntityType = "title_player_account",
        VersionConfiguration = new VersionConfiguration()
        {
            MaxQueryableVersions = 1,
            ResetInterval = ResetInterval.Manual,
        },
        Columns = new List<LeaderboardColumn>()
        {
            new LeaderboardColumn()
            {
                Name = "Eliminations",
                SortDirection = LeaderboardSortDirection.Descending,
            },
            new LeaderboardColumn()
            {
                Name = "Assists",
                SortDirection = LeaderboardSortDirection.Descending,
            }
            new LeaderboardColumn()
            {
                Name = "Deaths",
                SortDirection = LeaderboardSortDirection.Ascending,
            }         
        }
    };

    PlayFabResult<PlayFab.LeaderboardsModels.EmptyResponse> createLbDefinitionResult = await leaderboardsAPI.CreateLeaderboardDefinitionAsync(leaderboardDefinitionRequest);
}
```

Ahora, expliquemos algunos elementos clave de este ejemplo:

* `SizeLimit`: este parámetro se usa para limitar el número de filas que podría tener la tabla de clasificación. El valor aquí es solo un ejemplo.
* `VersionConfiguration`: este parámetro nos permite tener control de versiones en nuestras tablas de clasificación. Consulte esta página para
  obtener más información: [Tablas de clasificación de temporada](/services/playfab/community/leaderboards/seasonal-leaderboards)
* `Columns`: este parámetro nos permite definir varias columnas, con un máximo de 5 por definición. Como puede ver, configuramos Eliminations, Assists y Deaths.
  Un elemento importante aquí es el parámetro `SortDirection`, que nos permite determinar la ordenación de la tabla de clasificación.
  En este ejemplo, un jugador se clasifica más alto si tiene más eliminaciones y asistencias (SortDirection = Descending) y
  menos muertes (SortDirection = Ascending).

Para obtener más información sobre otros parámetros o sobre cómo administrar definiciones de tablas de clasificación, consulte [Creación de una tabla de clasificación básica](/services/playfab/community/leaderboards/create-basic-leaderboard).

## Uso de entidades externas

El servicio de tablas de clasificación se puede usar como componente independiente y admite el uso de entidades externas que solo tienen sentido en el contexto del juego. Si las identidades de sus jugadores no están vinculadas al inicio de sesión de PlayFab, aún puede usar el servicio de tablas de clasificación. El tipo de entidad para las entradas de la tabla de clasificación fuera del sistema de PlayFab debe ser *external*. El entityId es entonces la identidad del jugador en su sistema. En estos casos, *todas* las entradas de la tabla de clasificación deben ser entidades *external*.

## Adición de datos a una tabla de clasificación

Ahora que tenemos nuestra tabla de clasificación creada, vamos a agregar datos. La principal diferencia con nuestro tutorial anterior sobre este tema es
que ahora necesitamos agregar tres puntuaciones diferentes en la misma fila. En el ejemplo siguiente se muestra cómo agregar datos a nuestra tabla de clasificación
con el SDK de C#.

```C# theme={null}
public static async Task UpdateLeaderboardForPlayer(PlayFabAuthenticationContext context, string leaderboardName, string entityId, int score)
{
    PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
    UpdateLeaderboardEntriesRequest updateLeaderboardRequest = new UpdateLeaderboardEntriesRequest()
    {
        Entries = new List<LeaderboardEntryUpdate>()
        {
            new LeaderboardEntryUpdate()
            {
                EntityId = entityId,
                Scores = new List<string> { score.ToString(), (score + 1).ToString(), (score + 2).ToString() },
                Metadata = "metadata",
            }
        },
        AuthenticationContext = context,
        LeaderboardName = leaderboardName,
    };

    PlayFabResult<PlayFab.LeaderboardsModels.EmptyResponse> updateResult = await leaderboardsAPI.UpdateLeaderboardEntriesAsync(updateLeaderboardRequest);
}
```

Un punto importante que hay que tener en cuenta es que al parámetro Scores se le proporcionan tres valores. La longitud de la lista de puntuaciones especificada para cualquier entrada debe coincidir con el número de columnas de la definición de la tabla de clasificación. Cada uno de los valores debe ser un entero de 64 bits válido (la representación en cadena es solo para garantizar que todos los clientes puedan controlar valores de 64 bits).

## Recuperación de datos de una tabla de clasificación

Ahora vamos a aprender diferentes maneras de consultar una tabla de clasificación. Todas tienen un propósito específico con la intención
de ayudar a los desarrolladores a obtener los jugadores que necesitan para mostrarlos en el juego.

### Obtención de la tabla de clasificación en torno a una entidad

Esta manera concreta de consultar la tabla de clasificación nos permite obtener una sección de la tabla de clasificación cercana a una entidad específica. Una manera práctica
de ver este escenario es cuando tenemos una tabla de clasificación enorme y solo queremos mostrar información relevante para el jugador que está activo
en el juego. Si el jugador está en la posición 1000, podemos mostrar los vecinos cercanos en lugar de los mejores jugadores.
En el ejemplo siguiente se muestra cómo consultar una tabla de clasificación en torno a una entidad con el SDK de C#.

```C# theme={null}
public static async Task<List<EntityLeaderboardEntry>> GetLeaderboardAroundEntity(PlayFabAuthenticationContext context, string leaderboardName, string entityId)
{
    PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
    GetLeaderboardAroundEntityRequest getLbRequest = new GetLeaderboardAroundEntityRequest()
    {
        LeaderboardName = leaderboardName,
        AuthenticationContext = context,
        Entity = new PlayFab.LeaderboardsModels.EntityKey()
        {
            Id = entityId,
            Type = EntityType
        },
        MaxSurroundingEntries = 20,
    };

    PlayFabResult<GetEntityLeaderboardResponse> lbResponse = await leaderboardsAPI.GetLeaderboardAroundEntityAsync(getLbRequest);
    
    return lbResponse.Result.Rankings;

}
```

El elemento más importante aquí es `MaxSurroundingEntries`, que nos permite extraer entidades clasificadas en torno a una entidad específica
de la tabla de clasificación. Por ejemplo, si tenemos un jugador en la posición 100 y usamos
`MaxSurroundingEntries` = 20, entonces se recuperan los jugadores desde la posición 90 hasta la 110. Si el jugador está en la parte superior
de la tabla de clasificación, se recuperan los 20 primeros resultados. Si el jugador está en la parte inferior, se recuperan los últimos 20 resultados. Salvo en las posiciones de la parte superior e inferior de la tabla de clasificación, la API intenta garantizar que la entidad en torno a la cual se solicita la clasificación esté en el centro de las posiciones recuperadas.

### Obtención de la tabla de clasificación para entidades

Esta API nos ofrece otra manera de consultar la tabla de clasificación. Funciona para los casos en los que queremos buscar varias entidades dentro de
la tabla de clasificación y ordenarlas. En el ejemplo siguiente se muestra cómo consultar una tabla de clasificación para una lista de entidades
con el SDK de C#.

```C# theme={null}
public static async Task<List<EntityLeaderboardEntry>> GetLeaderboardForEntities(PlayFabAuthenticationContext context, string leaderboardName, List<string> entityIds)
{
    PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
    GetLeaderboardForEntitiesRequest getLbRequest = new GetLeaderboardForEntitiesRequest()
    {
        LeaderboardName = leaderboardName,
        AuthenticationContext = context,
        EntityIds = entityIds,
    };

    PlayFabResult<GetEntityLeaderboardResponse> lbResponse = await leaderboardsAPI.GetLeaderboardForEntitiesAsync(getLbRequest);

    return lbResponse.Result.Rankings;
}
```

### Obtención de tablas de clasificación de amigos

Podría haber casos en los que algunos jugadores ocasionales lleguen y jueguen a un juego. Puede que estén lejos de la parte superior de la tabla de clasificación, pero entre sus amigos tienen una competición en marcha. Con esta API, podemos consultar la tabla de clasificación y encontrar a los amigos del jugador.

```C# theme={null}
public static async Task<List<EntityLeaderboardEntry>> GetFriendLeaderboardForEntity(PlayFabAuthenticationContext context, string leaderboardName, string entityId)
{
    PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
    GetFriendLeaderboardForEntityRequest getLbRequest = new GetFriendLeaderboardForEntityRequest()
    {
       LeaderboardName = leaderboardName,
       Entity = new PlayFab.LeaderboardsModels.EntityKey()
       {
           Id = entityId,
           Type = EntityType
       },
    };

    PlayFabResult<GetEntityLeaderboardResponse> lbResponse = await leaderboardsAPI.GetFriendLeaderboardForEntityAsync(getLbRequest);
  
    return lbResponse.Result.Rankings;
}
```

Hay varias maneras de obtener amigos de los servicios de PlayFab. Para obtener más información sobre los parámetros disponibles, consulte la [Referencia de la API](/services/playfab/community/leaderboards/api-reference).

### Desempate mejorado

Considerando nuestro ejemplo de un shooter altamente competitivo, hay casos en los que varios jugadores podrían tener el mismo número de
eliminaciones. Para esos escenarios, necesitamos una manera diferente de desempatar esos casos. Este escenario es donde entra en juego la funcionalidad
de desempate mejorado.

Cuando crea una definición de tabla de clasificación, puede tener varias columnas. La manera en que las agrega determina cómo vamos a
ordenar y desempatar algunos escenarios. Hay un orden de prioridad, en el que la primera columna agregada es la más importante, luego la segunda,
y así sucesivamente. Trasladado a nuestro ejemplo, esto significa que cuando hay un empate en eliminaciones, el segundo criterio es el número de asistencias,
y el criterio final son las muertes. En el caso extremo de que el empate persista, se recurre de forma predeterminada a la marca de tiempo:
quien logró las puntuaciones primero.

\| Posición     | Entity Id                         | Eliminations|  Assists        | Deaths | LastUpdated\
\|----------------------|------------------------------------|-------------------|--------------------------
|1 | "player 3" | 103               |24 | 15|"2024-08-27T20:24:36.738Z"
|2 | "player 2" | 102               | 30| 20 |"2024-08-27T20:24:29.251Z"
|3 | **"player 1"** | 100               | 25 |18 |"2024-08-27T19:52:26.642Z"\
|4 | **"player 4"** | 100               | 25 | 18 |"2024-08-27T20:24:44.552Z"
|4 | **"player 5"** | 100               | 25 | 19 |"2024-08-27T20:25:47.552Z"

En este ejemplo, tenemos un empate entre tres jugadores:

* "player 5": a pesar de tener la misma cantidad de eliminaciones y asistencias, tiene más muertes, lo que significa que está en la
  parte inferior de la tabla de clasificación.
* "player 4": este jugador tiene menos muertes que "player 5" y la misma cantidad que "player 1", pero player 1 obtuvo estos números primero.
* "player 1": a pesar de tener los mismos números que "player 4", este jugador fue el primero en lograr esta puntuación en el juego, por lo que se clasifica más alto en este escenario de desempate.

## Conclusiones

En este tutorial, aprendimos a realizar las siguientes operaciones:

* Crear una tabla de clasificación de varias columnas.
* Conocer las múltiples maneras de realizar consultas.
* Comprender el mecanismo de desempate mejorado.

## Consulte también

* [Creación de una tabla de clasificación básica](/services/playfab/community/leaderboards/create-basic-leaderboard).
* [Tablas de clasificación de temporada](/services/playfab/community/leaderboards/seasonal-leaderboards).
* [Límites](/services/playfab/community/leaderboards/limits-leaderboards).
* [Cuota](/services/playfab/community/leaderboards/quota-leaderboards).
* [Clasificación de jugadores por estadísticas](/services/playfab/community/leaderboards/leaderboards-linked-to-stats).
* [Tablas de clasificación de grupos](/services/playfab/community/leaderboards/group-leaderboards).
* [Niveles manuales](/services/playfab/community/leaderboards/manual-tiers).
* [Adición de datos adicionales a las tablas de clasificación](/services/playfab/community/leaderboards/metadata-leaderboards).
* [Referencia de la API](/services/playfab/community/leaderboards/api-reference).
* [Tablas de clasificación y CloudScript](/services/playfab/community/leaderboards/leaderboards-cloudscript).
* [Tablas de clasificación con PlayStream](/services/playfab/community/leaderboards/leaderboards-with-playstream-and-telemetry)


## Related topics

- [Adición de datos contextuales a las tablas de clasificación](/es/services/playfab/community/leaderboards/metadata-leaderboards.md)
- [Límites de las tablas de clasificación](/es/services/playfab/community/leaderboards/limits-leaderboards.md)
- [Tablas de clasificación de grupos](/es/services/playfab/community/leaderboards/group-leaderboards.md)
- [Tablas de clasificación de temporada](/es/services/playfab/community/leaderboards/seasonal-leaderboards.md)
- [Cuota de tablas de clasificación](/es/services/playfab/community/leaderboards/quota-leaderboards.md)
