Exercice S
Exercice S
27 novembre 2024
Table des matières
1
3.3 Étape 1 : Initialisation des structures de données . . . . . . . . . . . . . . 12
3.3.1 Question 1 : Déclarez une structure Personnage . . . . . . . . . . 12
3.3.2 Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.4 Étape 2 : Choix des personnages . . . . . . . . . . . . . . . . . . . . . . . 12
3.4.1 Question 1 : Liste des personnages disponibles . . . . . . . . . . . 12
3.4.2 Question 2 : Sélection des personnages . . . . . . . . . . . . . . . 12
3.5 Étape 3 : Mécanique du combat . . . . . . . . . . . . . . . . . . . . . . . 12
3.5.1 Question 1 : Déterminez le premier joueur . . . . . . . . . . . . . 12
3.5.2 Question 2 : Actions possibles . . . . . . . . . . . . . . . . . . . . 12
3.6 Étape 4 : IA simple pour l’adversaire . . . . . . . . . . . . . . . . . . . . 13
3.6.1 Question 1 : Stratégie de l’IA . . . . . . . . . . . . . . . . . . . . 13
3.6.2 Question 2 : Affichage des actions de l’IA . . . . . . . . . . . . . . 13
3.7 Étape 5 : Boucle principale . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.7.1 Question 1 : Structure de la boucle . . . . . . . . . . . . . . . . . 13
3.8 Étape 6 : Extensions optionnelles . . . . . . . . . . . . . . . . . . . . . . 13
3.9 Exemple de menu principal . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.10 Consignes pour les étudiants . . . . . . . . . . . . . . . . . . . . . . . . . 14
2
5.7 Étape 5 : Entraîner le réseau sur le problème XOR . . . . . . . . . . . . 21
5.7.1 Question 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.7.2 Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.8 Étape 6 : Sauvegarde et chargement du modèle . . . . . . . . . . . . . . 22
5.8.1 Question 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.8.2 Question 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.9 Étape 7 : Tester le réseau . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.10 Extensions optionnelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.11 Critères d’évaluation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3
8.3.1 Question 2 : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
8.3.2 Exercice : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
8.4 Étape 3 : Construction des bâtiments . . . . . . . . . . . . . . . . . . . . 32
8.4.1 Question 3 : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
8.4.2 Exercice : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
8.5 Étape 4 : Boucle de jeu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
8.5.1 Question 4 : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
8.5.2 Exercice : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
8.6 Étape 5 : Victoire et défaite . . . . . . . . . . . . . . . . . . . . . . . . . 33
8.6.1 Question 5 : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
8.6.2 Exercice : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
8.7 Étape 6 : Extensions optionnelles . . . . . . . . . . . . . . . . . . . . . . 34
8.7.1 1. Événements aléatoires : . . . . . . . . . . . . . . . . . . . . . . 34
8.7.2 Exercice : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
8.7.3 2. Gestion des taxes et des politiques : . . . . . . . . . . . . . . . 34
8.7.4 Exercice : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
8.7.5 3. Gestion avancée : . . . . . . . . . . . . . . . . . . . . . . . . . . 34
8.8 Objectifs pédagogiques : . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
9 Jeu du Démineur 35
9.1 Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
9.2 Étape 1 : Représentation du terrain . . . . . . . . . . . . . . . . . . . . . 35
9.2.1 Question 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
9.2.2 Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
9.3 Étape 2 : Initialisation du terrain . . . . . . . . . . . . . . . . . . . . . . 36
9.3.1 Question 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
9.3.2 Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
9.4 Étape 3 : Interaction avec le joueur . . . . . . . . . . . . . . . . . . . . . 36
9.4.1 Question 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
9.4.2 Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
9.5 Étape 4 : Boucle de jeu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
9.5.1 Question 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
9.5.2 Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
9.6 Étape 5 : Conditions de victoire et défaite . . . . . . . . . . . . . . . . . 37
9.6.1 Question 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
9.6.2 Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
9.7 Étape 6 : Extensions optionnelles . . . . . . . . . . . . . . . . . . . . . . 38
9.7.1 1. Niveau de difficulté . . . . . . . . . . . . . . . . . . . . . . . . 38
9.7.2 Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
9.7.3 2. Chronomètre . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
9.7.4 Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
9.7.5 3. Sauvegarde et reprise . . . . . . . . . . . . . . . . . . . . . . . 38
9.7.6 Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
9.8 Objectifs pédagogiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4
Chapitre 1
1.1 Introduction
Ce document présente les consignes générales pour la réalisation des projets. Il est
important de suivre ces recommandations afin de garantir la qualité et la pertinence de
votre travail.
5
• Nomination des Variables et Fonctions : Utilisez des noms explicites pour
vos variables et fonctions. Par exemple, préférez ‘compteur‘ à ‘x‘, afin de clarifier
leur rôle.
• Commentaires : Commentez votre code de manière judicieuse, en expliquant le
pourquoi des choix faits, plutôt que le quoi.
• Gestion des Erreurs : Implémentez une gestion des erreurs adéquate pour ga-
rantir la stabilité de votre programme face à des entrées inattendues.
• Optimisation : Bien que la lisibilité soit primordiale, gardez à l’esprit l’optimisa-
tion de votre code lorsque cela est nécessaire. La simplicité peut souvent améliorer
les performances.
1.7 Évaluation
L’évaluation prendra en compte la qualité des implémentations, la gestion des res-
sources (mémoire, complexité) et la clarté du code. Des points supplémentaires seront
attribués pour les enrichissements pertinents et la résolution de projets supplémentaires.
6
Chapitre 2
2.1 Objectif
Créer une application en console permettant de gérer les réservations de places dans
une salle de cinéma. L’application devra inclure :
— La gestion des sièges.
— La prise en compte des catégories de films.
— La facturation des clients.
7
2.3.2 Question 2 : Déclarez une structure Salle
Cette structure doit contenir :
— Un tableau bidimensionnel de Siege représentant les 10 rangées et 12 sièges.
— Une méthode d’initialisation qui affecte aléatoirement une catégorie à chaque siège.
2.3.3 Exercice
1. Écrivez une fonction pour initialiser la salle avec les catégories aléatoires.
2. Affichez en console une représentation de la salle avec l’état des sièges sous forme
de grille (D pour disponible, R pour réservé, O pour occupé).
8
2.6 Étape 4 : Gestion financière
2.6.1 Question 1 : Structure des revenus
Ajoutez une structure pour suivre les revenus générés par catégorie (Standard, Pre-
mium, VIP).
9
2.10 Critères d’évaluation
1. Fonctionnalité : Les fonctions respectent les spécifications.
2. Organisation : Utilisation de structures et modularité du code.
3. Clarté : Noms de variables significatifs, commentaires et lisibilité.
4. Gestion des erreurs : Validation des entrées utilisateur et gestion des cas excep-
tionnels.
10
Chapitre 3
3.1 Résumé
Le but est de créer un jeu où deux personnages s’affrontent dans une arène. Chaque
personnage a des points de vie, de mana (énergie magique), des attaques de base et des
capacités spéciales. Les joueurs choisissent leurs actions tour par tour jusqu’à ce qu’un
gagnant soit déclaré.
11
3.3 Étape 1 : Initialisation des structures de données
3.3.1 Question 1 : Déclarez une structure Personnage
Cette structure doit contenir :
— nom : chaîne de caractères (nom du personnage).
— hp : entier (points de vie).
— mp : entier (points de mana).
— attaque_base : entier (dégâts de l’attaque de base).
— capacite_speciale : entier (dégâts de la capacité spéciale).
— mana_special : entier (mana requis pour la capacité spéciale).
— vitesse : entier (détermine qui joue en premier).
3.3.2 Exercice
1. Implémentez une fonction pour initialiser un personnage avec des valeurs prédéfi-
nies.
2. Affichez en console les caractéristiques du personnage (format clair et lisible).
12
— Si le mana est insuffisant, afficher un message d’erreur.
— Se défendre : Réduit les dégâts reçus au prochain tour de moitié.
Ajoutez une variable booléenne defense_active dans la structure Personnage pour gérer
cet état.
13
3.9 Exemple de menu principal
1. Jouer contre un autre joueur.
2. Jouer contre l’ordinateur.
3. Quitter le jeu.
14
Chapitre 4
Résumé
L’objectif est de créer un programme en console qui permet de gérer une bibliothèque
virtuelle. L’utilisateur peut ajouter des livres, consulter la liste des livres disponibles,
rechercher un livre par différents critères, emprunter et rendre des livres.
15
— id : entier unique pour identifier chaque livre.
— titre : chaîne de caractères.
— auteur : chaîne de caractères.
— genre : chaîne de caractères.
— annee : entier.
— disponible : booléen (indique si le livre est disponible ou emprunté).
Exercice
— Implémentez une fonction pour initialiser un livre avec des données saisies par
l’utilisateur.
— Créez une structure Bibliotheque contenant un tableau de livres et un entier
représentant le nombre de livres.
Exercice
— Affichez un message indiquant si le livre a été ajouté avec succès.
— Gérez le cas où la bibliothèque est pleine.
Question 2
Ajoutez une option pour trier les livres avant de les afficher :
— Par titre (ordre alphabétique).
— Par auteur (ordre alphabétique).
— Par année (ordre croissant).
16
4.5 Étape 4 : Rechercher un livre
Question 1
Implémentez une fonction pour rechercher un livre en fonction d’un critère :
— Par titre.
— Par auteur.
— Par genre.
— Par année.
Exercice
— Affichez les résultats de la recherche ou un message si aucun livre ne correspond.
— Permettez à l’utilisateur de rechercher plusieurs fois sans quitter le menu.
Question 2
Ajoutez une fonction pour rendre un livre :
— Demandez l’identifiant du livre.
— Vérifiez si le livre est actuellement emprunté.
— Si oui, changez son état à disponible = true et affichez un message de confirma-
tion.
17
Question 2
Implémentez une fonction pour charger les livres depuis un fichier texte.
18
Chapitre 5
5.1 Résumé
L’objectif est de construire un réseau de neurones simple en C++, en définissant les
éléments de base (neurones, couches, réseau), puis d’entraîner ce réseau sur un jeu de
données simple, comme la résolution du problème logique XOR.
5.3.2 Question 2
Déclarez une structure Couche contenant :
— int nombre_neurones : nombre de neurones dans cette couche.
— Neuron *neurones : un tableau dynamique de neurones.
19
5.3.3 Exercice
1. Implémentez une fonction pour initialiser une couche en allouant dynamiquement
les neurones et leurs poids. Les poids et les biais doivent être initialisés aléatoirement
entre −1 et 1.
2. Implémentez une fonction pour libérer la mémoire d’une couche.
5.4.2 Question 2
Créez une fonction pour initialiser un réseau de neurones avec les paramètres suivants :
— Nombre de neurones dans chaque couche (tableau passé en paramètre).
— Nombre total de couches.
5.4.3 Exercice
1. Implémentez une fonction pour afficher les poids et biais de chaque neurone.
2. Libérez correctement la mémoire allouée pour les couches et le réseau.
20
5.6 Étape 4 : Implémenter la rétropropagation
5.6.1 Question 1
Ajoutez une fonction pour calculer l’erreur quadratique moyenne (Mean Squared Er-
ror, MSE) :
N
1 X
M SE = (yi − ŷi )2 (5.3)
N i=1
où yi est la sortie réelle et ŷi est la sortie prédite.
5.6.2 Question 2
Implémentez la rétropropagation pour ajuster les poids et les biais :
— Calculez l’erreur pour chaque neurone dans la couche de sortie :
5.7.2 Exercice
— Affichez l’erreur quadratique moyenne après chaque itération.
— Arrêtez l’entraînement lorsque l’erreur descend en dessous de 0, 01.
21
5.8 Étape 6 : Sauvegarde et chargement du modèle
5.8.1 Question 1
Ajoutez une fonction pour sauvegarder les poids et biais dans un fichier texte :
— Chaque ligne doit contenir les poids et le biais d’un neurone.
5.8.2 Question 2
Ajoutez une fonction pour charger un modèle depuis un fichier, en remplaçant les
poids et biais existants.
22
Chapitre 6
Résumé
L’objectif est de construire un réseau de neurones simple en C++, en définissant les
éléments de base (neurones, couches, réseau), puis d’entraîner ce réseau sur un jeu de
données simple, comme la résolution du problème logique XOR.
Concepts couverts
— Structures, tableaux et pointeurs.
— Programmation modulaire.
— Gestion des fichiers pour les poids et les biais.
— Calculs mathématiques (fonction sigmoïde, propagation).
— Boucles et conditionnelles.
Question 2
Déclarez une structure Couche contenant :
— int nombre_neurones : nombre de neurones dans cette couche.
— Neuron *neurones : un tableau dynamique de neurones.
23
Exercice
1. Implémentez une fonction pour initialiser une couche en allouant dynamiquement
les neurones et leurs poids. Les poids et les biais doivent être initialisés aléatoirement
entre −1 et 1.
2. Implémentez une fonction pour libérer la mémoire d’une couche.
Question 2
Créez une fonction pour initialiser un réseau de neurones avec les paramètres suivants :
— Nombre de neurones dans chaque couche (tableau passé en paramètre).
— Nombre total de couches.
Exercice
1. Implémentez une fonction pour afficher les poids et biais de chaque neurone.
2. Libérez correctement la mémoire allouée pour les couches et le réseau.
24
6.4 Étape 4 : Implémenter la rétropropagation
Question 1
Ajoutez une fonction pour calculer l’erreur quadratique moyenne (Mean Squared Er-
ror, MSE) :
N
1 X
M SE = (yi − ŷi )2 (6.3)
N i=1
où yi est la sortie réelle et ŷi est la sortie prédite.
Question 2
Implémentez la rétropropagation pour ajuster les poids et les biais :
— Calculez l’erreur pour chaque neurone dans la couche de sortie :
Exercice
— Affichez l’erreur quadratique moyenne après chaque itération.
— Arrêtez l’entraînement lorsque l’erreur descend en dessous de 0, 01.
25
6.6 Étape 6 : Sauvegarde et chargement du modèle
Question 1
Ajoutez une fonction pour sauvegarder les poids et biais dans un fichier texte :
— Chaque ligne doit contenir les poids et le biais d’un neurone.
Question 2
Ajoutez une fonction pour charger un modèle depuis un fichier, en remplaçant les
poids et biais existants.
Extensions optionnelles
— Ajout d’autres fonctions d’activation : ReLU, Tanh.
— Entraînez le réseau sur un autre problème, comme la reconnaissance de chiffres
(MNIST).
— Visualisation de l’apprentissage : affichez l’évolution de l’erreur quadratique moyenne
sur un graphique.
Critères d’évaluation
— Compréhension des concepts (propagation avant, rétropropagation).
— Modularité et clarté du code.
— Gestion correcte des ressources (allocation dynamique).
— Fonctionnalités supplémentaires ajoutées.
26
Chapitre 7
Ce projet consiste à développer un jeu de puzzle basé sur les règles du Sudoku, avec
un algorithme de résolution automatique. Le jeu se déroulera en plusieurs étapes, allant
de la génération du puzzle à la sauvegarde et au chargement du jeu. Le projet couvre
des concepts comme les tableaux 2D, les algorithmes de backtracking, la validation des
entrées et la gestion de fichiers.
7.1 Introduction
Le jeu de Sudoku est un puzzle logique qui consiste à remplir une grille de 9x9 cases
avec des chiffres de 1 à 9, tout en respectant certaines règles : chaque ligne, chaque colonne,
et chaque région de 3x3 cases doivent contenir les chiffres de 1 à 9 sans répétition. Ce
projet a pour but de créer un jeu de Sudoku en console, avec un solveur automatique
basé sur l’algorithme de backtracking.
27
for ( int j = 0 ; j < 9 ; ++j ) {
sudoku . g r i l l e [ i ] [ j ] = 0 ;
}
}
}
28
sudoku . g r i l l e [ l i g n e ] [ c o l o n n e ] = v a l e u r ;
}
29
7.8 Étape 7 : Boucle du jeu
7.8.1 Menu du jeu
Le menu permet à l’utilisateur de choisir différentes actions : démarrer un nouveau
jeu, résoudre le puzzle automatiquement, sauvegarder ou charger une partie.
void a f f i c h e r M e n u ( ) {
s t d : : cout << " Bienvenue ␣ dans ␣ l e ␣ Jeu ␣ de ␣Sudoku␣ ! " << s t d : : e n d l ;
s t d : : cout << " 1 . ␣Nouveau␣ j e u " << s t d : : e n d l ;
s t d : : cout << " 2 . ␣ R s o u d r e ␣ automatiquement " << s t d : : e n d l ;
s t d : : cout << " 3 . ␣ S a u v e g a r d e r ␣ l e ␣ j e u " << s t d : : e n d l ;
s t d : : cout << " 4 . ␣ Charger ␣ l e ␣ j e u ␣ s a u v e g a r d " << s t d : : e n d l ;
s t d : : cout << " 5 . ␣ Q u i t t e r " << s t d : : e n d l ;
}
7.10 Conclusion
Ce projet implémente un jeu de Sudoku complet avec des fonctionnalités de généra-
tion, de résolution automatique, de validation des entrées, ainsi que de sauvegarde et de
chargement des puzzles. L’interface utilisateur est en mode texte, mais des extensions
graphiques peuvent être ajoutées pour une expérience utilisateur enrichie.
30
Chapitre 8
8.1 Résumé
Dans ce projet, vous allez créer un jeu de gestion de ville en mode console. Le joueur
incarne un maire chargé de développer une ville en équilibrant les ressources, la croissance
démographique et la gestion des infrastructures. L’objectif est de prendre des décisions
stratégiques pour faire prospérer la ville tout en évitant la faillite ou la famine.
Ce projet met en œuvre :
— Des structures complexes pour représenter des entités comme les bâtiments, les
ressources, etc.
— Une boucle de jeu avec des choix interactifs pour le joueur.
— La gestion des ressources (argent, nourriture, population).
— Des événements aléatoires et des mécanismes de gestion de la ville.
Concepts couverts :
— Structures et gestion de listes.
— Programmation modulaire avec fonctions.
— Boucles de simulation avec interactions dynamiques.
— Utilisation des énumérations et gestion des états.
— Gestion des événements et de l’historique des actions.
31
8.2.2 Exercice :
Créez une structure Batiment pour représenter un bâtiment. Définissez une liste de
bâtiments de base (par exemple, Maison, Ferme, École, Usine). Implémentez une fonction
qui affiche les bâtiments disponibles avec leurs détails.
struct Batiment {
s t d : : s t r i n g nom ;
int c o u t C o n s t r u c t i o n ;
int c o u t E n t r e t i e n ;
int c a p a c i t e P o p u l a t i o n ;
int p r o d u c t i o n N o u r r i t u r e ;
int e f f e t B o n h e u r ; // Exemple : e f f e t p o s i t i f s u r l e bonheur
};
8.3.2 Exercice :
Implémentez une fonction qui initialise les ressources de départ. Créez une fonction
pour afficher les ressources actuelles du joueur à chaque tour.
struct R e s s o u r c e s {
int a r g e n t ;
int n o u r r i t u r e ;
int p o p u l a t i o n ;
int bonheur ;
};
32
— Ajoutez le bâtiment à la liste des bâtiments actifs.
— Mettez à jour les ressources de la ville en fonction du bâtiment construit.
8.4.2 Exercice :
Implémentez une fonction construireBatiment() qui permet de :
— Afficher la liste des bâtiments disponibles.
— Demander au joueur de choisir un bâtiment.
— Vérifier la possibilité de construction (solde suffisant d’argent).
— Ajouter le bâtiment et ses effets dans la ville.
8.5.2 Exercice :
Implémentez un menu avec les options suivantes à chaque tour :
Tour 1 :
Ressources :
Argent : 500, Nourriture : 100, Population : 5, Bonheur : 50
Actions :
1. Construire un bâtiment
2. Passer au tour suivant
3. Afficher les bâtiments actuels
4. Quitter
33
— Défaite :
— Si la nourriture < 0 pendant 3 tours consécutifs : “Votre population est morte
de faim, vous perdez.”
— Si l’argent < 0 pendant 3 tours consécutifs : “Votre ville est en faillite, vous
perdez.”
8.6.2 Exercice :
Implémentez une logique de victoire et défaite avec des messages correspondants.
8.7.2 Exercice :
Implémentez une fonction qui génère un événement aléatoire chaque tour, avec des
effets positifs ou négatifs.
8.7.4 Exercice :
Ajoutez une fonction qui permet au joueur de définir les taux de taxation et d’observer
les effets sur l’économie et le bonheur.
34
Chapitre 9
Jeu du Démineur
9.1 Résumé
Dans ce projet, vous allez implémenter un jeu du démineur en mode console. Le joueur
devra découvrir les cases du terrain sans déclencher de mines. Chaque case peut contenir
une mine ou un nombre indiquant le nombre de mines dans les cases adjacentes. Le but
est de révéler toutes les cases sûres sans toucher les mines.
Ce projet implique :
— La gestion d’une grille.
— Des structures pour représenter les cases et l’état du jeu.
— Une boucle de jeu avec des interactions utilisateurs.
— Des algorithmes pour vérifier les cases adjacentes et gérer les mines.
Concepts couverts :
— Structures et tableaux multidimensionnels.
— Gestion des entrées et sorties utilisateur.
— Logique de jeu (vérification des cases adjacentes, conditions de victoire et défaite).
— Boucle de jeu avec mise à jour de l’état.
35
9.2.2 Exercice
Créez une structure Case pour représenter chaque case du terrain. Implémentez un
tableau 2D pour stocker l’état du terrain. Affichez la grille au début du jeu, avec des cases
non révélées.
struct Case {
bool estMine; // Indique si la case contient une mine
int nombreMinesAdjacentes; // Nombre de mines adjacentes
bool estRévélée; // Si la case est déjà découverte
bool estMarquée; // Si le joueur a mis un drapeau
};
9.3.2 Exercice
Implémentez une fonction initialiserTerrain() pour :
— Placer les mines aléatoirement.
— Calculer le nombre de mines adjacentes pour chaque case.
— Afficher la grille initiale avec les cases non révélées.
9.4.2 Exercice
Implémentez une fonction révélerCase(x, y) qui :
— Révèle une case.
— Si la case est vide (pas de mine ni d’indication de mines adjacentes), révéler aussi
les cases adjacentes.
Implémentez une fonction marquerCase(x, y) pour permettre de marquer une case
avec un drapeau. Créez une fonction afficherTerrain() qui affiche l’état actuel de la
grille avec les cases découvertes, les cases marquées, et les cases non révélées.
36
9.5 Étape 4 : Boucle de jeu
9.5.1 Question 4
Ajoutez une boucle de jeu principale où le joueur peut choisir ses actions :
— Révéler une case.
— Marquer une case.
— Vérifier les conditions de victoire (toutes les cases sûres sont révélées).
— Vérifier les conditions de défaite (toucher une mine).
9.5.2 Exercice
Implémentez une boucle de jeu qui :
— Affiche le terrain à chaque tour.
— Demande à l’utilisateur s’il souhaite révéler ou marquer une case.
— Vérifie si le joueur a perdu (révélation d’une mine).
— Vérifie si le joueur a gagné (révélation de toutes les cases sûres).
while (!jeuTerminé) {
afficherTerrain();
demanderAction(); // Révéler ou marquer
if (conditionDePerte()) {
afficherMessage("Vous avez perdu !");
jeuTerminé = true;
}
if (conditionDeVictoire()) {
afficherMessage("Vous avez gagné !");
jeuTerminé = true;
}
}
9.6.2 Exercice
Implémentez la fonction conditionDePerte() qui vérifie si le joueur a cliqué sur une
mine. Implémentez la fonction conditionDeVictoire() qui vérifie si toutes les cases
sûres ont été révélées.
37
9.7 Étape 6 : Extensions optionnelles
9.7.1 1. Niveau de difficulté
Permettez au joueur de choisir la taille du terrain et le nombre de mines avant de
commencer :
— Facile : Terrain de 5x5 avec 5 mines.
— Moyenne : Terrain de 8x8 avec 15 mines.
— Difficile : Terrain de 10x10 avec 25 mines.
9.7.2 Exercice
Ajoutez un menu pour choisir la difficulté du jeu et ajustez la taille du terrain et le
nombre de mines en conséquence.
9.7.3 2. Chronomètre
Ajoutez un chronomètre pour mesurer le temps que prend le joueur pour finir le jeu.
9.7.4 Exercice
Implémentez un chronomètre qui se déclenche au début du jeu et qui affiche le temps
écoulé une fois que le joueur gagne ou perd.
9.7.6 Exercice
Implémentez une fonction de sauvegarde qui enregistre l’état actuel du jeu dans un
fichier et permet de le charger.
38