2015-03-01
- correction cosmétique
   du modèle du Blog
  ° diaporama occupant
     tout l'écran
  ° message défilant
     démarrant du bord
     droit sous Chrome

Trognon le chaton

En lumière..

Des articles Lesbiens: Camellia Rose ,
Lipsticks [:* Fanny] , Lisa
et des Histoires signées MyLzz59: Mylène écrit (http://mylene-ecrit.blogspot.fr)

Des articles Trans-*: Ma Vie En Rose ,
Wawa's Smile , FtM ? , Thomas Beatie 2

Des Coups de Coeur: EXL ,
Kashimashi ~Girl meets Girl~ ,
Sa Majesté Freddie , Mon Côté Midinette
des Coups de Gueule: Karol relève-toi ,
BlondeBox , 1 pub 2 mR2 [bon courage :D]
et des Coups de Blues: Pile 1 an ,
Baisser de Rideau , Interlude

Du Visual Basic (VB6-VBA): Mlle Hanoï
Boules , Bombes , AnaClock , DigiClock ,
Tris (tetris) ,
et de la Bricologie: Real Barbie Girl

Pis pour les plus grand(e)s, des
S*X TOYS:
DildoBike , Tech To Nique

Et même parfois de la vraie vie:
Impressions de Voyage (Maroc) ,
Chez Mickey , La Tonnelle ,
Nous Nous Sommes Rencontrées

.

La vraie Taunie ..


... Tu me manques :'(


Notre Taz :*




Clock & Zik..

Idée Cadeau..


Attrape-Mouches

dyke goudou gouine homo homoaffectivité homoaffectivity homosexual homosexualité homosexuality homosexuel homosexuelle inverti invertie lesbian lesbianism lesbianisme lesbien lesbienne lez néovagin neovagina réassignation saphique saphisme sapphic sapphism trans transgender transgenre transidentité transidentity transsexalité transsexality transsexual transsexualism transsexualisme transsexuel transsexuelle tribade tribadisme vaginoplastie ...

Le combat continue..

MyLzz59..

.. @gmail.com

Blog français

Ca va encore mieux en le disant.. Important
## Comment "marche" ce Blog / Comment laisser un Commentaire ##

Et pour finir,
Mylène écrit (http://mylene-ecrit.blogspot.fr)N'oubliez pas de visiter aussi
mon blog d'histoires ====>



-MyLzz59-

mercredi 21 avril 2010

Bombes (P)03/2010 MyLzz59

(Rubrique VB-VBA)

0) Intro

A la fin du mois dernier, je vous proposais de me suivre pas à pas dans la réalisation d'un jeu en Visual Basic sous Excel, une feuille dans laquelle il fallait double-cliquer judicieusement sur des boules (enfin, des cases colorées) afin d'en supprimer le plus grand nombre.

J'ai réalisé ce p'tit jeu à la demande de notre fille, comme je l'ai précisé dans l'article correspondant. Un jeu sympathique, et fort simple à réaliser, dont la seule difficulté n'a rien de technique, c'est la compréhension de la notion de "récursivité".

Petit aparté à l'attention de celles et ceux à qui cette notion ne "parle" pas..

L'exemple incontournable lorsque l'on parle de "récursivité" est la fonction mathématique (nan, restez, n'ayez pas peur ) nommée "factorielle". Kêkseksa ? La factorielle d'un nombre entier positif est le produit de tous les nombres entiers depuis 1 jusqu'à lui:
Factorielle(N) = N! = 1x2x3x4x...x(N-1)xN (simplement ça ).
Exemple: Factorielle(5) = 5! = 1x2x3x4x5 = 120

Certes, il n'est pas nécessaire de coder une récursivité pour résoudre une factorielle (sans utiliser la fonction intégrée )

N = Int(Abs(Val(InputBox("Nombre ?")))) ' N entier positif
F = 1 : For T = 1 To N : F = F * T : Next T
MsgBox "Facto(" + Cstr(N) + ") = " + Cstr(F) 
Cependant, réécrivons 5! et ..4!
Factorielle(5) = 5! = 1x2x3x4x5 = 120
Factorielle(4) = 4! = 1x2x3x4 = 24

Sans avoir fait de hautes études mathématiques, il saute aux yeux que la factorielle de 5 est 5 fois la factorielle de 4. La "récursivité", c'est ça Il vous faut deux choses: une relation qui lie les éléments entre eux (ici N! = (N-1)! x N) et une porte de sortie (ici 0! = 1).
Function Factorielle(ByVal N As Long) As Long
If N<0 n="" or="">12 Then Factorielle = -1 : Exit Function ' Erreurs
Factorielle = IIf(N>0, Factorielle(N-1) * N, 1)
End Function
Comment ça marche ? Déjà un mot sur le bridage de N entre 0 et 12, car le résultat d'une factorielle "grimpe" vite, et 13! dépasse la capacité d'un entier long, c'est tout (oui, il existe d'autres formats..) Supposons que l'on demande Factorielle(5). La fonction s'exécute une première fois. Elle doit renvoyer Factorielle = Factorielle(5-1) * 5. VBA "met en attente" Factorielle(5), crée une nouvelle copie (appelée instance) de Factorielle, à laquelle il demande Factorielle(4), laquelle (idem) sera clônée pour calculer Factorielle(3), et ce jusqu'à Factorielle(0). Cette dernière renvoie la valeur 1 à Factorielle(1), qui peut finir son calcul et renvoyer son résultat (1) à Factorielle(2), etc.. Factorielle(4) qui renvoie 24 à Factorielle(5), laquelle nous répond son 120

1) Le Jeu

J'ai concocté un second jeu, basé sur (quasiment) la même feuille interface Excel, et dont l'objet ne sera pas une surprise, puisqu'il est mentionné dans l'article précédent, près de l'exemple de la factorielle car il utilise lui aussi une récursivité, il s'agit d'un ..Démineur

Rappel du principe: dans notre aire de jeu est dissimulée aléatoirement une certaine quantité de bombes. Le but du jeu est de toutes les retrouver, et les marquer d'un drapeau, sans en faire exploser une seule. Pour cela, l'utilisateur(trice) dispose de deux actions, mettre/enlever un drapeau, et dévoiler une case cachée. Dévoiler une bombe la fait exploser, et le jeu est terminé. Une case marquée d'un drapeau est "protégée". Le jeu est gagné lorsque soit exactement toutes les bombes ont été retrouvées, soit il ne reste plus de cases non dévoilées, excepté peut-être seulement des bombes.

Le départ du Démineur consiste à "taper" alétoirement, en espérant trouver une zone vierge de bombe, et non une bombe. Si la case dévoilée ne contient pas de bombe, elle fournit une indication sur la présence ou non de bombes: la quantité de bombes présentes dans les huit cases qui l'entourent (imaginer la case au centre d'un carré de 3 x 3 cases), quantité comprise entre 0 (non affiché) et 8 (le maximum si elle est cernée).

Dans notre Démineur nous allons utiliser les deux actions suivantes:
- le clic droit pour mettre/enlever un drapeau
- le double-clic pour dévoiler une case
Dévoiler une case contenant zéro bombe dévoilera automatiquement (voilà notre récursivité ) toute la surface contiguë exemplte de bombe. J'ai volontairement omis la troisième action présente sur le Démineur inclus dans Windows, l'appui simultané des deux boutons de la souris, combinaison non gérée par Excel.

Voilà, on a fait le tour, entrons

a] Le Décor

Comme mentionné plus haut, il s'agit de celui du jeu précédent (Boules), à la barre d'état près, car les deux cellules fusionnées des libellés des compteurs sont agrandies d'une case chacune, pour accueillir les nouveaux libellés. ===> Code du Décor ICI.


Même recommandation, ne sauvegardez PAS le classeur au format ".xlsX", au risque de perdre le code VBA !!

(Rem: n'hésitez pas à vous référer à l'article décrivant le jeu précédent, pour les explications communes que je ne reprendrai pas ici )

2) Remplir l'Aire de Jeu

a] Définissons tout d'abord notre série de constantes en Zone Déclarations:

* Tit = "Bombes (P)03/2010 MyLzz59" => le titre du jeu
* Ym = 30, Xm = 40 => la taille (lignes, colonnes) de l'aire de jeu
* Nb = 100 => la quantité de bombes dissimulées, arbitraire
* Xt = 2 => abscisse de la cellule fusionnée du titre
* Xb = 18 => abscisse de la cellule fusionnée du nombre de bombes restantes
* Xc = 28 => abscisse de la cellule fusionnée du nombre de cases cachées
* Xr = 32 => abscisse de la cellule fusionnée du pseudo-bouton "Recommencer"
' -----------------
' Zone Déclarations
' -----------------
Const Tit = "Bombes (P)03/2010 MyLzz59"
Const Ym = 30, Xm = 40, Nb = 100, Xt = 2, Xb = 18, Xc = 28, Xr = 32
b] Nettoyage de l'Aire de Jeu: il est identique à précédemment, excepté l'inscription de deux informations cachées sous la barre d'état, dans une zone non accessible de la feuille Excel, à savoir une chaîne texte qui mémorise le contenu réel de l'aire de jeu, et le vrai compteur de bombes non encore marquées, nous les détaillerons plus loin.

Notez au passage que la protection de la feuille est également présente, mais déplacée dans une procédure "Prot", car elle sera utile à différents endroits du code, ce qui évitera de la dupliquer inutilement:
' -------------------
' SUB: Protéger (O/N)
' -------------------
Sub Prot(B As Boolean)
If B Then Sheets(1).Protect "" Else Sheets(1).Unprotect ""
End Sub
c] La boucle de remplissage. Nous allons employer ici un Tableau P(1 To Ym, 1 To Xm) de nombres entiers, similaire à l'aire de jeu. Au départ, toutes ses "cases" sont initialisées à zéro. La boucle (For T=) effectue les Nb (=100) placements de bombes, pour chaque l'on tire une "case" aléatoire (X=Int(Rnd*Xm)+1 et Y=Int(Rnd*Ym)+1) jusqu'à en trouver une qui ne soit déjà une bombe (Loop While)

Chacune de ces "cases" comptabilise le nombre de bombes qui l'entoure, concrètement de zéro (mini) à huit (maxi). Associons la notion de bombe à la valeur inutilisée neuf.

Parcourons le carré dont notre "case" est le centre. Dans les huit "cases" qui entourent la nôtre (si elles existent), incrémentons de un toutes les valeurs non bombes (non neuf).

La boucle de remplissage n'affiche rien dans l'aire de jeu.
' -----------------------
' Crée un Nouveau Terrain
' -----------------------
Sub Remplis()
Randomize Timer
Prot False
Cells(Ym + 5, 1).Value = "Z" + String$(Xm * Ym, "0")
Range(Cells(1, 1), Cells(Ym, Xm)).Interior.ColorIndex = 15
Range(Cells(1, 1), Cells(Ym, Xm)).ClearContents ' Nettoyage
For T = 1 To Nb
    Do: Y = Int(Rnd * Ym) + 1: X = Int(Rnd * Xm) + 1: Loop While PP(Y, X) = 9 ' Bombes
    For Y2 = Y - 1 To Y + 1: For X2 = X - 1 To X + 1
        If X2 >= 1 And X2 <= Xm And Y2 >= 1 And Y2 <= Ym Then
            If X2 <> X Or Y2 <> Y Then
                If PP(Y2, X2) < 9 Then PP(Y2, X2) = PP(Y2, X2) + 1 ' Incrément autour
            Else
                PP(Y, X) = 9 ' Place Bombe
            End If
        End If
    Next X2, Y2
Next T
Cells(Ym + 2, Xt).Value = Tit: Cells(Ym + 2, Xb).Value = Nb
Cells(Ym + 2, Xc).Value = Xm * Ym: Cells(Ym + 6, Xb).Value = Nb 'Marquages
Prot True: MsgBox "Bonne Chance ;)", vbInformation, Tit
End Sub
d] En fait, nous n'allons pas employer un Tableau P(1 To Ym, 1 To Xm) de nombres entiers (si, je sais ce que je dis ). Car un tel tableau, logé en mémoire vive (RAM) a le fâcheux défaut d'être perdu lorsque le programme s'arrête. En clair, l'on ne pourrait reprendre une partie commencée, en rouvrant le classeur sauvegardé, et il faudrait systématiquement générer une nouvelle partie à l'ouverture du classeur

Aussi, allons-nous simuler () ce tableau, sous la forme d'une chaîne de chiffres cachée (la voilà ) dans la feuille. Pour ce faire, nous allons coder une ..Propriété. Cette notion appartient au vocabulaire de la programmation objet (Visual Basic 6 n'est pas un langage orienté objet, car sa panoplie "objet" n'est que partielle), mais rien ne nous empêche de la "détourner" ici..

La procédure "Property Let" simule l'affectation d'une valeur à une pseudo-variable, alors que "Property Get" simule la relecture de la valeur de cette pseudo-variable. C'est pourquoi, dans le code ci-dessus, "PP(Y2, X2) = PP(Y2, X2) + 1" n'indique absolument pas que PP() n'est PAS le simple tableau annoncé en c]
' ---------------------------------------------------------------------
' Property Let: simule l'Ecriture de N [Integer] dans PP(Y,X) [Integer]
' ---------------------------------------------------------------------
Property Let PP(ByVal Y As Integer, ByVal X As Integer, ByRef N As Integer)
If X < 1 Or X > Xm Or Y < 1 Or Y > Ym Or N < 0 Or N > 9 Then Exit Property
Z$ = Cells(Ym + 5, 1).Value
Mid$(Z$, Xm * (Y - 1) + X + 1, 1) = CStr(N)
Cells(Ym + 5, 1).Value = Z$
End Property

' ---------------------------------------------------------------------
' Property Get: simule la Lecture de N [Integer] dans PP(Y,X) [Integer]
' ---------------------------------------------------------------------
Property Get PP(ByVal Y As Integer, ByVal X As Integer) As Integer
If X < 1 Or X > Xm Or Y < 1 Or Y > Ym Or N < 0 Or N > 9 Then PP = -1: Exit Property
PP = Val(Mid$(Cells(Ym + 5, 1).Value, Xm * (Y - 1) + X + 1, 1))
End Property
Rem: l'utilisation d'une Propriété n'était pas indispensable, et nous aurions pu nous "contenter" d'une Function Get_PP(ByVal Y As Integer, ByVal X As Integer) As Integer, et d'un Sub Let_PP(ByVal Y As Integer, ByVal X As Integer, ByRef N As Integer). Simplement je souhaitais introduire la propriété afin de garder une syntaxe d'utilisation similaire à celle d'un Tableau, alors qu'avec un Sub et une Function elle devient moins zolie

Tableau => P(Y2, X2) = P(Y2, X2) + 1
Property => PP(Y2, X2) = PP(Y2, X2) + 1
Sub/Fct => Let_PP Y2, X2, Get_PP(Y2, X2) + 1

3) Comment l'utilisateur(trice) joue..

a] Double-Click

Comme précédemment, nous allons intercepter le Double-Clic dans la Feuille, et substituer à la fonction d'édition de texte d'Excel l'appel de notre procédure d'ouverture de la case visée. La différence c'est que nous allons cette fois récupérer les coordonnées (Y,X) de la cellule grâce à Target. Nous retrouvons le "Cancel = True".

Le Double-Clic peut survenir dans l'aire de jeu, sur le bouton "Recommencer", ou ailleurs. Ailleurs, il ne se passera rien. Sur "Recommencer", une question proposera de réinitialiser le jeu en appelant "Remplis". Enfin, dans l'aire de jeu, nous invoquons un traitement récursif d'ouverture de la cellule, "Pop", que nous verrons plus loin, suivi d'une procédure (qui servira à deux reprises) vérifiant si le jeu est gagné, "TesteGagne". Ne pas oublier de déprotéger puis reprotéger la feuille..
' ------------------
' EVT: Teste la Zone
' ------------------
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Y = Target.Row: X = Target.Column: Cancel = True
If Y = Ym + 2 And X = Xr Then
    If MsgBox("Réinitialiser l'Aire de Jeu ?", _
        vbQuestion + vbYesNo + vbDefaultButton2, Tit) = vbYes Then Remplis
    Exit Sub
End If
If X < 1 Or X > Xm Or Y < 1 Or Y > Ym Then Exit Sub
Prot False: Pop Y, X: TesteGagne: Prot True
End Sub
b] Right-Click

Ce Jeu gère aussi une seconde action, le Clic Droit, afin de poser ou enlever les drapeaux sur les bombes supposées. VBA fournit ici aussi une procédure événementielle, "_BeforeRightClick", dont la syntaxe (imposée) est similaire à la précédente.

Le Clic Droit n'a d'effet que dans l'aire de jeu, et effectue une action fort simple: si la cellule (Target) est non dévoilée, alors on y place un drapeau, et l'on décrémente les compteurs de cases cachées et de bombes à trouver. Si la cellule contient un drapeau, alors on l'enlève au profit de l'état non dévoilé, et on incrémente les mêmes compteurs. Tout autre état de la cellule ne provoquera aucune action.

De la même façon, penser à déprotéger puis reprotéger la feuille, ainsi qu'à tester ensuite si le jeu est gagné.

Le moment est venu de vous parler du "vrai" compteur (caché) de bombes non encore marquées, qui n'est décrémenté que lorsque la case marquée d'un drapeau contient réellement une bombe (If PP(Y, X) = 9). Sachez déjà qu'il sert dans "TesteGagne", à détecter l'une des deux conditions permettant d'afficher "Gagné" sans obliger l'utilisateur(trice) à cliquer (double ou droit) la totalité de l'aire de jeu
' ------------
' EVT: Drapeau
' ------------
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Y = Target.Row: X = Target.Column: If X < 1 Or X > Xm Or Y < 1 Or Y > Ym Then Exit Sub
Select Case Target.Text
    Case "": T = 10: T2 = -1: GoSub SS1
    Case "O": T = 11: T2 = 1: GoSub SS1
End Select
Cancel = True: Exit Sub
SS1: Prot False: Colorie Y, X, 1 * T: Cells(Ym + 2, Xb) = Cells(Ym + 2, Xb) + T2
If PP(Y, X) = 9 Then Cells(Ym + 6, Xb) = Cells(Ym + 6, Xb) + T2
Cells(Ym + 2, Xc) = Cells(Ym + 2, Xc) + T2: TesteGagne: Prot True: Return
End Sub
c] Le Coloriage des Cellules

C'est la procédure dédiée "Colorie" qui va s'en charger. Nous allons lui fournir les coordonnées de la cellule, et ..un nombre entier représentant l'état à afficher:

* 0 => cellule dévoilée vierge de bombe (gris foncé)
* 1 à 8 => cellule dévoilée entourée d'une à huit bombes
* 9 => dévoiler une bombe (un "M" en police WingDings)
* 10 => afficher un drapeau (un "O" en police WingDings)
* 11 => remettre la cellule à l'état caché (supprimer le drapeau)
* 12 => comme 0, mais verte (pour l'état Gagné)
* 13 => comme 0, mais rouge (pour l'état Perdu)

Cette procédure modifie le contenu de la cellule (.Value), la police utilisée (.Font.Name), la couleur de la police (.Font.ColorIndex), et celle du fond de la cellule (.Interior.ColorIndex). L'usage du ColorIndex plutôt que Color rend compatibles les couleurs du jeu avec les versions antérieures à 2007..
' -----------------------------------------------------------------------------
' Sub: Colorie la Case (Y,X) en Fonction du Nombre de Bombes (ou autre..)
' ( N=0..8 ; N=9:Bombe ; N=10:Drapeau ; N=11:Cachée ; N=12:Gagné ; N=13:Perdu )
' -----------------------------------------------------------------------------
Sub Colorie(ByVal Y As Integer, ByVal X As Integer, ByRef N As Integer)
If X < 1 Or X > Xm Or Y < 1 Or Y > Ym Or N < 0 Or N > 13 Then Exit Sub
With Cells(Y, X)
    .Interior.ColorIndex = IIf(N = 13, 30, IIf(N = 12, 10, _
        IIf(N = 11, 15, IIf(N = 10, 19, IIf(N = 9, 3, IIf(N, 17, 16))))))
    .Font.ColorIndex = IIf(N = 13, 30, IIf(N = 12, 10, _
        IIf(N = 11, 11, IIf(N = 10, 11, IIf(N = 9, 1, IIf(N, 8, 16))))))
    .Font.Name = IIf(N > 8 And N < 11, "Wingdings", "Comic Sans")
    .Value = IIf(N > 11, "0", IIf(N = 11, "", IIf(N = 10, "O", IIf(N = 9, "M", CStr(N)))))
End With
End Sub
4) L'ouverture de la cellule ("Pop")

Cette procédure aura pour missions
- de découvrir la case visée
- de gérer le "Perdu" en cas de découverte d'une bombe
- d'ouvrir (en récursif) toute la zone contiguë de zéro bombe

Tout d'abord "Pop" va s'assurer que la cellule visée est dans l'aire de jeu, et qu'elle est non découverte. Entre autres pour protéger de l'explosion une bombe marquée d'un drapeau.

Si tout va bien, après avoir décrémenté le compteur de cases couvertes, intéressons-nous au contenu de la case visée, que l'on aura dévoilée.

* Si elle contient une bombe, le jeu est perdu, il doit s'arrêter. Le plus simple reste de découvrir toutes les cases restantes. Il faut aussi découvrir la bombe. Pourquoi ne pas découvrir toutes les bombes, même celles marquées d'un drapeau ?
If Cells(Y, X).Text = "" Or Cells(Y, X).Text = "O" Then Colorie Y, X, PP(Y, X)
Puis, pour matérialiser que le jeu est perdu, re-colorions en rouge (Colorie ,,13) toutes les cases zéro bombe.
If Cells(Y, X).Text = "0" Then Colorie Y, X, 13
* Si elle contient une des indications "1" à "8", tout est déjà fait.

* Si elle contient zéro, nous allons dégainer notre récursivité Comme pour la boucle de remplissage vue plus haut, parcourons le carré dont notre "case" est le centre. Dans toutes les cases dont la nôtre, si elles existent dans l'aire de jeu et sont couvertes, rappelons Pop
' ----------------------------------
' SUB: Découvrir une Case (Récursif)
' ----------------------------------
Sub Pop(ByVal Y As Integer, ByVal X As Integer)
If X < 1 Or X > Xm Or Y < 1 Or Y > Ym Then Exit Sub
If Cells(Y, X).Text <> "" Then Exit Sub
Colorie Y, X, PP(Y, X): Cells(Ym + 2, Xc) = Cells(Ym + 2, Xc) - 1
Select Case PP(Y, X)
Case 9 ' Bombe
    For Y = 1 To Ym: For X = 1 To Xm
        If Cells(Y, X).Text = "" _
            Or Cells(Y, X).Text = "O" Then Colorie Y, X, PP(Y, X)
        If Cells(Y, X).Text = "0" Then Colorie Y, X, 13
    Next X, Y
    MsgBox "<<<< BOOM >>>>" + vbCrLf + vbCrLf + "Vous avez perdu.. :(", vbCritical, Tit
Case 1 To 8 ' Découvrir
Case 0 ' Découvrir en Récursif
    For Y2 = Y - 1 To Y + 1: For X2 = X - 1 To X + 1
        If X2 >= 1 And X2 <= Xm And Y2 >= 1 And Y2 <= Ym Then
            If Cells(Y2, X2).Text = "" Then Pop Y2, X2
        End If
    Next X2, Y2
End Select
End Sub
5) La détection de l'état Gagné ("TesteGagne")

Voici la dernière étape de ce jeu, celle qui sera appelée après chacune des deux actions de l'utilisateur(trice), pour mémoire le double-clic ou le clic droit, la procédure qui vérifie si le jeu est gagné. La première idée qui vient à l'esprit, c'est de considérer comme gagné un jeu dans lequel il ne reste plus aucune case jouable, et exactement autant de drapeaux que de bombes. Certes, mais quel(le) joueur(se) trouverait amusant de devoir terminer de cliquer partout, une fois les bombes toutes trouvées ? Déjà pas moi

Aussi, je vous propose deux autres conditions de fin sur Gagné, basées sur nos trois compteurs disponibles. Rappel de nos compteurs:
* cases couvertes: démarre à (Xm x Ym), décrémenté à chaque case découverte, décrémenté à la pose d'un drapeau, ré-incrémenté à la suppression d'un drapeau.
* bombes restantes (visible): démarre à Nb, décrémenté à la pose d'un drapeau, ré-incrémenté à la suppression d'un drapeau, indépendamment du contenu réel de la case couverte.
* bombes réelles (caché): démarre à Nb, décrémenté à la pose d'un drapeau, ré-incrémenté à la suppression d'un drapeau, uniquement si la case couverte contient une bombe.

Condition 1: l'utilisateur(trice) a placé des drapeaux sur toutes les bombes, et nulle part ailleurs, les cases restantes ne sont plus que des cases sans bombe => les compteurs bombes restantes (visible) et bombes réelles (caché) sont tous deux à zéro.

Condition 2: l'utilisateur(trice) a dévoilé toutes les cases sauf des bombes (drapeaux ou pas) => cases couvertes = bombes restantes (visible).

Si l'une ou l'autre de ces conditions est vérifiée le jeu passera à l'état Gagné (et doit s'arrêter), nous allons découvrir toutes les cases restantes et re-colorions en vert (Colorie ,,12) toutes les cases zéro bombe (cf. Perdu)
' --------------
' Sub TesteGagne
' --------------
Sub TesteGagne()
If Cells(Ym + 2, Xb).Value = Cells(Ym + 2, Xc).Value Or _
    (Cells(Ym + 2, Xb).Value = 0 And Cells(Ym + 6, Xb).Value = 0) Then
    For Y = 1 To Ym: For X = 1 To Xm
        'If Cells(Y, X).Text = "" _
            or  Cells(Y, X).Text = "O" Then Colorie Y, X, P(Y, X)
        If Cells(Y, X).Text = "" _
            Or Cells(Y, X).Text = "O" Then Colorie Y, X, PP(Y, X)
        If Cells(Y, X).Text = "0" Then Colorie Y, X, 12
    Next X, Y
    MsgBox "<<<< BRAVO >>>>" + vbCrLf + vbCrLf + "Vous avez gagné.. :)", vbInformation, Tit
End If
End Sub
Le Code Complet de ce Jeu est disponible ICI..

-MyLzz59-

3 Commentaire(s):

Delph' a dit…
Et ben à tes souhaits !!! Et amusez vous bien lol ;)
Stéphane a dit…
Et bien Delph', t'apprécies pas les factorielles ? roooh, c'est tout plein de poésie pourtant!! ;-) :-D
Et ça, "N! = (N-1)! x N" c'est pas tout mignon! :p souviens toi de tes cours de statistiques et proba de term'!!!

Moi, ce que j 'adore dans cet article, ce sont les emoticones...j ai même un faible pour celui qui pouffe les mimines devant la bouche!! :D (celui là:
https://mail.google.com/mail/e/349) surtout remis dans son contexte ...il est présent deux fois ... ;-)
bon, je vois que je dérive un peu du sujet principal...
Alors, même si je n ai pas tout compris, j ai fait tourner le jeu!
c est une vraie prouesse..euh, non, pas que je sois arrivé à y jouer (quoique ... ;-) ) non. je parle de la créatrice du jeu ! :-) d arriver à faire un truc de ouf pareil!!!
allez...
Bisous à vous deux!
:*
Mylène (MyLzz59) a dit…
Houlà ! Mais c'est pas une quinte d'éternuements liée aux beaux jours qui reviennent, Delph' :D

Pis Taz qui fantasme sur les émoticônes :P

Bon, moi qui voulais montrer par ces articles que programmer un truc sympa c'est pas si compliqué qu'on pourrait le croire.. :(

..ben je dois me faire une raison: j'ai tout faux, là :'( Ca ne ressemble pas à un "alors finalement, c'était aussi couillon que ça ?" :'(

Bisous néanmoins :*
-MyLzz59-