Je dois programmer un démineur en C sans bibliothèque graphique.
Jusque là ça marche mais je bloque sur la fonction de dévoilement des cases vides.
Lorsqu'on choisit une case, s'il y a des mines autour, le programme affiche le nombre de mines
S'il y a une mines le programme affiche perdu
Mais q'il n'y a ni mines ni mines autour, il affiche seulement "0". Ce qui ne fait pas avancer le jeu.
Je voudrais que dans ce cas, le jeu dévoile les cases vides autour, et en frontière, le nb de mines.
Merci à ceux qui pourront me donner des mines
(J'ai essayer de boucler mais le programme tourne sans fin)
#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
////////////////////////////////////////
// FONCTION AFFICHER LA GRILLE DE JEU //
////////////////////////////////////////
void AfficheJeu()
{
printf(" | 1 2 3 4 5 6 7 8 9 10n");
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 !!!nn");
printf(" | 1 2 3 4 5 6 7 8 9 10n");
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);
}
}
int main()
{
int NbMines;//le nombre de mines choisi par le joueur
char NbMinesTxt[2]; // nombre de mines aux alentours
int CompteMines;//compteur de mines
int choix;//le choix effectué par le joueur pour découvrir ou placer un drapeau
int c;//le compteur de la boucle
srand(time(NULL));
//Afficher le début du jeu
printf(" ________________________________n");
printf("| |n");
printf("| Jeu du demineur |n");
printf("|________________________________|nn");
//initialisation des deux grilles
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
JEU[i][j]=' ';//' 'implique case cachée
MINES[i][j]='0';
}
}
//demander à l'utilisateur de choisir un nombre de mines
do
{
printf("nCombien de mines voulez-vous ?nn");
scanf("%d",&NbMines);
}
while(NbMines>=30);
printf("D'accord, vous avez choisi de jouer avec %d minesnn",NbMines);
//////////////////////////////
// Initialisation des 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
}
}
//Pour vérifier on affiche la grille des mines
printf("Voici la grille des mines :n");
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
printf("%c ",MINES[i][j]);
}
printf("n");
}
////////////////////////////
// Démarrage de la partie //
////////////////////////////
//On affiche le jeu au joueur
printf("nnVoici votre grille : A vous de jouer !nn");
printf(" | 1 2 3 4 5 6 7 8 9 10n");
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++)
{
JEU[i][j]='-';//'-'implique case cachée
printf("%c ",JEU[i][j]);
}
printf("n");
}
//On demande au joueur de choisir une case
//la case est définie par sa ligne i et sa colonne j
for(c=0;c<(100-NbMines);c++)
{
printf("nnVeuillez 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;
// Demander au joueur ce qu'il veut faire
printf("t1. Decouvrir une casen");
printf("t2. Placer un drapeau");
do
{
printf("ttVotre choix : ");
scanf("%d",&choix);
}
while (choix<0 || choix>2);
// Choix : dévoiler une case ou placer un drapeau
switch (choix)
{
case 1 : //fonction devoile mines autour
NbMinesAutour();
if (N!=0)//Il y a des mines autour
{
printf("%dnn",N);
sprintf(NbMinesTxt,"%d",N);
JEU[i][j]=NbMinesTxt[0];
}
else//Il n'y a pas de mines autour
{
JEU[i][j]='0';
}
break;
case 2 : JEU[i][j]='D';
break;
}
//AFFICHER LA GRILLE
AfficheJeu();
}
printf("nnttBravo vous avez gagné !");
system("pause");
return 0;
}
Pourrais-tu un peu plus nous simplifier la tache en disant à quel endroit de ton programme cela ne marche pas ? Car là tu nous donnes beaucoup de lignes de code et je n'ai pas le temps d'analyser ton truc en détail.
Sinon moi ce que je ferai dans ce cas c'est une fonction de récurrence. Tu appelles une fonction qui te testes le nombre de mines autour et qui à chaque fois que la valeur est 0 s'appelle pour chaque case d'à côté ?
Tu vois le truc ?
De plus fractionne beaucoup plus ton code !!! Ton main ne devrait pas être si grand que ça! Utilise plus de fonctions ! Ça sera plus claire et plus modulable qu'avec tout à la bourrin dans une fonction ;) (InitGrid(), StartGame()...)
__________________________
............ Curtis: RTS 3D .............. ......
........... TeamMoteurProg...........
#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("nn");
printf(" | 1 2 3 4 5 6 7 8 9 10n");
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 !!!nn");
printf(" | 1 2 3 4 5 6 7 8 9 10n");
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 : //fonction devoile mines autour
NbMinesAutour();
if (N!=0)//Il y a des mines autour
{
printf("%dnn",N);
sprintf(NbMinesTxt,"%d",N);
JEU[i][j]=NbMinesTxt[0];
}
else//Il n'y a pas de mines autour
{
JEU[i][j]='0';
}
break;
case 2 : JEU[i][j]='D';
break;
}
}
///////////////////////////////////////////////////////////////
// FONCTION CHOISIR On demande au joueur de choisir une case //
///////////////////////////////////////////////////////////////
void Choisir()
{
printf("nnVeuillez 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 casen");// Demander au joueur ce qu'il veut faire
printf("t2. Placer un drapeau");
do
{
printf("ttVotre 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("|________________________________|nn");
Init();
do
{
printf("nCombien de mines voulez-vous ?nn");
scanf("%d",&NbMines);
}
while(NbMines>=30);
printf("D'accord, vous avez choisi de jouer avec %d minesnn",NbMines);
PlaceMines();
printf("Voici la grille des mines pour controle:n");
for(i=0;i<10;i++)
{
printf("ttt");
for(j=0;j<10;j++)
{
printf("%c ",MINES[i][j]);
}
printf("n");
}
printf("nnVoici votre grille : A vous de jouer !nn");
AfficheJeu();
for(c=0;c<(100-NbMines);c++)
{
Choisir();
Jouer();
AfficheJeu();
}
printf("nnttBravo vous avez gagné !");
system("pause");
return 0;
}
Je pense que le problème est soit dans la fonction NbMinesAutour sit dans la fonction Jouer.
Je voudrais que lorsqu'il y a un '0', tous les '0' autour s'affichent
Je me doute que je dois boucler mais toutes mes tentatives ont échoué.
Quant à la récursivité de la fonction, j'ai essayé aussi mais je ne dois pas l'appeler au bon endroit
Merci pour votre aide Je pense que le problème est soit dans la fonction NbMinesAutour sit dans la fonction Jouer.
Je voudrais que lorsqu'il y a un '0', tous les '0' autour s'affichent
Je me doute que je dois boucler mais toutes mes tentatives ont échoué.
Quant à la récursivité de la fonction, j'ai essayé aussi mais je ne dois pas l'appeler au bon endroit
Merci pour votre aide
Voici ma dernière tentative :
Mais ça buggue toujours dans la fonction Jouer !
Peut-être que demain je ferai mieux
#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("nn");
printf(" | 1 2 3 4 5 6 7 8 9 10n");
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 !!!nn");
printf(" | 1 2 3 4 5 6 7 8 9 10n");
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("%dnn",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("nnVeuillez 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 casen");
printf("t2. Placer un drapeau");
do
{
printf("ttVotre 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("|________________________________|nn");
Init();
do
{
printf("nCombien de mines voulez-vous ?nn");
scanf("%d",&NbMines);
}
while(NbMines>=30);
printf("D'accord, vous avez choisi de jouer avec %d minesnn",NbMines);
PlaceMines();
printf("Voici la grille des mines pour controle:n");
for(i=0;i<10;i++)
{
printf("ttt");
for(j=0;j<10;j++)
{
printf("%c ",MINES[i][j]);
}
printf("n");
}
printf("nnVoici votre grille : A vous de jouer !nn");
AfficheJeu();
for(c=0;c<(100-NbMines);c++)
{
Choisir();
Jouer();
AfficheJeu();
}
printf("nnttBravo vous avez gagné !");
system("pause");
return 0;
}
je viens de mater le code, c'est très très moche les variables globales pour tout ! et c'est juste interdit d'en utiliser dans 2 fonctions différentes pour boucler !
et c'est sûrement la cause de ta boucle infinie... (edit : c'est la cause de la boucle infinie dans Jouer )
mais une idée comme ça, ce que je ferais personnellement en fait
tu as une fonction qui compte le nombre de mines autour d'une case choisie
tu sais quelle case le joueur choisit
si y'a 0 mines sur cette case =>
tu lances la fonction pour découvrir les mines sur les 8 cases autour
==> récursivité !
il faut commencer par tout recoder en passant par des variables locales uniquement, les seules variables globales dont tu as besoin sont MINES, JEU et NbMines (et encore, mais plus simple pour commencer)
__________________________
Spirit - modérateur casu ^-^'