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.
Ensuite, double cliquer sur le fichier pour l'ouvrir dans Excel,
Puis, cliquer sur le bouton Activer la modification du bandeau de sécurité,
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
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 :
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 :
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
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 :
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 :
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
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 :
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.