# Créer un classement

> Classez les joueurs selon leur meilleur score ou leur meilleur temps et affichez un Top partagé entre appareils. Découvrez quand un score local suffit, quand un classement partagé est nécessaire, et comment le construire avec Firebase dans PandaSuite.

https://docs.pandasuite.com/fr/essentials/gamification/leaderboard/

**Un classement ordonne les joueurs selon un résultat (un meilleur score, du plus grand au plus petit, ou un meilleur temps, du plus petit au plus grand) et affiche à tous le même Top. Ce guide explique quand un classement est nécessaire et comment le construire avec PandaSuite et Firebase.**

#### Dans ce guide

- Score local ou classement partagé
- Prérequis
- Capturer un résultat à la fin du niveau ou du quiz
- Compiler et trier les résultats
- Afficher le Top et « Votre score »
- Alternative : stocker les résultats dans Airtable

## Score local ou classement partagé

Avant toute chose, choisissez l'expérience dont vous avez besoin :

- **Score local (un seul appareil).** Le score est stocké et affiché uniquement sur l'appareil du joueur, par exemple dans une [variable](https://docs.pandasuite.com/fr/essentials/data/variables/) ou la base de données PandaSuite. Cela suffit pour montrer à un joueur son meilleur score ou pour déclencher un scénario, mais chaque joueur ne voit que ses propres résultats. Voir [Score](https://docs.pandasuite.com/fr/essentials/gamification/score/).
- **Classement partagé (entre appareils).** Les résultats de chaque joueur sont envoyés vers une source centrale, compilés, triés et affichés sous forme de classement commun. C'est ce qu'il faut pour un Top public, un concours ou une course contre la montre qui compare les joueurs.

La suite de ce guide construit un classement partagé avec **Firebase**. Si vous préférez un backend plus simple, sans comptes utilisateurs, voir l'alternative Airtable à la fin.

## Prérequis

- Un projet Firebase connecté via **Session Firebase**, ainsi qu'un formulaire **Authentification** pour associer chaque résultat à une identité utilisateur. Voir [Créer un projet Firebase](https://docs.pandasuite.com/fr/essentials/integrations/create-a-firebase-project/) et [Sauvegarder des données utilisateurs dans Firebase](https://docs.pandasuite.com/fr/essentials/integrations/save-user-data-in-firebase/).
- Un moyen de mesurer le résultat à classer : un score que vous incrémentez ou un chronomètre que vous arrêtez à la fin du niveau. Voir [Score](https://docs.pandasuite.com/fr/essentials/gamification/score/).

## Capturer un résultat à la fin du niveau ou du quiz

1. À la fin du niveau ou du quiz, calculez la valeur à classer (un `score` final ou un `timeMs`) et stockez-la dans une variable. Voir [Score](https://docs.pandasuite.com/fr/essentials/gamification/score/).
2. Sur le déclencheur de fin, ajoutez l'action **Agir sur une base de données** > **Session Firebase** > **Modifier la donnée**, pour enregistrer le résultat (et la meilleure valeur du joueur) dans son document utilisateur.

## Compiler et trier les résultats

> **Note**
>
> Par défaut, les règles de **Session Firebase** limitent chaque joueur à son propre document `users/{uid}` : l'app ne peut donc pas lire les scores des autres joueurs. Le classement est construit dans un document `leaderboards` partagé en lecture publique, tenu à jour par une étape côté serveur (une automatisation ou une Cloud Function) plutôt que sur chaque appareil.

Mettez en place une automatisation telle que **Make (Integromat)**, **Zapier** ou une Cloud Function pour tenir le classement à jour :

1. À la fin du niveau, PandaSuite envoie le résultat à l'automatisation via le composant [HTTP](https://docs.pandasuite.com/fr/essentials/components/http/) ou un webhook (`alias`, `score`, `levelId`, `finishedAt`).
2. L'automatisation ajoute ce nouveau résultat à l'ensemble des résultats déjà enregistrés.
3. Elle trie l'ensemble, du meilleur au moins bon (score décroissant, temps croissant), et ne conserve que le Top N.
4. Elle enregistre ce Top N dans un seul document `leaderboards` que l'app lit pour afficher le classement.

Voir [Se connecter à Make (Integromat)](https://docs.pandasuite.com/fr/essentials/integrations/connect-to-make-integromat/).

## Afficher le Top et « Votre score »

- Insérez un composant [Collection](https://docs.pandasuite.com/fr/essentials/data/collection/) et liez-le au Top trié. Dans le modèle d'élément, liez des blocs de texte à `alias` et `score`.
- Pour contrôler l'ordre dans l'app, utilisez [Trier une collection](https://docs.pandasuite.com/fr/essentials/data/sort-a-collection/) (Décroissant pour les meilleurs scores, Croissant pour les meilleurs temps).
- Pour toujours afficher au joueur son propre résultat même hors du Top, liez un bloc de texte distinct à son meilleur résultat, depuis les données de **Session Firebase**.

### Vérifier le flux

- Jouez un niveau ou un quiz, terminez-le et confirmez que le résultat atteint Firestore.
- Vérifiez que le Top compilé se met à jour.
- Ouvrez l'écran du classement : vous devez voir un Top trié et votre propre meilleur résultat, même hors du Top N.

## Alternative : stocker les résultats dans Airtable

Si vous n'avez pas besoin de comptes utilisateurs, Airtable est plus simple à configurer et à modérer manuellement :

1. Créez une table avec une ligne par résultat (`alias`, `score`, `levelId`, `finishedAt`).
2. Enregistrez chaque résultat depuis l'app avec le composant [HTTP](https://docs.pandasuite.com/fr/essentials/components/http/). Pour des écritures sécurisées, passez par une automatisation ou un proxy plutôt que d'exposer une clé d'écriture dans l'app.
3. Affichez la table avec un composant [Collection](https://docs.pandasuite.com/fr/essentials/data/collection/). Airtable peut renvoyer des enregistrements déjà triés et limités via son API : vous pouvez donc souvent vous passer du tri côté serveur.

Voir [Se connecter à Airtable](https://docs.pandasuite.com/fr/essentials/integrations/connect-to-airtable/).

## Voir aussi

- [Score](https://docs.pandasuite.com/fr/essentials/gamification/score/)
- [Trier une collection](https://docs.pandasuite.com/fr/essentials/data/sort-a-collection/)
- [Sauvegarder des données utilisateurs dans Firebase](https://docs.pandasuite.com/fr/essentials/integrations/save-user-data-in-firebase/)
- [Se connecter à Airtable](https://docs.pandasuite.com/fr/essentials/integrations/connect-to-airtable/)
