Actualiser un tableau c
Résolu
Bonjour,
Je fais actuellement un demineur mais j'ai un gros probleme. En fait je ne sais pas comment je pourrai faire pour actualiser mon tableau après chaque fois que l'utilisateur a rentré les coordonnée. Avec le code que j'obtiens un tableau différent après chaque coordonné tapé et en plus il ne m'affiche pas la case desamorcée précédemment.
En fait je voudrais voir toujours les cases découvertes.
Comment faire pour que la case rese visibe à l'affichage du prochain tableau?
J'utilise Dev c++
Je fais actuellement un demineur mais j'ai un gros probleme. En fait je ne sais pas comment je pourrai faire pour actualiser mon tableau après chaque fois que l'utilisateur a rentré les coordonnée. Avec le code que j'obtiens un tableau différent après chaque coordonné tapé et en plus il ne m'affiche pas la case desamorcée précédemment.
En fait je voudrais voir toujours les cases découvertes.
Comment faire pour que la case rese visibe à l'affichage du prochain tableau?
J'utilise Dev c++
A voir également:
- Actualiser un tableau c
- Tableau word - Guide
- Trier un tableau excel - Guide
- Tableau ascii - Guide
- Imprimer un tableau excel - Guide
- Tableau croisé dynamique - Guide
6 réponses
1) La méthode la plus simple consiste à utiliser deux tableaux :
- un tableau qui stocke les positions des mines, et le cas échéant le nombre de mines présentes sur les cases voisines. On peut imaginer qu'une mine soit codée par la valeur 9 puisqu'il y a au plus 8 cases adjacentes à chaque case.
- un tableau qui stocke les cases découvertes (0 = masqué, 1 = découverte par exemple, 2 = marquée).
2) Une autre solution plus élégante consiste à faire une matrice de structure, chaque structure décrivant l'état d'une case (minée, déminée, nombre de mines alentour etc...).
A chaque itération (ie tentative de déminage) il suffit de parcourir ces deux tableaux afin d'afficher le nouveau tableau de jeu.
Bonne chance
- un tableau qui stocke les positions des mines, et le cas échéant le nombre de mines présentes sur les cases voisines. On peut imaginer qu'une mine soit codée par la valeur 9 puisqu'il y a au plus 8 cases adjacentes à chaque case.
- un tableau qui stocke les cases découvertes (0 = masqué, 1 = découverte par exemple, 2 = marquée).
2) Une autre solution plus élégante consiste à faire une matrice de structure, chaque structure décrivant l'état d'une case (minée, déminée, nombre de mines alentour etc...).
A chaque itération (ie tentative de déminage) il suffit de parcourir ces deux tableaux afin d'afficher le nouveau tableau de jeu.
Bonne chance
Merci beaucoup ça marche au top. j'ai toujours un petit problème :
- Si le nombre de mine alentour est zéro, il faudra révéler le contenu des cases alentour (opération à réitérer tant que l'on trouve des cases sans mines alentour). On affichera le nombre total mines restantes ;
je ne vois pas du tout comment faire j'ai essayé : si mine alentour=0 alors la case devient visible mais comment faire pour rechercher les valeurs alentours?????
- Si le nombre de mine alentour est zéro, il faudra révéler le contenu des cases alentour (opération à réitérer tant que l'on trouve des cases sans mines alentour). On affichera le nombre total mines restantes ;
je ne vois pas du tout comment faire j'ai essayé : si mine alentour=0 alors la case devient visible mais comment faire pour rechercher les valeurs alentours?????
La méthode la plus simple c'est de faire un appel récursif. Tu fais une fonction découvrir qui est déclenchée quand l'utilisateur veut faire apparaître une case. Si tu as bien structuré ton code elle doit déjà exister et tester si la case en question est minée. Il suffit de rajouter un test pour qui appele récursivement decouvrir sur les cases alentours non découvertes si la case découverte n'est voisine d'aucune case minée.
Si je ne me suis pas trop craquée dans ma récursivité voilà ce qui va se passer :
- quand on atteint un bord du plateau, l'appel est coupé (cas 1 et 2)
- si la case a déjà été découverte, l'appel est aussi coupé (cas 3), donc normalement ton programmera pas à l'infini car il visitera une et une seule fois une case, et ne déclenchera un nouveau jeu d'appels récursifs que si on vient de découvrir une nouvelle case.
Bonne chance
struct case_t{
bool mine; // en c tu peut mettre un short
bool decouverte;
unsigned nb; // le nombre de mines dans les cases voisines
};
struct plateau_t{
unsigned nb_ligne;
unsigned nb_colonne;
struct case_t **case;
}
int decouvrir(struct plateau_t *p,const unsigned x,const unsigned y){
unsigned i,j;
if(x >= p->nb_colonne) return 1;
if(y >= p->nb_ligne) return 2;
if(p->case[x][y].decouverte) return 3;
// on decouvre une nouvelle case
if(p->case[x][y].mine) return 4;
case[x][y].nb = true; // en C remplace true par 1
if(p->case[x][y].nb == 0){
for(unsigned i = x -1; i <= x + 1; ++i){
for(unsigned j = x -1; j <= x + 1; ++j){
decouvrir(p,i,j);
}
}
}
return 5;
}
Si je ne me suis pas trop craquée dans ma récursivité voilà ce qui va se passer :
- quand on atteint un bord du plateau, l'appel est coupé (cas 1 et 2)
- si la case a déjà été découverte, l'appel est aussi coupé (cas 3), donc normalement ton programmera pas à l'infini car il visitera une et une seule fois une case, et ne déclenchera un nouveau jeu d'appels récursifs que si on vient de découvrir une nouvelle case.
Bonne chance
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
J'ai un gros problème je ne gère pas du tout les fonctions, nous n'avons commencer le cours que hier. On ne peut le faire qu'avec des fonctions?