Partage
  • Partager sur Facebook
  • Partager sur Twitter

Démineur en VBA

Placement des mines

    10 novembre 2018 à 19:34:57

    Bonjour, 

    Je suis en train de réaliser un démineur avec Excel en utilisant VBA. Je bloque depuis maintenant quelques heures sur le placement aléatoire des mines dans ma grille... A chaque fois Excel plante et je dois rouvrir le fichier.Je vous mets mon code en entier pour que vous aillez toutes les informations nécessaires, la partie qui me pose problème est sous " Placement des mines ". Autre chose, je débute sur VBA, je ne connais pas encore tous les outils qui sont a ma disposition ^^ 

    Je vous remercie de votre aide!

    ' Variable globale
    Public Nl
    Public Nc
    Public n
    Public jeu
    
    Sub Nouveau_jeu()
    ' Initialisation des variables
    Dim l
    Dim c
    Dim p
    Dim g
    Dim a
    Dim d
    Dim compteur
    Dim mine
    Dim j 
    
    
    jeu = False
    l = 10
    c = 2
    Nl = Worksheets("Config").Cells(2, 1)  ' ligne/colonne
    Nc = Worksheets("Config").Cells(2, 2)
    p = (Nl + l) - 1
    g = (Nc + c) - 1
    compteur = 0
    n = Worksheets("Config").Cells(2, 3)                 ' nombre de mines choisit par l'utilisateur
    j=1
    
    
    ' DEBUT DU CODE
    
    'initialisation du tableau
    While jeu = False   ' marque le début du jeu
        'regle du jeu
        MsgBox ("Bienvenue dans le jeu : démineur. Vous disposez d'une grille contenant des mines cachées. En cliquant sur une case vous connaissez le nombre de mines se trouvant dans les cases ( 8 au maximum) qui l'entourent. Le but du jeu est de détecter toutes les mines sans cliquer dessus")
        
        ' supprime toutes les valeurs de la grille deja existante et remets une bonne mise en forme
        Worksheets("Jeu").Range("B10:P24").ClearContents
        Worksheets("Jeu").Range("B10:P24").ClearFormats
        
        Worksheets("SOLUTION").Range("B10:P24").ClearContents
        Worksheets("SOLUTION").Range("B10:P24").ClearFormats
        
        'Initialisation de la grille
        For l = 10 To p
            For c = 2 To g
                Cells(l, c) = 0
                Worksheets("SOLUTION").Cells(l, c) = 0
                Cells(l, c).Interior.Color = RGB(180, 180, 180)                ' affecte une couleur de départ au plateau
                Cells(l, c).RowHeight = 20                                           ' uniformise la hauteur et largeur de la cellule
                Cells(l, c).ColumnWidth = 5
                
            Next
        Next
    
        'Placement des mines
        While compteur <> n   ' Tant que le nombre de mines n'est pas égale à celui entrer par l'utilisateur
           a = Int((p - l + 1) * Rnd + l)            ' donne un nombre aléatoire de ligne en fonction de ce que l'utilisateur a choisit
           d = Int((g - c + 1) * Rnd + c)          ' donne un nombre aléatoire de colonne en fonction de ce que l'utilisateur a choisit
           For j = 1 To n
                Worksheets("Solution").Cells(a, d) = "*"     'placement de la mine aléatoirement dans la grille
                compteur = compteur + 1
                Worksheets("Solution").Cells(a, d).Interior.Color = RGB(238, 0, 0)     ' couleur de la cellule
           Next
              
        Wend
        
        ' fin du jeu
        jeu = True
        
    
    Wend
    End Sub
    
    • Partager sur Facebook
    • Partager sur Twitter
      12 novembre 2018 à 10:47:24

      Salut,

      Ligne 59 utilise plutôt compteur <= n, tu ne veux pas placer de mines si compteur dépasse n (c'est peut-être pour ça que ça plantait, tu rentrais dans une boucle infinie).

      A quoi sert la boucle ligne 62 ? Elle place n mines au même endroit.

      • Partager sur Facebook
      • Partager sur Twitter
        20 septembre 2021 à 13:18:12

        Lignes 40 à 44, pourquoi un clear uniquement de la plage B10:P24 ? a priori pas de limite de la taille de la grille

        Problème aussi ligne 47 (48), tu fais une boucle en utilisant l (c) comme variable, et tu réutilises ensuite en ligne 60 (61); 

        l et c ont donc en 60/61 la dernière valeur de la boucle précédente (p et g), et par leur valeur initiale (10,2)

        • Partager sur Facebook
        • Partager sur Twitter

        Démineur en VBA

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown