Skip to content

Mini-Projet C : Le Duel des Sorciers

Contexte

Vous êtes un apprenti sorcier. Vous entrez dans l'arène pour affronter le terrible Troll des Montagnes. Votre mission : Programmer le moteur de combat de ce jeu.

Objectifs techniques :

  1. Utiliser argv pour configurer le héros.
  2. Utiliser des Pointeurs pour gérer la vie et le mana (modification à distance).
  3. Utiliser un Tableau pour garder un historique des coups.
  4. Utiliser scanf pour les choix du joueur.

Étape 1 : L'Invocation (Arguments du main)

Le programme doit être lancé depuis le terminal avec le nom du héros et ses points de vie (PV) de départ. Exemple : ./duel Gandalf 50

Dans le main(int argc, char *argv[]) :

  1. Vérifiez qu'il y a bien 3 arguments (Programme + Nom + PV). Sinon, quittez avec un message d'erreur.
  2. Récupérez le nom du héros (c'est une chaîne, facile : argv[1]).
  3. Récupérez les PV du héros. Attention : argv[2] est une chaîne ("50"). Utilisez sscanf pour le convertir en int.
  4. Le monstre, lui, aura toujours 100 PV au départ.

Étape 2 : La Magie des Pointeurs (Le Cœur du jeu)

C'est ici que ça se corse. Les variables pv_heros, pv_monstre et mana_heros sont déclarées dans le main. Mais les combats se passent dans des fonctions !

Vous devez écrire les fonctions suivantes (remarquez les étoiles *) :

A. L'attaque de base

void boule_de_feu(int *pv_cible, int *mana_lanceur);
  • Coût : 5 points de mana.
  • Effet : Enlève 10 PV à la cible.
  • Logique : La fonction doit vérifier si le lanceur a assez de mana.
    • Si oui : on décrémente le mana (via le pointeur), on décrémente les PV de la cible (via le pointeur), et on affiche "Boule de feu lancée !".
    • Si non : on affiche "Pas assez de mana !" et on ne fait rien.

B. Le soin

void soin_divin(int *pv_lanceur, int *mana_lanceur);
  • Coût : 10 points de mana.
  • Effet : Rajoute 15 PV au lanceur.

C. Le coup du monstre

void attaque_troll(int *pv_cible);
  • Effet : Le troll tape fort. Il enlève une valeur aléatoire entre 5 et 15 PV à la cible.
  • Astuce : int degats = (rand() % 11) + 5;

Étape 3 : La Mémoire du Combat (Tableaux)

On veut garder une trace des dégâts infligés par le joueur lors des 5 derniers tours.

  1. Déclarez un tableau int historique[5] = {0, 0, 0, 0, 0}; dans le main.
  2. À chaque fois que le joueur attaque, enregistrez les dégâts dans la case historique[tour % 5].
    • Explication : Si on est au tour 0, on écrit dans la case 0. Au tour 5, on revient écrire dans la case 0 (grâce au modulo %). Cela crée un "buffer circulaire".
  3. Ajoutez une option dans le menu pour "Voir l'historique".

Étape 4 : La Boucle de Jeu (Interaction)

Dans le main, créez une boucle while qui tourne tant que les deux combattants sont vivants (PV > 0).

À chaque tour :

  1. Affichez l'état du combat :
    • "Gandalf (45 PV | 20 Mana) VS Troll (90 PV)"
  2. Proposez un menu :
    • Boule de Feu (Coût 5)
    • Soin Divin (Coût 10)
    • Voir historique
    • Boire une potion de mana (Rend 20 mana, n'utilise pas de tour)
  3. Récupérez le choix avec scanf.
  4. Appelez la fonction correspondante en envoyant les adresses (&pv_monstre, etc.).
  5. Si le joueur a attaqué ou s'est soigné, c'est au tour du Troll d'attaquer (appelez attaque_troll).

Étape 5 : Fin de partie

Quand la boucle s'arrête :

  • Si le héros a <= 0 PV : Affichez "VOUS ÊTES MORT... Le Troll vous mange."
  • Si le Troll a <= 0 PV : Affichez "VICTOIRE ! Le Troll s'effondre."

Annexe : Squelette de code pour démarrer

Pour vous aider à structurer, voici comment démarrer le fichier :

#include <stdio.h>
#include <stdlib.h> // pour atoi et rand
#include <time.h>   // pour initialiser le hasard

// Prototypes (Déclarations)
void boule_de_feu(int *pv_cible, int *mana_lanceur);
// ... ajoutez les autres ...

int main(int argc, char *argv[]) {
    // 0. Initialiser le hasard
    srand(time(NULL));

    // 1. Vérifier arguments et setup
    if (argc != 3) {
        printf("Usage: ./duel <Nom> <PV>\n");
        return 1;
    }

    // Vos variables
    char *nom_heros = argv[1];
    int pv_heros = atoi(argv[2]);
    int mana_heros = 50; // Mana fixe au départ
    int pv_troll = 100;

    int historique[5] = {0};
    int tour = 0;

    printf("--- DEBUT DU COMBAT ---\n");
    printf("%s entre dans l'arène avec %d PV !\n", nom_heros, pv_heros);

    // 2. Boucle de jeu
    while (pv_heros > 0 && pv_troll > 0) {
        // A VOUS DE JOUER ICI !

        // N'oubliez pas d'incrémenter le tour à la fin : tour++;
    }

    return 0;
}

// Implémentez vos fonctions ici
void boule_de_feu(int *pv_cible, int *mana_lanceur) {
    // ... code ...
}

Sujet rédigé à l'aide de ChatGPT et Gemini