Spécifications - Partie 1

Structure Player et gestion d’un tableau statique de joueurs
Objectifs
  • Comprendre la structure de base et l’organisation des fichiers dans le projet
  • Créer la structure de données Player et implémenter les fonctions de base pour manipuler un tableau statique de joueurs (ajout, recherche, suppression, tri).
Ressources
  • Cours sur les structures en C
  • Documentation sur la gestion de la mémoire dynamique (malloc, free)
  • Références sur les fonctions de manipulation de chaînes (strncpy, strcmp)
Livrables attendus avant la séance 2

Ces fichiers existent déjà dans le template et sont à compléter (ne pas les renommer ni les déplacer, et compléter uniquement les fonctions de la Partie 1) :

src/
├── player.c          # À compléter : fonctions de gestion des joueurs
└── array-utils.c     # À compléter : fonctions de manipulation du tableau

1 Structure du joueur à implémenter

Dans Fork Knight, chaque joueur possède :

  • Un pseudo (identifiant)
  • Un niveau (expérience)
  • Un Spicy Index (force relative)
  • Des statistiques (parties, victoires, défaites)
  • Un état (en file d’attente ou non)

Fichier : headers/player.h

typedef struct {
    char username[30];      // Pseudo du joueur
    int level;              // Niveau (1-100)
    int spicyIndex;         // Score de compétence
    int numGames;           // Total de parties
    int numWins;            // Victoires
    int numLosses;          // Défaites
    int inQueue;            // En file ? (0=non, 1=oui)
} Player;

2 Fonctions à implémenter

2.1 Création d’un joueur

Player* createPlayer(const char* username);

Description :
Crée dynamiquement un nouveau joueur dont l’username est username. Initialise level à 1, spicyIndex à 1000, et tous les autres champs à zéro. Retourne un pointeur vers le joueur créé. Retourne NULL en cas d’échec d’allocation ou si username est NULL.

Indications
  • Penser à inclure les bibliothèques nécessaires : <stdlib.h>, <string.h>
  • Bien vérifier que l’allocation réussit avant de continuer
  • Utilisez strncpy() pour copier le username dans la structure de manière sécurisée

2.2 Libération d’un joueur

void destroyPlayer(Player* player);

Description :
Libère la mémoire allouée pour le joueur pointé par player. Ne fait rien si player est NULL.


2.3 Affichage détaillé d’un joueur

void displayPlayer(const Player* player);

Description :
Affiche toutes les informations détaillées d’un joueur. Ne fait rien si player est NULL.

Format suggéré :

==========================================
Player: ForkMaster
Level: 10 | Spicy Index: 1200
Games: 0 | Wins: 0 | Losses: 0
In Queue: No
==========================================

2.4 Affichage condensé d’un joueur

void displayPlayerMini(const Player* player);

Description :
Affiche une version condensée des informations du joueur (le nom, le niveau et le spicy index) sur une seule ligne. Ne fait rien si player est NULL.

Format suggéré :

[ForkMaster | Lvl: 10 | SI: 1200]

2.5 Ajouter un joueur au tableau statique de pointeurs sur joueurs

int addPlayer(Player* players[], int* count, Player* player);

Description :
Ajoute le joueur player à un tableau statique de joueurs players si la capacité maximale MAX_PLAYERS (100) n’est pas atteinte. Le paramètre count indique le nombre actuel de joueurs dans le tableau et sera incrémenté si l’ajout réussit. Retourne 1 si l’ajout a réussi, 0 sinon.

Indications

La capacité maximale MAX_PLAYERS du tableau statique est définie dans array-utils.h. Vérifiez que *count < MAX_PLAYERS avant d’ajouter.


2.6 Recherche d’un joueur par pseudo

int searchPlayerByUsername(Player* players[], int count, const char* username);

Description : Retourne l’index du joueur dont le pseudo est username dans players, ou -1 s’il n’existe pas. Comparer les noms avec strcmp().


2.7 Suppression d’un joueur

int removePlayer(Player* players[], int* count, const char* username);

Description : Supprime le joueur nommé username s’il existe : trouve son index, libère sa mémoire, décale les éléments vers la gauche, décrémente *count. Retourne 1 si supprimé, sinon 0.


2.8 Tri par Spicy Index (décroissant)

void sortPlayersBySpicyIndex(Player* players[], int count);

Description : Trie players du plus grand au plus petit spicyIndex. Utilisez un tri simple (bulle ou insertion).

Indications

Pensez à utiliser une fonction comparePlayer(const Player*, const Player*) pour simplifier le tri.


2.9 Affichage de tous les joueurs

void displayAllPlayers(Player* players[], int count);

Description : Affiche un en-tête, chaque joueur via displayPlayerMini(), puis le total.

Format suggéré :

=== Liste des joueurs ===
[ForkMaster | Lvl: 10 | SI: 1200]
[SpoonyKnight | Lvl: 5 | SI: 800]
[KnifeLord | Lvl: 15 | SI: 1500]
Total: 3 joueurs