Recursivité du démineur

missmagou Messages postés 4 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 26 mai 2005 - 26 mai 2005 à 10:13
missmagou Messages postés 4 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 26 mai 2005 - 26 mai 2005 à 17:33
Bonjour à tous,

Voila je suis en train de faire un ptit démineur en vb mais je bloque sur un ptit probleme:

quand le joueur click sur une case vide, celle ci doit découvrir les
autres cases vides aux alentours mon soucy c'est que je n'y arrive pas,
je vois pas du tt comment je peux faire.

Merci

5 réponses

econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
26 mai 2005 à 10:21
Attention, ceci est du pseudocode.

J'espère qu'il est suffisamment lisible.

Il faut faire attention au bordures de ton tableau dans le calcul des
variables indiceCaseAuDessus, indiceCaseADroite, indiceCaseAuDessous,
indiceCaseAGauche.



Mais au moins, tu as là la description de la récursivité.



Sub DecouvreCase(indiceCase As Long)

Decourvrir la case d'indice indiceCase

If nombreDeMinesVoisines(indiceCaseAuDessus) = 0 Then

DecouvreCase indiceCaseAuDessus

End If

If nombreDeMinesVoisines(indiceCaseADroite) = 0 Then


DecouvreCase indiceCaseADroite


End If


If nombreDeMinesVoisines(indiceCaseAuDessous) = 0 Then



DecouvreCase indiceCaseAuDessous



End If


If nombreDeMinesVoisines(indiceCaseAGauche) = 0 Then



DecouvreCase indiceCaseAGuche



End If



End Sub


Manu
-------------------------------------------
Une question bien posée, c'est une chance de réponse bien adaptée.
0
3615jenveux Messages postés 41 Date d'inscription vendredi 6 février 2004 Statut Membre Dernière intervention 11 août 2008
26 mai 2005 à 10:35
Comme tu l'évoque, il faut utiliser la récursivité (une fonction ou une routine qui s'appelle elle-même).
Ecrit une fonction dans laquelle :
Le principe est de tester la case cliquer (est-ce que elle est vide et que l'on peut l'effacer). Et ensuite tu teste toutes les cases a côté (soit 8), et si un de ces 8 tests est positif, tu rapelle la fonction (alors que tu est déjà dans ta fonction).
Cette fonction ce déclenchera donc un nombre de fois plus ou moins important, et ainsi tu sera certain de passer en revue toutes les cases.

Voici une possibilité :
Attention le code découle aussi de la manière dont tu gère les choses. Moi j'avais des controles bouton groupé qui faisaient les cases. J'avais donc une fonction me permettant de passer du numéro d'index d'un bouton a des coordonnées x et y (CoordonnéesCaseJ), et une fonction inverse NoCaseJ. Xmap et Ymap sont les bords du jeu. IndiceY et IndiceX sont des variables me permettant de calculer en coordonnées les 8 cases adjacente d'une case (IndiceY(0)=0, IndiceX(0)=1,IndiceY(1)=1,IndiceX(1)=0,IndiceY(2)=0,IndiceX(2)=-1,...)

Private Sub Gangrène(No As Integer) ' procédure récurcive
' algo effacant ttes les cases vide conjointe lorsque le joueur
' clique sur l'une d'entre elles


Dim Cycle3 As Integer ' for
Dim t(1) As Integer ' contient les coordonnées 0=>y, 0=>x
Dim DécalageCaseTampon As Integer ' tampon contenant successivement les no des 4 cases cardinale adjacente a celle en cours d'analyse



For Cycle3 = 0 To 7
t() = CoordonnéesCaseJ(No, Xmap, Ymap) ' converti le no de case en coordonnées

t(0) = t(0) + IndiceY(Cycle3) ' coordonnées case adjacente en y
t(1) = t(1) + IndiceX(Cycle3) ' coordonnées case adjacente en x

DécalageCaseTampon = NoCaseJ(t(1), t(0), Xmap, Ymap) ' converti les coordonnées en n° de case

If DécalageCaseTampon <> -1 Then ' on est pas en dehors de la map
If ValeurCase(DécalageCaseTampon) = 0 And CaseJ(DécalageCaseTampon).Visible <> False Then ' une autre case conjointe est vide (sauf si c'est une case déjà effacé)
If Cycle3 <= 3 Then ' seulement les 4 coordonnées cardinales pour effacer les cases
CaseJ(DécalageCaseTampon).Visible = False ' rendre invisible le bouton
Call Gangrène(DécalageCaseTampon) ' appel récursif de la procédure
End If
Else
CaseJ(DécalageCaseTampon).Caption = ValeurCase(DécalageCaseTampon) ' affiche les chiffres dans les cases conjointes aux cases vides
End If
End If
Next Cycle3


End Sub

Bon courage !
0
missmagou Messages postés 4 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 26 mai 2005
26 mai 2005 à 11:52
Tout d'abord merci pour vos réponses.

Econs: j'ai bien compris ton code mais quand on clique sur une case,
cela va me balayer uniquement les 8 cases vides qui sont autours et pas
toutes les autre cases vides autour non?(je c pas si je me suis bien
expliquée dsolée)

3615jenveux: est ce que ton code correspond uniquement à la procedure
gangrene si oui, c'est possible d'appeler cette procedure à
l'interieure d'elle mm?(la encore je c pas si ma question est
comprehensible ms c vrai que j'ai un peu de mal à m'expliquer sorry)

En tt les cas merci à tous les 2 d'avoir pris du tps pr me repondre
0
tbbuim1 Messages postés 940 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 3 février 2011 9
26 mai 2005 à 11:55
TBBUIM
0

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

Posez votre question
missmagou Messages postés 4 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 26 mai 2005
26 mai 2005 à 17:33
excuse 3615jenveux j suis un peu à l'ouest ces tps ci dc oublie
ma question un peu idiote lol et merci pour ton code ca correspond à ce
que je cherchais
0
Rejoignez-nous