Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Développer un jeu de réflexe
Cette
formation VBA Excel démontre comment interagir avec les cellules cliquées sur la feuille. Les cordonnées et attributs doivent être prélevés, dans des boucles de temps, afin d'aboutir cette application de rapidité.
Des cellules de différentes couleurs apparaissent et se positionnent aléatoirement. Elles restent visibles durant une courte durée. Dans l'intervalle, le joueur doit être capable de la cliquer, dans la mesure où il ne s'agit pas de la couleur interdite. Cette dernière est définie en début de partie. Elle est tirée au sort. Les points se cumulent à chaque clic validé et se décrémentent à chaque clic invalidé.
Source et concept
Pour développer ce jeu, nous proposons tout d'abord de réceptionner une ossature déjà conçue.
Nous découvrons un
classeur composé de deux
feuilles , nommées respectivement
Réflexe et
Scores . La
feuille Réflexe est celle du plateau de jeu délimité par la zone blanche. C'est dans cette zone que nous devons être capables de
générer aléatoirement des cases de couleur à cliquer.
Un clic sur le
bouton Go , dans la barre d'outils sur la gauche du
plateau de jeu , doit démarrer cette
génération aléatoire . Arbitrairement, nous définissons un temps de jeu limité à 1 minute. A l'issue, le score doit être consolidé et archivé dans la
feuille Scores . Sous le
bouton Stop qui doit permettre d'interrompre une partie, vous notez la présence d'une case de couleur. Elle doit varier à chaque participation. Elle représente la couleur interdite. Plus bas, dans cette même barre d'outils, une zone est prévue pour afficher le score actualisé à chaque coup.
Sur la droite du
plateau de jeu , vous notez la présence d'un
graphique épuré. Il est construit sur la base du petit tableau de synthèse de la
feuille Scores . Il s'agit de la
plage de cellules G4:H5 . Le meilleur score est extrait de la base d'archives sur sa gauche, grâce à la
fonction Excel Max . Le score en cours consiste en une simple égalité avec la cellule de la barre d'outils, sur la
feuille Réflexe .
Réaliser le raccourci clavier Alt + F11 ,
Nous basculons ainsi dans l'
éditeur de code VBA Excel . Il est aussi accessible par le biais du
bouton Visual Basic dans le ruban Développeur. Certaines instructions sont déjà présentes. En début de code, la
déclarative Option Explicit permet d'imposer la
déclaration des variables utilisées. Et précisément, le bloc qui suit introduit des
variables publiques :
Dim ligne As Byte: Dim colonne As Byte
Dim couleur As Byte: Dim couleur_nok As Byte
Dim arreter As Byte
Elles doivent porter les valeurs au-delà des bornes des procédures. C'est ainsi, durant toute une partie que nous reconnaîtrons les indices affectés à une cellule, par les
variables ligne et
colonne .
Dans l'enchaînement, trois procédures sont en attente de développement :
Sub bascule()
End Sub
Sub demarrer()
End Sub
Private Sub distribuer()
End Sub
La première est destinée à suspendre le jeu. La deuxième doit initier une partie et toutes les variables utiles pour assurer le bon déroulement. La dernière doit être appelée cycliquement, tant que la durée impartie n'est pas écoulée. C'est elle qui définit les couleurs et les emplacements des cases à attraper.
De plus, une
procédure évènementielle sera nécessaire. Elle aura pour mission d'intercepter le clic du joueur pour en déchiffrer les coordonnées. Grâce aux
variables publiques , notamment celles des couleurs, elle sera en mesure de définir l'attribution des points.
L'
évènement Excel permettant d'intercepter les
actions à la souris sur une
feuille est prépondérant dans ce
développement . Il a d'ailleurs été démontré par le
code VBA du jeu du casse briques .
Initialiser les variables de jeu
La
procédure demarrer doit être associée au
bouton Go . Nous proposons de la développer d'abord et de faire la liaison ensuite.
Dans la procédure Demarrer , ajouter les déclarations et affectations suivantes :
Sub demarrer()
Dim instant As Variant: Dim ligneS As Integer
Dim tab_Couleurs(5) As String: Dim nom As String
tab_Couleurs(0) = 'Vert': tab_Couleurs(1) = 'Bleu foncé': tab_Couleurs(2) = 'Jaune': tab_Couleurs(3) = 'Rose': tab_Couleurs(4) = 'Bleu clair'
Range('B9').Value = 0
arreter = 0
Range('B7').Interior.Color = Range('B6').Interior.Color
End Sub
La
variable instant est déclarée comme un
Variant . Elle n'est donc pas typée. Elle est destinée à être affectée à la
fonction Timer . Cette dernière revoie le temps qu'il est. C'est ainsi que nous pourrons borner la durée de jeu. Les
variables ligneS et
nom seront exploitées à l'issue de la partie pour enregistrer le score du joueur avec son nom, sur la dernière ligne de l'archive.
tab_couleurs est déclaré comme un
tableau de variables d'une capacité de cinq éléments. Il est utilisé dans l'enchaînement pour mémoriser les cinq couleurs utilisées. C'est grâce à lui que nous pourrons pointer sur la couleur interdite à extraire.
Ensuite,nous réinitialisons le score en
cellule B9 et la couleur en
B7 . Comme vous le savez, en
VBA Excel , c'est l'
objet Range qui permet de désigner une cellule passée en paramètre. Dès lors, sa
propriété Value accède à son contenu. De même, sa
propriété Interior permet de descendre jusqu'à sa
propriété dérivée Color . C'est ainsi que nous redéfinissons sa couleur de remplissage.
La
variable arreter est initialisée sur la valeur 0. Elle indique que le jeu est en cours. Le
bouton Stop devra la basculer sur la valeur 1. C'est ce signal qui indiquera au programme de mettre fin au traitement, pour terminer la partie. En l'état, nous l'exploitons donc comme une
variable booléenne . De fait, sa déclaration avec le
type Byte peut paraître surdimensionnée. Mais dans l'optique d'une évolution, nous pourrions ajouter une option. Elle consisterait à mettre la partie en pause. Dans ce cas, le
type booléen n'est plus suffisant.
Désormais, nous devons définir la couleur interdite et prélever l'information de temps.
Dans la procédure, à la suite du code précédent, ajouter les instructions suivantes :
...
Randomize
couleur_nok = Int(Rnd() * 5) + 4
MsgBox 'La couleur interdite est : ' & couleur_nok & '-' & tab_Couleurs(couleur_nok - 4)
Range('B7').Interior.ColorIndex = couleur_nok
instant = Timer
...
La fonction
VBA Randomize permet d'initialiser la gestion des nombres aléatoires sur l'horloge système. Dès lors, nous affectons la
variable couleur_nok sur une valeur numérique bornée. Elle est générée aléatoirement grâce à la
fonction Rnd . Il en résulte un nombre réel compris entre 0 et 1. Nous multiplions ce résultat par 5, pour les cinq couleurs. Il en résulte un nombre réel compris entre 0 et 5. Nous ne conservons que la partie entière grâce à la
fonction VBA Int . Nous obtenons donc un nombre entier compris entre 0 et 5. Le 5 est exclu. Nous incrémentons ensuite ce résultat de quatre unités (+4). En effet, le premier indice de couleur à exploiter correspond au chiffre 4. Les autres se suivent.
Grâce à la
fonction MsgBox , nous affichons ce résultat à l'écran, à titre de test temporaire. En argument du
tableau de variables , nous retranchons ces quatre unités. La première couleur est située dans la première rangée. Et cette rangée est repérée par la position 0. Nous affectons cette couleur de remplissage à la
cellule B7 , située dans la barre d'outils. C'est elle qui rappellera au joueur, quelle couleur ne doit pas être cliquée, sous peine de sanction.
Enfin, nous prélevons l'information de temps, grâce à la
fonction Timer . Cette donnée, précisée à la seconde près, est stockée dans la
variable instant .
Il est temps de procéder au premier essai.
Enregistrer les modifications (CTRL + S) et basculer sur la feuille Excel (ALT + F11),
Cliquer droit sur le bouton Go , dans la barre d'outils, sur lagauche du plateau de jeu,
Dans le menu contextuel, choisir Affecter une macro ,
Dans la boîte de dialogue qui apparaît, sélectionner la procédure demarrer ,
Désormais, un clic sur ce bouton doit déclencher le code que nous venons d'écrire.
Cliquer sur le bouton Ok de la boîte de dialogue pour valider ce lien,
Cliquer ensuite sur une cellule vide de la feuille pour désactiver la sélection du bouton,
Puis, cliquer sur le bouton Go ,
Aussitôt, la boîte de dialogue commandée par la
fonction MsgBox , se déclenche. Elle indique bien la couleur choisie au hasard. A validation, elle affecte le fond de la
cellule B7 . La partie peut donc démarrer.
Revenir dans l'éditeur de code Visual Basic Excel ,
Définir le temps de jeu
Désormais, nous devons enclencher une
boucle de traitement sur une durée d'une minute, soit de 60 secondes. Sa mission est de commander l'affichage et le positionnement aléatoire des cases de couleur à cliquer.
Passer la ligne du MsgBox en commentaire en la préfixant d'une apostrophe,
Puis, à la suite du code précédent, ajouter les instructions suivantes :
...
Do While Timer < instant + 60
distribuer
DoEvents
If arreter = 1 Then Exit Do
Loop
If arreter = 1 Then Exit Sub
...
Nous initions donc une
boucle Do Loop . Elle poursuit son traitement tant que les 60 secondes ne sont pas atteintes (
Timer < instant + 60 ). Elle passe la main à la
procédure distribuer . C'est elle, à chaque passage dans la
boucle , donc sur une durée de partie de 60 secondes, qui doit générer les cases de couleur. L'
instruction VBA DoEvents permet de rendre la main. C'est ainsi que le joueur pourra interagir, malgré le traitement en cours. Si d'aventure l'utilisateur a cliqué sur le
bouton Stop (arreter = 1), nous sortons de la boucle (Exit Do), pour confirmer ensuite l'arrêt du traitement (
Exit Sub ).
Récolter et consolider les résultats
Au sortir de la
boucle , la partie est donc terminée. Et même si nous n'avons pas encore codé les instructions essentielles, celles de la
procédure distribuer , nous proposons de terminer le développement de la
procédure demarrer . Il s'agit de compléter le tableau de la feuille Scores en ajoutant les nouvelles données à la suite.
L'énumération débute à partir de la ligne 5. Elle doit se poursuivre en dessous, à partir de la première cellule vide détectée. Le nom, les points obtenus et la date sont nécessaires.
A la suite du code précédent, ajouter les instructions VBA suivantes :
...
ligneS = 5
While Sheets('Scores').Cells(ligneS, 3) <> ''
ligneS = ligneS + 1
Wend
nom = InputBox('Votre prénom s'il vous plaît ?')
If nom <> '' Then
Sheets('Scores').Cells(ligneS, 2).Value = nom
Sheets('Scores').Cells(ligneS, 3).Value = Range('B9').Value
Sheets('Scores').Cells(ligneS, 4).Value = Now
End If
...
Nous initialisons la
variable ligneS sur l'indice 5, soit sur la ligne à partir de laquelle débute l'énumération. Nous enclenchons une boucle
destinée à parcourir toutes les lignes de la première colonne, à la recherche de la première cellule vide (Cells(ligneS, 3) <> ''), soit du point de départ pour la nouvelle inscription. Nous prenons soin de préfixer les cellules désignées du nom de la feuille (Sheets('Scores')). En effet, le
code VBA est attaché à lapremière des deux, la
feuille Réflexe . Tant qu'une cellule est renseignée, nous incrémentons la variable de boucle (ligneS = ligneS + 1), pour poursuivre la recherche.
Lorsque la
boucle est terminée, la ligne de la première cellule de réception est trouvée. Nous pouvons donc l'exploiter. Grâce à la
fonction VBA InputBox , nous prélevons le nom de l'utilisateur. Cette boîte de dialogue offre en effet une zone de saisie en guise de réponse. Si le nom est bien renseigné (
If nom <> '' Then ), nous procédons à l'inscription des informations dans les colonnes respectives, en pointant sur la ligne trouvée (ligneS). Notez l'emploi de la
fonction VBA Now pour retourner l'information sur la date du jour, avec la précision sur l'heure.
Le code complet de la
procédure demarrer est donc le suivant :
Sub demarrer()
Dim instant As Variant: Dim ligneS As Integer
Dim tab_Couleurs(5) As String: Dim nom As String
tab_Couleurs(0) = 'Vert': tab_Couleurs(1) = 'Bleu foncé': tab_Couleurs(2) = 'Jaune': tab_Couleurs(3) = 'Rose': tab_Couleurs(4)= 'Bleu clair'
Range('B9').Value = 0
arreter = 0
Range('B7').Interior.Color = Range('B6').Interior.Color
Randomize
couleur_nok = Int(Rnd() * 5) + 4
'MsgBox 'La couleur interdite est : ' & couleur_nok & '-' & tab_Couleurs(couleur_nok - 4)
Range('B7').Interior.ColorIndex = couleur_nok
instant = Timer
Do While Timer < instant + 60
distribuer
DoEvents
If arreter = 1 Then Exit Do
Loop
If arreter = 1 Then Exit Sub
ligneS = 5
While Sheets('Scores').Cells(ligneS, 3) <> ''
ligneS = ligneS + 1
Wend
nom = InputBox('Votre prénom s'il vous plaît ?')
If nom <> '' Then
Sheets('Scores').Cells(ligneS, 2).Value = nom
Sheets('Scores').Cells(ligneS, 3).Value = Range('B9').Value
Sheets('Scores').Cells(ligneS, 4).Value = Now
End If
End Sub
Générer aléatoirement les cases de couleur
Désormais, nous devons nous concentrer sur le développement de la
procédure distribuer . Elle est appelée à chaque passage dans la
boucle que nous avons programmée précédemment. Durant 60 secondes, à intervalles de temps variables, elle doit placer des cases dont la couleur est définie au hasard. Vous l'avez compris, la génération aléatoire est une fois de plus à l'honneur.
Dans les bornes de la procédure distribuer, ajouter les déclarations et affectations suivantes :
...
Dim tampo As Variant: Dim delai As Double
Randomize
ligne = Int(Rnd() * 6) + 4
colonne = Int(Rnd() * 6) + 4
couleur = Int(Rnd() * 5) + 4
...
La
variable tampo doit servir à prélever l'information de temps, afin de définir des intervalles aléatoires. C'est pourquoi nous déclarons une
variable delai . A chaque appel, la durée qui lui est affectée, doit varier.
Le plateau de jeu débute à partir de la ligne 4 et de la colonne D, soit la quatrième. Il s'étend sur 6 cases en largeur comme en hauteur. C'est pourquoi, nous faisons varier les indices de ligne et de colonne en conséquence. Une fois encore, pour exploiter cette
fonction Rnd , nous prenons soin d'initialiser cette génération grâce à la
fonction Randomize . De la même façon, nous définissons une
couleur aléatoire , entre les bornes des indices que nous avions définis.
Maintenant, il s'agit de créer ces intervalles de temps et de générer ces cases.
Dans la fonction distribuer, Ã la suite du code VBA, ajouter les instructions suivantes :
...
Cells(ligne, colonne).Interior.ColorIndex = couleur
tampo = Timer
delai = (Rnd() + 1.3) / 2
Do While Timer < tampo + delai
DoEvents
Loop
Cells(ligne, colonne).Interior.ColorIndex = 2
...
Nous commençons par affecter le fond de la cellule désignée au hasard, de cette couleur aléatoire. Nous prélevons l'information de temps dans la
variable tampo . Puis, nous définissons un délai d'apparition compris entre 0,65 et 1,15 seconde ((Rnd() + 1.3) / 2). Nous conservons la couleur appliquée durant ce laps de temps, grâce à une
boucle Do While . Une fois encore, l'
instruction DoEvents est nécessaire pour rendre la main au joueur pendant le traitement. C'est ainsi qu'il est autorisé à cliquer sur les cases. Nous n'avons d'ailleurs pas encore traité cette interaction avec le joueur. Après ce délai, donc une fois la boucle fermée, nous remplissons de nouveau la cellule de blanc (ColorIndex = 2). Nous donnons l'illusion qu'elle disparaît.
Nous pouvons réaliser un petit essai intermédiaire sur l'enchaînement des cases de couleur générées.
Enregistrer les modifications (CTRL + S) et basculer sur la feuille Excel ,
Cliquer sur le bouton Go pour simuler le lancement d'une partie,
Des couleurs aléatoires sont effectivement proposées, sur des emplacements choisis au hasard, pendant un laps de temps variable. Ces emplacements sont toujours situés à l'intérieur du plateau de jeu. Pour l'instant, les clics du joueur ne sont pas pris en compte. A l'issue des 60 secondes, le traitement s'arrête. Le code complet de la
procédure distribuer est donc le suivant :
Private Sub distribuer()
Dim tampo As Variant: Dim delai As Double
Randomize
ligne = Int(Rnd() * 6) + 4
colonne = Int(Rnd() * 6) + 4
couleur = Int(Rnd() * 5) + 4
Cells(ligne, colonne).Interior.ColorIndex = couleur
tampo = Timer
delai = (Rnd() + 1.3) / 2
Do While Timer < tampo + delai
DoEvents
Loop
Cells(ligne, colonne).Interior.ColorIndex = 2
End Sub
Gérer les cellules cliquées en VBA Excel
Il est temps de comptabiliser les points. Et pour cela, nous devons être en mesure de connaître les
coordonnées de la cellule cliquée par l'utilisateur. Dès lors, nous pourrons prélever sa couleur pour la comparer à la palette autorisée. C'est ainsi que nous pourrons incrémenter ou décrémenter le score du joueur.
Revenir dans l'éditeur de code Visual Basic Excel ,
En haut de l'éditeur, déployer la première liste déroulante, celle de gauche,
Dans l'énumération, choisir l'objet Worksheet ,
Avec la seconde liste déroulante, choisir l'évènement SelectionChange ,
Cet enchaînement d'actions a pour effet de créer la procédure évènementielle suivante :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
End Sub
L'
objet Worksheet désigne la feuille à laquelle le code en cours est associé. Et comme le prouve l'explorateur de projet, sur la gauche de l'écran, il s'agit bien de la feuille de jeu
Réflexe . L'
évènement SelectionChange associé parle de lui-même. C'est lui qui se déclenche dès qu'une sélection est opérée, en d'autres termes, lorsqu'une cellule est cliquée. Et cette
procédure évènementielle transmet une
variable en paramètre. Elle est nommée
Target et il s'agit d'un objet de
type Range . La cible ainsi définie n'est autre que la cellule cliquée. Nous allons pouvoir exploiter ses propriétés pour connaître son emplacement, par sa ligne et sa colonne.
A l'intérieur des bornes de la procédure évènementielle , ajouter le code VBA suivant :
...
Dim Lig As Byte: Dim Col As Byte
Lig = Target.Row: Col = Target.Column
If (Cells(Lig, Col).Interior.ColorIndex = couleur_nok) Then
If (Range('B9').Value > 0) Then
Range('B9').Value = Range('B9').Value - 1
End If
ElseIf (Cells(Lig, Col).Interior.ColorIndex = couleur) Then
Range('B9').Value = Range('B9').Value + 1
End If
...
Nous déclarons tout d'abord les deux
variables nécessaires pour mémoriser les coordonnées de la cellule cliquée. Et, ce sont bien entendu les
propriétés respectives Row et Column qui permettent de réaliser l'affectation. Maintenant que la cellule est identifiée, nous pouvons accéder à ses
propriétés . C'est pourquoi, nous enclenchons une
instruction conditionnelle destinée à comparer sa couleur avec celle qui est interdite (ColorIndex = couleur_nok). Si elles correspondent, nous décrémentons le score mémorisé en cellule B9, dans la mesure où il n'est pas déjà nul (If(Range('B9').Value > 0) Then). Dans le cas contraire bien entendu, nous incrémentons le score du joueur.
Le développement de ce petit
jeu de réflexe est quasiment terminé. Mais avant de le tester, nous devons rendre fonctionnel le bouton permettant de stopper la partie.
Dans les bornes de la procédure bascule , ajouter les deux instructions suivantes :
...
arreter = 1
Range('B7').Interior.Color = Range('B6').Interior.Color
...
Nous modifions la valeur de la variable d'arrêt. Comme vous le savez, elle est exploitée dans la
procédure demarrer pour sortir de la boucle et mettre fin au traitement ensuite. Puis, nous réinitialisons l'indicateur de couleur en
cellule B7 . Une nouvelle partie est ainsi prête.
Enregistrer les modifications et basculer sur la feuille Excel ,
Affecter la procédure bascule au bouton Stop ,
Cliquer sur le bouton Go pour démarrer le jeu,
Puis, tenter de cliquer sur les cases de couleur autorisées,
Comme vous le remarquez, le score s'actualise en bas de la barre d'outils, à chaque clic réussi. Dans le même temps, ce score est graphiquement et dynamiquement mis en valeur, sur la droite du plateau de jeu. Il est confronté au meilleur total de points réussi.
A l'issue, une boîte de dialogue se déclenche. A validation de votre prénom, les résultats sont archivés dans la
feuille scrore .
Il s'agit donc d'un petit jeu intéressant pour tester vos réflexes et votre rapidité. Et comme vous l'avez remarqué, le
code VBA est relativement simple.