> ## 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.

# Aller plus loin avec les classements

> Fonctionnalités avancées des classements PlayFab : créez des classements à plusieurs colonnes, utilisez le départage amélioré et les entités externes, et interrogez les classements autour d'un joueur.

Dans ce tutoriel, nous allons aborder les fonctionnalités avancées offertes par le service, comme la création de classements
à plusieurs colonnes, le départage amélioré et les différentes manières d'interroger le classement.

Pour cet exemple, nous partons du principe que tout ce qui est présenté dans [Créer un classement de base](/fr/services/playfab/community/leaderboards/create-basic-leaderboard)
vous est familier. Nous allons prendre l'exemple d'un jeu de tir très compétitif pour montrer comment ces nouvelles fonctionnalités peuvent nous aider à résoudre
certains problèmes. Ce jeu propose un mode appelé Team Death match, dans lequel deux équipes s'affrontent. La première à atteindre
75 éliminations gagne. Ce jeu ne se base pas sur un score unique pour classer les joueurs ; il se base plutôt sur le nombre
d'éliminations, d'assistances et de morts pour déterminer qui est le meilleur.

## Création d'une définition de classement à plusieurs colonnes

Pour commencer cet exemple, nous devons créer une définition de classement plus complexe que celle que nous avions auparavant.
Nous allons définir plusieurs colonnes pour représenter les aspects clés du jeu : les éliminations, les assistances et les morts.
L'exemple suivant montre comment créer la définition de classement à l'aide du SDK 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);
}
```

Expliquons maintenant quelques éléments clés de cet exemple :

* `SizeLimit` : ce paramètre sert à limiter le nombre de lignes que le classement peut comporter. La valeur indiquée ici n'est qu'un exemple.
* `VersionConfiguration` : ce paramètre nous permet de gérer des versions de nos classements. Pour plus d'informations, consultez
  cette page : [Classements saisonniers](/fr/services/playfab/community/leaderboards/seasonal-leaderboards)
* `Columns` : ce paramètre nous permet de définir plusieurs colonnes, avec un maximum de 5 par définition. Comme vous pouvez le voir, nous avons configuré Eliminations, Assists et Deaths.
  Un élément important ici est le paramètre `SortDirection`, qui nous permet de déterminer le tri du classement.
  Dans cet exemple, un joueur est mieux classé s'il a plus d'éliminations et d'assistances (SortDirection = Descending) et
  moins de morts (SortDirection = Ascending).

Pour plus d'informations sur les autres paramètres ou sur la gestion des définitions de classement, consultez [Créer un classement de base](/fr/services/playfab/community/leaderboards/create-basic-leaderboard).

## Utiliser des entités externes

Le service Leaderboard peut être utilisé comme composant autonome et prend en charge l'utilisation d'entités externes qui n'ont de sens que dans le contexte du jeu. Si les identités de vos joueurs ne sont pas liées à la connexion PlayFab, vous pouvez quand même utiliser le service Leaderboards. Le type d'entité des entrées du classement extérieures au système PlayFab doit être *external*. L'entityId correspond alors à l'identité du joueur dans votre système. Dans ces cas, *toutes* les entrées du classement doivent être des entités *external*.

## Ajout de données à un classement

Maintenant que notre classement est créé, nous allons ajouter des données. La principale différence par rapport à notre précédent tutoriel sur ce sujet est
que nous devons désormais ajouter trois scores différents dans la même ligne. L'exemple suivant montre comment ajouter des données à notre classement
à l'aide du SDK 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);
}
```

Il est important de noter que le paramètre Scores reçoit trois valeurs. La longueur de la liste des scores spécifiée pour une entrée doit correspondre au nombre de colonnes de la définition de classement. Chacune des valeurs doit être un entier 64 bits valide (la représentation sous forme de chaîne sert uniquement à garantir que tous les clients peuvent gérer des valeurs 64 bits).

## Récupération des données d'un classement

Nous allons maintenant découvrir différentes manières d'interroger un classement. Chacune a un objectif spécifique, dans le but
d'aider les développeurs à obtenir les joueurs dont ils ont besoin pour les afficher dans le jeu.

### Obtention du classement autour d'une entité

Cette manière particulière d'interroger le classement nous permet d'obtenir une section du classement proche d'une entité spécifique. Un cas
concret de ce scénario est celui d'un classement très volumineux où nous voulons uniquement afficher des informations pertinentes pour le joueur actif
dans le jeu. Si le joueur est en position 1000, nous pouvons afficher ses voisins proches plutôt que les meilleurs joueurs.
L'exemple suivant montre comment interroger un classement autour d'une entité à l'aide du SDK 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;

}
```

L'élément le plus important ici est `MaxSurroundingEntries`, qui nous permet d'extraire du classement les entités classées autour d'une entité
spécifique. Par exemple, si un joueur est en position 100 et que nous utilisons
`MaxSurroundingEntries` = 20, les joueurs de la position 90 à la position 110 sont récupérés. Si le joueur est en tête
du classement, les 20 premiers résultats sont récupérés. Si le joueur est en bas du classement, les 20 derniers résultats sont récupérés. Sauf pour les positions en haut et en bas du classement, l'API tente de faire en sorte que l'entité autour de laquelle le classement est demandé se trouve au centre des positions récupérées.

### Obtention du classement pour des entités

Cette API nous offre une autre manière d'interroger le classement. Elle convient aux cas où nous voulons rechercher plusieurs entités dans
le classement et les trier. L'exemple suivant montre comment interroger un classement pour une liste d'entités
à l'aide du SDK 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;
}
```

### Obtention des classements d'amis

Il peut arriver que des joueurs occasionnels viennent jouer à un jeu. Ils peuvent être loin du haut du classement, mais une compétition est engagée entre eux et leurs amis. Avec cette API, nous pouvons interroger le classement et trouver les amis du joueur.

```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;
}
```

Il existe plusieurs manières d'obtenir des amis à partir des services PlayFab. Pour plus d'informations sur les paramètres disponibles, consultez [Référence d'API](/fr/services/playfab/community/leaderboards/api-reference).

### Départage amélioré

Dans notre exemple de jeu de tir très compétitif, il arrive que plusieurs joueurs aient le même nombre
d'éliminations. Pour ces scénarios, nous avons besoin d'une autre manière de départager les joueurs. C'est là qu'intervient la fonctionnalité
de départage amélioré.

Lorsque vous créez une définition de classement, vous pouvez avoir plusieurs colonnes. L'ordre dans lequel vous les ajoutez détermine la manière dont nous allons
trier et départager certains scénarios. Il existe un ordre de priorité : la première colonne ajoutée est la plus importante, puis la deuxième,
et ainsi de suite. Dans notre exemple, cela signifie qu'en cas d'égalité d'éliminations, le deuxième critère est le nombre d'assistances,
et le dernier critère est le nombre de morts. Dans le cas extrême où l'égalité persiste, l'horodatage est utilisé par défaut :
celui qui a obtenu les scores en premier l'emporte.

\| Rang     | ID d'entité                         | Éliminations|  Assistances        | Morts | Dernière mise à jour\
\|----------------------|------------------------------------|-------------------|--------------------------
|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"

Dans cet exemple, trois joueurs sont à égalité :

* « player 5 » : bien qu'il ait le même nombre d'éliminations et d'assistances, il a plus de morts, ce qui signifie qu'il se trouve en
  bas du classement.
* « player 4 » : ce joueur a moins de morts que « player 5 » et autant que « player 1 », mais player 1 a obtenu ces résultats en premier.
* « player 1 » : bien qu'il ait les mêmes résultats que « player 4 », ce joueur a été le premier à obtenir ce score dans le jeu ; il est donc mieux classé dans ce scénario de départage.

## Conclusions

Dans ce tutoriel, nous avons appris à effectuer les opérations suivantes :

* Créer un classement à plusieurs colonnes.
* Découvrir les différentes manières d'interroger un classement.
* Comprendre le mécanisme de départage amélioré.

## Voir aussi

* [Créer un classement de base](/fr/services/playfab/community/leaderboards/create-basic-leaderboard).
* [Classements saisonniers](/fr/services/playfab/community/leaderboards/seasonal-leaderboards).
* [Limites ](/fr/services/playfab/community/leaderboards/limits-leaderboards).
* [Quota ](/fr/services/playfab/community/leaderboards/quota-leaderboards).
* [Classement des joueurs par statistiques](/fr/services/playfab/community/leaderboards/leaderboards-linked-to-stats).
* [Classements de groupe](/fr/services/playfab/community/leaderboards/group-leaderboards).
* [Niveaux manuels](/fr/services/playfab/community/leaderboards/manual-tiers).
* [Ajouter des données supplémentaires aux classements](/fr/services/playfab/community/leaderboards/metadata-leaderboards).
* [Référence d'API](/fr/services/playfab/community/leaderboards/api-reference).
* [Classements et CloudScript](/fr/services/playfab/community/leaderboards/leaderboards-cloudscript).
* [Classements avec PlayStream](/fr/services/playfab/community/leaderboards/leaderboards-with-playstream-and-telemetry)


## Related topics

- [XR-013 Liaison des comptes Microsoft avec les comptes d'éditeur](/fr/publishing/certification/xr/xr-013.md)
- [Cas de test les plus souvent en échec](/fr/publishing/certification/xr-top-failing.md)
- [Exigences XBOX testées lors de la certification pour les jeux sur console XBOX](/fr-CA/publishing/certification/console-cert-tested-requirements.md)
- [Guide des BVT de certification pour console](/fr-CA/publishing/game-publishing/concepts/certification/certification-console-bvt-guide.md)
- [XR-014 Données des joueurs et informations personnelles](/fr/publishing/certification/xr/xr-014.md)
