Actualiser un tableau c

Résolu/Fermé
didy_gwatinik Messages postés 352 Date d'inscription samedi 17 novembre 2007 Statut Membre Dernière intervention 30 mars 2010 - 8 janv. 2008 à 12:52
mamiemando Messages postés 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 - 11 janv. 2008 à 17:25
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++

6 réponses

mamiemando Messages postés 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 7 803
8 janv. 2008 à 13:52
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
0
didy_gwatinik
10 janv. 2008 à 18:52
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?????
0
mamiemando Messages postés 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 7 803
10 janv. 2008 à 20:45
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.
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
0
didy_gwatinik
11 janv. 2008 à 09:25
Je vais tester ça merci pour votre aide!!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
didy_gwatinik
11 janv. 2008 à 12:45
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?
0
mamiemando Messages postés 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 7 803
11 janv. 2008 à 17:25
On ne peut le faire qu'avec des fonctions?

Et à ton avis ce ne sont pas des fonctions ce que j'ai mis dans <3> ? De toute façon les fonctions c'est vraiment la base du C et dans ce cas particulier c'est la manière la plus simple et la plus naturelle de résoudre ton problème.

Bonne chance
0