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 :
- Utiliser
argvpour configurer le héros. - Utiliser des Pointeurs pour gérer la vie et le mana (modification à distance).
- Utiliser un Tableau pour garder un historique des coups.
- Utiliser
scanfpour 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[]) :
- Vérifiez qu'il y a bien 3 arguments (Programme + Nom + PV). Sinon, quittez avec un message d'erreur.
- Récupérez le nom du héros (c'est une chaîne, facile :
argv[1]). - Récupérez les PV du héros. Attention :
argv[2]est une chaîne ("50"). Utilisezsscanfpour le convertir enint. - 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¶
- 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¶
- Coût : 10 points de mana.
- Effet : Rajoute 15 PV au lanceur.
C. Le coup du monstre¶
- 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.
- Déclarez un tableau
int historique[5] = {0, 0, 0, 0, 0};dans lemain. - À 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".
- 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
- 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 :
- Affichez l'état du combat :
- "Gandalf (45 PV | 20 Mana) VS Troll (90 PV)"
- 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)
- Récupérez le choix avec
scanf. - Appelez la fonction correspondante en envoyant les adresses (
&pv_monstre, etc.). - 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