formateur informatique

Jeu de réflexe en Visual Basic Excel

Accueil  >  Bureautique  >  Excel  >  Excel VBA  >  Jeu de réflexe en Visual Basic Excel
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux, voici son url absolue :

Pour l'intégrer sur votre site internet ou blog, vous pouvez l'embarquer :

Sujets et formations similaires :


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é.

Jeu de rapidité VBA Excel sur les cellules de couleur cliquées



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.

Plateau du jeu de réflexe en VBA Excel

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,
Associer le bouton de démarrage du jeu à une macro VBA Excel

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,
Test VBA Excel de couleur générée aléatoirement et affichée avec MsgBox

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.

Tableau des scores à implémenter en VBA Excel à la fin de la partie du jeu de réflexe

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,
Générer et placer aléatoirement des cases de couleur sur le plateau du jeu de réflexe VBA Excel

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,
Procédure évènementielle VBA Excel pour intercepter et gérer les clics du joueur sur les cellules du jeu

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.

Partie en cours jeu de réflexe VBA Excel avec représentation graphique des scores

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.

 
Sur Facebook
Sur G+
Sur Youtube
Les livres
Contact
Mentions légales



Partager la formation
Partager sur Facebook
Partager sur Google+
Partager sur Twitter
Partager sur LinkedIn