IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Problème récursivité démineur


Sujet :

Windows Forms

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Problème récursivité démineur
    Bonjour j'essaye de créer un démineur en vb, et je galère. J'essaye, comme dans le démineur de windows, que quand le joueur clique sur une case où il n'y a pas de mines dans les cases adjacentes, celles-ci se dévoilent.

    Etant pas très doué , je me suis embrouillé les pinceaux et je me retrouve avec ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    If countmines = 0 Then
                    For c1 = 1 To cotegrille
                        For c2 = 1 To cotegrille
                            If cellules(c1, c2).Equals(sender) = True Then
                                Dim c3, c4 As Integer
                                c3 = c1 - 1
                                c4 = c2 - 1
                                While c3 <= c1 + 1
                                    While c4 <= c2 + 1
                                        If c3 <= cotegrille And c3 >= 1 And c4 <= cotegrille And c4 >= 1 And (c3 <> c1 Or c4 <> c2) Then
                                            mineClick(cellules(c3, c4), e)
                                        End If
                                        c4 += 1
                                    End While
                                    c3 += 1
                                End While
                            End If
                        Next
                    Next
                End If
    Donc en gros si la case n'a pas de mines à côté, je trouve la case qui a été cliqué dans mon tableau à 2 dimensions représentant la grille du jeu.

    C'est là qu'arrivent les problèmes. Je veux que ça refasse la même chose dans toutes les cases à côté mais vu qu'avec le "mineClick(cellules(c3, c4), e)", le prog se casse de la boucle, ça ne marche qu'avec la case en haut à gauche, sauf si celle-ci a au moins une mine adjacente.... Normal me direz-vous mais je vois pas comment faire autrement.

    Désolé, c'est tellement brouillon que ça doit pas être facile à comprendre pour qqun qui n'a pas écrit le code.

    Merci d'avance

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    il nous manque 2 ou 3 choses dans ton code pour pouvoir suivre un peu
    e il vient d'où ? tu es dans quel sub ?


    sinon à vu de nez j'aurais utilisé un dictionary (of point, boolean)
    voir même une petite classe avec les coordonnées, la valeur de cochation et la référence vers le controle lié

    enfin les tableaux c'est pas toujours pratique ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Points : 311
    Points
    311
    Par défaut
    Citation Envoyé par sperot51 Voir le message
    il nous manque 2 ou 3 choses dans ton code pour pouvoir suivre un peu
    e il vient d'où ? tu es dans quel sub ?


    sinon à vu de nez j'aurais utilisé un dictionary (of point, boolean)
    voir même une petite classe avec les coordonnées, la valeur de cochation et la référence vers le controle lié

    enfin les tableaux c'est pas toujours pratique ...
    +1

    Une classe qui représente une case,
    une classe qui représente ta grille avec une méthode qui te retourne chaque case N, S, E, W, NE, NW, SE, SW pour une case donnée.
    Ca part de là !!
    Il y a toujours au moins deux solutions à un problème.

    http://software-design-development.blogspot.com/

  4. #4
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Points : 311
    Points
    311
    Par défaut
    De plus, ton problème n'a rien à voir avec de la récursivité.
    Tu as 4 niveaux de boucles for imbriquées
    Il y a toujours au moins deux solutions à un problème.

    http://software-design-development.blogspot.com/

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Déjà merci pour vos réponses

    il nous manque 2 ou 3 choses dans ton code pour pouvoir suivre un peu
    e il vient d'où ? tu es dans quel sub ?
    Voilà la sub complète :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    Private Sub mineClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
     
            sender.visible = False
            Dim caseimg As New PictureBox
            With caseimg
                caseimg.Height = 20
                caseimg.Width = 20
                caseimg.Location = sender.location
            End With
     
            If Array.IndexOf(mine, sender.location) <> -1 Then
                caseimg.BackgroundImage = Image.FromFile(Application.StartupPath + "/mine.jpg")
                MessageBox.Show("Perdu !")
            Else
                Dim countmines As Integer = count(sender.location)
                caseimg.BackgroundImage = Image.FromFile(Application.StartupPath + "/" + countmines.ToString + ".jpg")
                If countmines = 0 Then
                    For c1 = 1 To cotegrille
                        For c2 = 1 To cotegrille
                            If cellules(c1, c2).Equals(sender) = True Then
                                Dim c3, c4 As Integer
                                c3 = c1 - 1
                                c4 = c2 - 1
                                While c3 <= c1 + 1
                                    While c4 <= c2 + 1
                                        If c3 <= cotegrille And c3 >= 1 And c4 <= cotegrille And c4 >= 1 And (c3 <> c1 Or c4 <> c2) Then
                                            mineClick(cellules(c3, c4), e)
                                        End If
                                        c4 += 1
                                    End While
                                    c3 += 1
                                End While
                            End If
                        Next
                    Next
                End If
            End If
     
            Me.Controls.Add(caseimg)
     
        End Sub
    sinon à vu de nez j'aurais utilisé un dictionary (of point, boolean)
    voir même une petite classe avec les coordonnées, la valeur de cochation et la référence vers le controle lié
    Pour le dictionnary, je ne connais absolument pas. C'est quoi la différence par rapport à un tableau?

    Une classe qui représente une case,
    une classe qui représente ta grille avec une méthode qui te retourne chaque case N, S, E, W, NE, NW, SE, SW pour une case donnée.
    Ca part de là !!
    En effet ça résoudrait mon problème. Je vais essayer de voir comment faire ça . Jconnais pas trop l'objet

    De plus, ton problème n'a rien à voir avec de la récursivité.
    Tu as 4 niveaux de boucles for imbriquées
    Et oué je sais, je suis pas arrivé à l'écrire autrement , c'est vrai que c'est pas beau à voir

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    http://plasserre.developpez.com/vsommair.htm

    tout comme on ne fait d'omelette sans casser des oeufs, on ne fait de développement sans connaitre l'outil et ses possibilités
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Cool merci jme lance

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Mouais bon je suis arrivé à le faire marcher, mais c'est pas très propre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    Function afficherimagecase(ByVal cellule, ByVal c3, ByVal c4)
     
            cellule.visible = False
            Dim caseimg As New PictureBox
            With caseimg
                caseimg.Height = 20
                caseimg.Width = 20
                caseimg.Location = cellule.location
            End With
     
            If Array.IndexOf(mine, cellule.location) <> -1 Then
                caseimg.BackgroundImage = Image.FromFile(Application.StartupPath + "/mine.jpg")
                MessageBox.Show("Perdu !")
            Else
                Dim countmines As Integer = count(cellule.location)
                caseimg.BackgroundImage = Image.FromFile(Application.StartupPath + "/" + countmines.ToString + ".jpg")
                If countmines = 0 Then
                    For c1 = 1 To cotegrille
                        For c2 = 1 To cotegrille
                            If cellules(c1, c2).Equals(cellule) = True Then
                                For c3 = c1 - 1 To c1 + 1
                                    For c4 = c2 - 1 To c2 + 1
                                        If c3 <= cotegrille And c3 >= 1 And c4 <= cotegrille And c4 >= 1 And (c3 <> c1 Or c4 <> c2) Then
                                            If cellules(c3, c4).visible = True Then
                                                afficherimagecase(cellules(c3, c4), c3, c4)
                                            End If
                                        End If
                                    Next
                                Next
                            End If
                        Next
                    Next
                End If
            End If
     
            Me.Controls.Add(caseimg)
     
        End Function
    Merci en tout cas pour vos réponses.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Une ptite question me reste histoire de réduire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    If c3 <= cotegrille And c3 >= 1 And c4 <= cotegrille And c4 >= 1 And (c3 <> c1 Or c4 <> c2) Then
                                            If cellules(c3, c4).visible = True Then
                                                afficherimagecase(cellules(c3, c4), c3, c4)
                                            End If
                                        End If
    en un seul IF :
    Quel est l'équivalent en vb du && en php ?

    Merci d'avance

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème jeu Démineur
    Par Silvering dans le forum Débuter
    Réponses: 4
    Dernier message: 29/05/2011, 17h29
  2. [XL-2003] problème récursivité fonction
    Par diamond8 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/07/2009, 18h06
  3. Problème code Démineur
    Par Silvering dans le forum Général VBA
    Réponses: 1
    Dernier message: 14/12/2008, 21h08
  4. Problème récursivité avec gcc -Wall
    Par alcibiade dans le forum Débuter
    Réponses: 14
    Dernier message: 20/05/2008, 23h50
  5. Problème récursivité
    Par dtrack dans le forum C
    Réponses: 3
    Dernier message: 02/01/2008, 00h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo