Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <stdexcept>
/** @file **/
#include <iostream>
#include <vector>
#include <string>
#include <stdlib.h>
#include <time.h>
using namespace std;
/** Infrastructure minimale de test **/
#define CHECK(test) if (!(test)) cerr << "Test failed in file " << __FILE__ << " line " << __LINE__ << ": " #test << endl
/// BEGIN GrilleDemineur
using GrilleDemineur = vector<vector<char>>; // tableau 2D de caractères
/// END GrilleDemineur
const GrilleDemineur uneGrille = {
{ ' ', 'm', 'o', ' ', 'm', 'M' },
{ 'm', 'm', 'm', 'o', 'm', ' ' },
{ 'm', 'm', 'm', 'o', ' ', 'm' },
{ 'm', 'm', 'm', ' ', 'M', ' ' },
};
const GrilleDemineur uneGrilleGagnante = {
{ ' ', 'm', ' ', ' ', 'm', 'M' },
{ 'm', 'm', 'm', ' ', 'm', ' ' },
{ 'm', 'm', 'm', ' ', ' ', 'm' },
{ 'm', 'm', 'm', ' ', 'M', ' ' },
};
/// BEGIN nombreMines
/** Compte le nombre de mines dans une grille
* @param grille un tableau 2D de caractères (vector<vector<char> >)
* @return le nombre de mines dans grille
**/
int nombreMines(GrilleDemineur grille) {
// Remplacez cette ligne et la suivante par le code adéquat
throw runtime_error("Fonction nombreMines non implantée ligne 37");
}
/// END nombreMines
void nombreMinesTest() {
CHECK( nombreMines(uneGrille) == 15);
CHECK( nombreMines(uneGrilleGagnante) == 15);
}
/** Renvoie un booléen aléatoire qui initialise le tirage aléatoire des mines **/
bool boolAleatoire() {
string sproba;
int iproba;
cout << "Quelle est la probabilité qu'une case contienne une mine ?\n";
cin >> sproba;
iproba = atoi(sproba.c_str());
srand(time(NULL));
return rand() % 100 + 1 < iproba;
}
/// BEGIN grilleInitiale
/** Construit une grille initiale
* @param n un entier positif
* @param m un entier positif
* @return un tableau de caractères de n lignes et m colonnes rempli
* aléatoirement et ne contenant que des 'm' ou 'o'
**/
GrilleDemineur grilleInitiale(int n, int m) {
// Remplacez cette ligne et la suivante par le code adéquat
throw runtime_error("Fonction grilleInitiale non implantée ligne 67");
}
/// END grilleInitiale
/// BEGIN grilleEstGagnante
/** Teste si une grille est gagnante
* @param grille un tableau 2D de caractères (vector<vector<char> >)
* @return un booléen vrai si grille est une grille gagnante, ie si
* toutes les cases qui ne sont pas des mines ont été démasquées
**/
bool grilleEstGagnante(GrilleDemineur grille) {
// Remplacez cette ligne et la suivante par le code adéquat
throw runtime_error("Fonction grilleEstGagnante non implantée ligne 79");
}
/// END grilleEstGagnante
void grilleEstGagnanteTest() {
CHECK( not grilleEstGagnante(uneGrille) );
CHECK( grilleEstGagnante(uneGrilleGagnante) );
}
/// BEGIN minesVoisines
/** Renvoie le nombre de mines voisines à ième ligne, jème colonne
* @param grille un tableau 2D de caractères (vector<vector<char> >)
* @param i un entier décrivant une ligne de grille
* @param j un entier décrivant une colonne de grille
* @return un entier entre 0 et 8 comptant le nombre de mines
* adjacentes à grille[i][j]
**/
int minesVoisines(GrilleDemineur grille, int i, int j) {
// Remplacez cette ligne et la suivante par le code adéquat
throw runtime_error("Fonction minesVoisines non implantée ligne 98");
}
/// END minesVoisines
void minesVoisinesTest() {
CHECK( minesVoisines(uneGrille, 0, 0) == 3);
CHECK( minesVoisines(uneGrille, 2, 1) == 8);
CHECK( minesVoisines(uneGrille, 2, 0) == 5);
CHECK( minesVoisines(uneGrille, 1, 5) == 4);
CHECK( minesVoisines(uneGrille, 3, 5) == 2);
}
/// BEGIN dessinGrille
/** Dessine une grille
* @param grille un tableau 2D de caractères (vector<vector<char> >)
* @return une chaîne de caractères (string) décrivant la grille de
* gauche à droite et de bas en haut, avec un saut de la ligne après
* chaque ligne de la grille
*
* Indications:
* - si s et t sont des chaînes de caractères, s+t est leur concaténation
* - "\n" représente un saut de ligne
**/
string dessinGrille(GrilleDemineur grille) {
// Remplacez cette ligne et la suivante par le code adéquat
throw runtime_error("Fonction dessinGrille non implantée ligne 123");
}
/// END dessinGrille
void dessinGrilleTest() {
CHECK( dessinGrille(uneGrille) == "3 3 M\n 4\n 3 \n 3M2\n");
}
int main() {
cout << "Lancement des tests. Si tout marche bien, rien ne devrait s'afficher ci dessous."
<< endl;
nombreMinesTest();
grilleEstGagnanteTest();
minesVoisinesTest();
dessinGrilleTest();
}