|
Bonsoir,
Pas moyen de sortir de ce bug ! Quand il n'y a pas de mines autour, j'ai des '0' à l'infini ! Le souci est sans doute dans la fonction 'Jouer' Pouvez vous m'aider ? Je déprime là
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char JEU[10][10];//grille de jeu
int i,j;//i les lignes, j les colonnes
char MINES[10][10];//la grille avec les mines
int N;//Nombre de mines autour
int NbMines;//le nombre de mines choisi par le joueur
int choix;//le choix effectué par le joueur pour découvrir ou placer un drapeau
//////////////////////////////
// FONCTION INITIALISATION ///
//////////////////////////////
void Init()
{
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
JEU[i][j]='-';//' 'implique case cachée
MINES[i][j]='0';
}
}
}
///////////////////////////////
// FONCTION PLACER LES MINES //
///////////////////////////////
void PlaceMines()
{
int CompteMines;//compteur de mines
for (CompteMines=0;CompteMines<NbMines;CompteMines++)
{
i=rand()%10;//on choisit la ligne de manière aléatoire
j=rand()%10;//on choisit la colonne de manière aléatoire
if(MINES[i][j]=='0')//On vérifie que la case est libre
{
MINES[i][j]='M';//on place un M pour indiquer qu'il y a une mine
}
else
{
NbMines++;//Sinon, il y a déjà un M et il faut faire un tour de plus
}
}
}
////////////////////////////////////////
// FONCTION AFFICHER LA GRILLE DE JEU //
////////////////////////////////////////
void AfficheJeu()
{
printf("\n\n");
printf(" | 1 2 3 4 5 6 7 8 9 10\n");
printf("___|______________________________\n");
for(i=0;i<10;i++)
{
if(i<9)
printf(" %d | ",i+1);
else
printf("%d | ",i+1);
for(j=0;j<10;j++)
{
printf("%c ",JEU[i][j]);
}
printf("\n");
}
}
/////////////////////////////////////////////
// FONCTION CALCULER LE NB DE MINES AUTOUR //
/////////////////////////////////////////////
int NbMinesAutour()
{
N=0;
if(MINES[i][j]=='M')
{
printf("Vous avez perdu !!!\n\n");
printf(" | 1 2 3 4 5 6 7 8 9 10\n");
printf("___|______________________________\n");
for(i=0;i<10;i++)
{
if(i<9)
printf(" %d | ",i+1);
else
printf("%d | ",i+1);
for(j=0;j<10;j++)
printf("%c ",MINES[i][j]);
printf("\n");
}
}
else
{
if (i==0)
{
if (j==0)
{
if(MINES[i][j+1]=='M')
N++;
if(MINES[i+1][j]=='M')
N++;
if(MINES[i+1][j+1]=='M')
N++;
}
else
{
if(j==10)
{
if(MINES[i][j-1]=='M')
N++;
if(MINES[i+1][j-1]=='M')
N++;
if(MINES[i+1][j]='M')
N++;
}
else
{
if(MINES[i][j-1]=='M')
N++;
if(MINES[i][j+1]=='M')
N++;
if(MINES[i+1][j-1]=='M')
N++;
if(MINES[i+1][j]=='M')
N++;
if(MINES[i+1][j+1]=='M')
N++;
}
}
}
else
{
if (i==10)
{
if (j==0)
{
if(MINES[i-1][j]=='M')
N++;
if(MINES[i-1][j+1]=='M')
N++;
if(MINES[i][j+1]=='M')
N++;
}
else
{
if(j==10)
{
if(MINES[i-1][j-1]=='M')
N++;
if(MINES[i-1][j]=='M')
N++;
if(MINES[i][j-1]=='M')
N++;
}
else
{
if(MINES[i-1][j-1]=='M')
N++;
if(MINES[i-1][j]=='M')
N++;
if(MINES[i-1][j+1]=='M')
N++;
if(MINES[i][j-1]=='M')
N++;
if(MINES[i][j+1]=='M')
N++;
}
}
}
else
{
if(MINES[i-1][j-1]=='M')
N++;
if(MINES[i-1][j]=='M')
N++;
if(MINES[i-1][j+1]=='M')
N++;
if(MINES[i][j-1]=='M')
N++;
if(MINES[i][j+1]=='M')
N++;
if(MINES[i+1][j-1]=='M')
N++;
if(MINES[i+1][j]=='M')
N++;
if(MINES[i+1][j+1]=='M')
N++;
}
}
return(N);
}
}
//////////////////////////////////////////////////////////
// FONCTION JOUER dévoiler une case ou placer un drapeau//
//////////////////////////////////////////////////////////
void Jouer()
{
char NbMinesTxt[2]; // nombre de mines aux alentours
switch (choix)
{
case 1 :
NbMinesAutour();
if (N!=0)//Il y a des mines autour
{
printf("%d\n\n",N);
sprintf(NbMinesTxt,"%d",N);
JEU[i][j]=NbMinesTxt[0];
}
else//Il n'y a pas de mines autour
{
JEU[i][j]='0';
for(i=i-1;i<i+2;i++)
{
for(j=j-1;j<j+2;j++)
NbMinesAutour();
}
}
break;
case 2 : JEU[i][j]='D';
break;
}
}
///////////////////////////////////////////////////////////////
// FONCTION CHOISIR On demande au joueur de choisir une case //
///////////////////////////////////////////////////////////////
void Choisir()
{
printf("\n\nVeuillez entrer la case choisie (numero de ligne [espace] numero de colonne):\t");
scanf("%d %d",&i,&j);
printf("Vous avez choisi la case (%d,%d).\ Que voulez-vous faire ?\n",i,j);
i=i-1;
j=j-1;
printf("\t1. Decouvrir une case\n");
printf("\t2. Placer un drapeau");
do
{
printf("\t\tVotre choix : ");
scanf("%d",&choix);
}
while (choix<0 || choix>2);
}
////////////////////////////////////////////////////////////////////////////////
int main()
{
int c;//compteur
srand(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>=30);
printf("D'accord, vous avez choisi de jouer avec %d mines\n\n",NbMines);
PlaceMines();
printf("Voici la grille des mines pour controle:\n");
for(i=0;i<10;i++)
{
printf("\t\t\t");
for(j=0;j<10;j++)
{
printf("%c ",MINES[i][j]);
}
printf("\n");
}
printf("\n\nVoici votre grille : A vous de jouer !\n\n");
AfficheJeu();
for(c=0;c<(100-NbMines);c++)
{
Choisir();
Jouer();
AfficheJeu();
}
printf("\n\n\t\tBravo vous avez gagné !");
system("pause");
return 0;
}
|
dev-libre |
| 1 2 3 4 5 6 7 8 9 10
___|______________________________
1 | 0 M 0 0 M 0 0 0 0 0
2 | 0 0 0 0 0 M 0 0 0 0
3 | 0 0 0 0 0 M 0 0 0 0
4 | 0 0 0 0 0 0 0 0 0 0
5 | 0 0 0 0 0 0 0 0 0 0
6 | 0 0 0 0 0 0 0 0 0 0
7 | 0 0 0 0 M 0 0 0 0 0
8 | M M 0 0 0 0 0 0 0 M
9 | 0 0 0 0 M 0 0 0 0 0
10 | 0 0 0 M 0 0 0 0 0 0
Segmentation fault
je regarde au code, ce problème doit venir d'une variable edit: autre chose, tu devrais éviter les variables globales c'est mal ^^ edit2 : modifie ça aussi, ça ne passe pas sur tous les compilateurs
printf("Vous avez choisi la case (%d,%d).\ Que voulez-vous faire ?\n",i,j);
printf("Vous avez choisi la case (%d,%d).\\ Que voulez-vous faire ?\n",i,j);
laisse moi un peu de temps, je cherche
|