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 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
| #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define TAILLE 10
#define NB_MINES_MIN 1
char jeu [TAILLE+2][TAILLE+2]; // Grille de jeu
char mines [TAILLE+2][TAILLE+2]; // Grille avec les mines
char autour[TAILLE+2][TAILLE+2]; // Grille donnant le nbre de mines autour
char temp [TAILLE+2][TAILLE+2]; // Grille temporaire pour le calcul de la case jouée
//////////////////////////////
// FONCTION INITIALISATION ///
//////////////////////////////
void init()
{
int i, j;
for (i=0; i<TAILLE+2; i++)
for (j=0; j<TAILLE+2; j++)
{
jeu [i][j] = '-'; // ' 'implique case cachée
mines[i][j] = 0;
autour[i][j] = 0;
}
}
///////////////////////////////
// FONCTION PLACER LES MINES //
///////////////////////////////
void placeMines(int nbMines)
{
int i, j;
while(nbMines)
{
int i = rand()%TAILLE + 1; // On choisit la ligne de manière aléatoire
int j = rand()%TAILLE + 1; // On choisit la colonne de manière aléatoire
if (!mines[i][j]) // On vérifie ie que la case est libre
{
mines[i][j] = 1; // On place un 1 pour indiquer qu'il y a une mine
nbMines--; // Une mine de moins à placer
printf("\nmine: lig=%d, col=%d", i, j);
}
}
for (i=1; i<=TAILLE; i++) // Met le tableau 'autour' à jour
for (j=1; j<=TAILLE; j++)
autour[i][j] = mines[i-1][j-1] + mines[i-1][j] + mines[i-1][j+1] +
mines[i ][j-1] + mines[i ][j+1] +
mines[i+1][j-1] + mines[i+1][j] + mines[i+1][j+1];
}
////////////////////////////////////////
// FONCTION AFFICHER LA GRILLE DE JEU //
////////////////////////////////////////
void afficheJeu()
{
int i, j;
printf("\n\n");
printf(" | 1 2 3 4 5 6 7 8 9 10\n");
printf("___|______________________________\n");
for (i=1 ;i<=TAILLE; i++)
{
if (i < 10)
printf(" %d | ", i);
else
printf("%d | ", i);
for (j=1; j<=TAILLE; j++)
printf("%c ", jeu[i][j]);
printf("\n");
}
}
//////////////////////////////////////////////////////////
// FONCTION JOUER dévoiler une case ou placer un drapeau//
//////////////////////////////////////////////////////////
int jouer(int choix, int lig, int col)
{
int i, j, m, n;
switch (choix)
{
case 1 :
for (i=0; i<=TAILLE+2; i++)
for (j=0; j<TAILLE+2; j++)
temp[i][j] = 0;
if (mines[lig][col])
return 1; // Perdu, on est tombé sur une mine
case 0 :
temp[lig][col] = autour[lig][col] + '0';
for (i=1; i<=TAILLE; i++)
for (j=1; j<=TAILLE; j++)
if (temp[i][j] == '0')
{
temp[i][j] = ' ';
for (m=i-1; m<=i+1; m++)
for (n=j-1; n<=j+1; n++)
if ( !((m == i) && (n == j)) && (m) && (m <= TAILLE) && (n) && (n <= TAILLE) && (!temp[m][n]) ) // Pour éviter de retester la même case et les bords
jouer(0, m, n);
}
for (i=1; i<=TAILLE; i++) // Recopie de temp dans jeu
for (j=1; j<=TAILLE; j++)
if (temp[i][j])
if (jeu[i][j] == '-')
jeu[i][j] = temp[i][j];
break;
case 2 :
jeu[lig][col] = 'D';
break;
}
return 0;
}
///////////////////////////////////////////////////////////////
// FONCTION CHOISIR On demande au joueur de choisir une case //
///////////////////////////////////////////////////////////////
int choisir(int *lig, int* col)
{
int choix;
printf("\n\nVeuillez entrer la case choisie (numero de ligne [espace] numero de colonne):\t");
scanf("%d %d", lig, col);
while ((lig!i+1)||(lig!i-1), (col!j+1)||(col!j-1))//C est ici que j'ai un message d erreur
{
printf("\nErreur de saisie , veuillez choisir une case adjacente");
scanf("%d %d", lig, col);
}
printf("Vous avez choisi la case (%d, %d).: Que voulez-vous faire ?\n", *lig, *col);
printf("\t1. Decouvrir une case\n");
printf("\t2. Placer un drapeau");
do
{
printf("\t\tVotre choix : ");
scanf("%d", &choix);
}
while (choix<0 || choix>2);
return choix;
}
////////////////////////////////////////////////////////////////////////////////
int main()
{
int lig, col; // Mémorise la case jouée
int choix; // Mémorise le choix
int nbMines = 0; // Nombre de mines choisi par le joueur
int nbCaseJouee, nbDrapeau, nbDrapeauOK; // Pour le test de fin de jeu
srand((int)time(NULL));
//Afficher le début du jeu
printf(" ________________________________\n");
printf("| |\n");
printf("| jeu du demineur |\n");
printf("|________________________________|\n\n");
init();
do
{
printf("\nCombien de mines voulez-vous ?\n\n");
scanf("%d", &nbMines);
}
while( (nbMines < NB_MINES_MIN) || (nbMines >= (TAILLE*TAILLE)) );
printf("D'accord, vous avez choisi de jouer avec %d mines\n\n", nbMines);
placeMines(nbMines);
printf("Voici la grille des mines pour controle:\n");
int i, j;
for (i=1; i<=TAILLE; i++)
{
printf("\t\t\t");
for (j=1; j<=TAILLE; j++)
if (mines[i][j])
printf("M ");
else
printf(". ");
printf("\n");
}
printf("\n");
for (i=1; i<=TAILLE; i++)
{
printf("\t\t\t");
for (j=1; j<=TAILLE; j++)
printf("%c ", autour[i][j]+'0');
printf("\n");
}
printf("\n\nVoici votre grille : A vous de jouer !\n\n");
afficheJeu();
while (1)
{
choix = choisir(&lig, &col);
if (jouer(choix, lig, col))
{
printf("\n\n\t\tDommage vous avez perdu !");
return 0;
}
afficheJeu();
// Test de la fin du jeu
nbCaseJouee = nbDrapeau = nbDrapeauOK = 0;
for (i=1; i<=TAILLE; i++)
for (j=1; j<=TAILLE; j++)
{
if (jeu[i][j] != '-')
nbCaseJouee++;
if (jeu[i][j] == 'D')
{
nbDrapeau++;
if (mines[i][j])
nbDrapeauOK++;
}
}
if ( (nbDrapeau == nbMines) && (nbDrapeauOK == nbMines) )
break; // Les drapeaux correspondent bien à toutes les mines et à elles seules
if (nbCaseJouee >= (TAILLE*TAILLE))
{
printf("\n\n\t\tDommage vous avez perdu !");
return 0;
}
}
printf("\n\n\t\tBravo vous avez gagné !");
//system("pause");
return 0;
} |
Partager