Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Jeu du casse brique en VBA Excel
Ce support est destiné à présenter le
code Visual Basic Excel ayant permis de construire le
jeu du casse brique assimilé, un
casse brique Like . Il ne s'agit pas d'une formation en pas à pas présentant toutes les étapes de la fabrication. Le
code VBA est offert au téléchargement. Libre à vous de l'adapter. Et vous le constaterez, il est agrémenté de riches commentaires.
Source et présentation du jeu
Nous devons commencer par récupérer le
classeur Excel offrant tout le développement de ce
jeu du casse-brique .
Un message d'erreur peut apparaître lors de la première ouverture. Cette sécurité, constatant qu'il s'agit d'une source externe, neutralise le
code VBA dans un premier temps. Mais, si après avoir validé le message, vous fermez
Excel et rouvrez le classeur, plus aucune alerte n'apparaît.
Ce classeur offre donc une feuille de jeu avec quelques boutons et deux tableaux de synthèse.
Le tableau sur la gauche résume les scores du dernier participant. Le tableau sur la droite affiche la synthèse du meilleur joueur.
Cliquer sur le bouton But du jeu ,
Une boîte de message apparaît. Elle renseigne sur le fonctionnement et l'objectif de ce
jeu du casse brique . Pour débuter le jeu, il s'agit tout d'abord de cliquer sur le
bouton Nouvelle partie . Ensuite, il faut supprimer le plus rapidement possible l'ensemble des couleurs du plateau. Et pour ce faire, le joueur doit cliquer sur une cellule de couleur. Toutes celles qui l'entourent et qui possèdent la même couleur, sont automatiquement éliminées.
Cliquer sur le bouton Voir les scores ,
Une nouvelle boîte de message apparaît. Elle résume les dix meilleurs scores dans un tableau. A ce titre, quelques défauts d'alignement contrarient la présentation. Voilà déjà l'une des adaptations à envisager par le
code VBA pour corriger ce défaut. A la lecture des dates, vous constatez que nous avons écrit ce code il y a de nombreuses années déjà .
Cliquer sur le bouton Nouvelle partie ,
Une boîte de dialogue surgit. Il s'agit d'un
InputBox . Elle propose en effet une zone de saisie pour enregistrer le nom du participant.
Taper votre prénom et cliquer sur le bouton Ok,
Le
plateau de jeu se remplit de cases de couleur. Ces couleurs sont générées aléatoirement par le
code VBA . Ainsi, chaque partie est différente. Parfois, il est nécessaire de réaliser des coups intermédiaires pour supprimer certaines petites zones de couleur, permettant de regrouper de nombreuses cases de la même couleur. Cette méthode permet d'optimiser les coups comptabilisés. De plus, le temps est compté à partir du moment où les cases de couleur apparaissent.
Cliquer sur l'une des cases de couleur,
Comme vous le remarquez, toutes les cellules adjacentes possédant le même fond sont éliminées. Les cellules du dessus tombent pour remplir l'espace laissé vacant. Ce principe doit être reproduit jusqu'à ce que plus aucune cellule de couleur ne subsiste.
Une fois la dernière case éliminée, une boîte de dialogue se déclenche en effet. Elle propose de visualiser le tableau des scores. Le
code VBA est donc en mesure de détecter automatiquement l'aspect des cellules au fil de la partie. Votre score est déjà résumé dans le tableau de gauche, au-dessus du plateau de jeu.
Cette boîte de dialogue est initiée par la
fonction VBA MsgBox avec des paramètres. Ces paramètres permettent de choisir les boutons de réponse proposés au joueur. Bien sûr, la valeur de retour est stockée dans une variable. C'est ainsi que le traitement se poursuit.
Présentation du code
Nous le disions, ici nous proposons de présenter la structure du code afin de comprendre le mécanisme du jeu.
Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur de code VBA ,
Dans l'explorateur de projet sur la gauche, double cliquer sur l'élement ThisWorkbook ,
Nous affichons ainsi sa feuille de code au centre de l'écran. Et nous constatons qu'un évènement est géré. Comme nous l'avons déjà appris, cette
procédure évènementielle Workbook_Open permet de déclencher un
code VBA Ã l'
ouverture du classeur .
Ce code réalise un réglage sur la
feuille Horloge afin de réinitialiser l'indicateur de temps. Ensuite, il active la
feuille plateau , celle du jeu. A ce titre et vous l'avez sans doute constaté, les onglets ne sont pas disponibles dans le
classeur Excel . Ils sont neutralisés par des paramétrages afin d'empêcher les joueurs de naviguer au travers des feuilles.
Private Sub Workbook_Open()
On Error GoTo pb
Sheets('Horloge').Range('G2').Value = 'non'
Sheets('plateau').Activate
Exit Sub
pb:
gestion_Erreur
End Sub
Sub gestion_Erreur()
MsgBox Err.Description, vbExclamation, Err.Number
End Sub
Revenir sur la feuille Excel du plateau de jeu (ALT + F11),
Cliquer droit sur le bouton Nouvelle partie ,
Dans le menu contextuel, choisir Affecter une macro ,
La boîte de dialogue qui suit résume les macros existantes et celle associée au bouton désigné.
Cliquer sur le bouton Modifier ,
Cette méthode permet de basculer dans l'
éditeur de code VBA entre les bornes de la procédure associée au bouton. Elle se nomme donc
nouvelle_partie :
Sub nouvelle_partie()
On Error GoTo pb
infos_utilisateur
Sheets('Horloge').Range('G2').Value = 'oui'
'Supprime les couleurs de remplissage des cellules du plateau
Range('B21:K41').Interior.ColorIndex = xlNone
'L'indice de ligne varie de 4 Ã 14
'L'indice de colonne varie de 3 Ã 6
Dim ligne As Byte, colonne As Byte
'Initialisation de la génération de nb aléatoire sur l'horloge système
Randomize
For ligne = 21 To 41
For colonne = 2 To 11
'Remplit aléatoirement la cellule d'une couleur dont l'index est compris
'entre 3 et 6.
Cells(ligne, colonne).Interior.ColorIndex = Int((6 - 3 + 1) * Rnd + 3)
Next colonne
Next ligne
Exit Sub
pb:
gestion_Erreur
End Sub
Vous notez la présence de nombreux commentaires. Tout d'abord, la
procédure infos_utilisateur est appelée. Elle est située juste en dessous de la
procédure nouvelle_partie . C'est elle qui permet de mémoriser le nom du participant :
le_nom = InputBox('Veuillez saisir votre prénom :', 'Votre prénom')
Cette information est inscrite dans la cellule dédiée. Puis, les variables sur le temps, la durée ou encore le meilleur score sont mémorisées. C'est une
boucle Do While qui scrute le tableau des archives dans la
feuille Score . Le compteur de temps est enclenché grâce à la
fonction VBA Timer .
debut = Timer
Suite à cela, la
procédure nouvelle_partie reprend le fil de son traitement. L'indicateur sur l'horloge est tout à bord modifié. Comme le commentaire l'explique, nous exploitons la
fonction VBA Randomize pour initialiser la gestion des
nombres aléatoires .
'Initialisation de la génération de nb aléatoire sur l'horloge système
Randomize
Ensuite, c'est une double boucle For qui permet de passer en revue chacune des cellules du plateau de jeu, pour les remplir d'une couleur générée aléatoirement.
...
For ligne = 21 To 41
For colonne = 2 To 11
'Remplit aléatoirement la cellule d'une couleur dont l'index est compris
'entre 3 et 6.
Cells(ligne, colonne).Interior.ColorIndex = Int((6 - 3 + 1) * Rnd + 3)
Next colonne
Next ligne
...
La suite du traitement attend les actions du joueur. C'est donc l'évènement du clic utilisateur sur une case de couleur qui est géré par le
code VBA Excel .
Dans l'explorateur de projet, double cliquer sur l'élément Feuil2 (plateau) ,
L'essentiel du code du jeu réside dans la
procédure évènementielle Worksheet_SelectionChange de cette feuille. C'est elle qui permet d'intercepter et de traiter les clics du joueur. Son paramètre
Target déclaré comme un
objet Excel de type Range est essentiel. C'est lui qui identifie la cellule cliquée. Il permet donc d'en connaître les coordonnées, grâce aux
propriétés Row et Column .
PrivateSub Worksheet_SelectionChange(ByVal Target As Excel.Range)
Tout d'abord, si la cellule cliquée ne fait pas partie du plateau de jeu, l'action est ignorée. Le traitement est avorté :
...
If Target.Row = 21 And Target.Column = 1 Then Exit Sub
If Target.Row < 21 Or Target.Row > 41 Then
Range('A1').Select
Exit Sub
End If
If Target.Column < 2 Or Target.Column > 11 Then
Range('A1').Select
Exit Sub
End If
...
Il en va de même si plusieurs cellules sont sélectionnées ensemble :
If Selection.Count > 1 Then Exit Sub
Puis, les variables nécessaires au traitement sont déclarées :
...
Dim ligne As Integer, colonne As Integer
Dim ligne_ref As Integer, colonne_ref As Integer
Dim couleur_Index As Byte
Dim nouvelle_Ligne_bas As Byte, nouvelle_Ligne_haut As Byte
Dim nb_Ligne As Byte
...
Les attributs de la cellule cliquée sont prélevés et mémorisés :
...
'Réceptionne l'index de couleur de la cellule cliquée pour comparaison
'avec les cellules adjacentes
couleur_Index = Target.Interior.ColorIndex
'Remplissage de la cellule cliquée avec un motif
Target.Interior.Pattern = xlGray50
...
Ensuite, ce sont quatre boucles qui sont enclenchées, les unes à la suite des autres. La première analyse les cellules situées en-dessous (ligne = ligne + 1) pour les comparer. Si elles ont la même couleur, elles sont effacées. En réalité, elles sont repérées et marquées d'un motif (Cells(ligne, colonne).Interior.Pattern = xlGray50). La deuxième boucle progresse vers le haut (ligne = ligne - 1). La troisième analyse les cellules situées sur sa droite (colonne = colonne + 1). La dernière boucle repère les cellules situées sur sa gauche (colonne = colonne - 1).
Pour n'oublier aucune case, plusieurs passes sont engagées sur l'ensemble des cellules du plateau de jeu :
...
For compteur = 0 To 4
...
For i = 21 To 41
For j = 2 To 11
...
Si elles possèdent la couleur identifiée et que le motif de remplissage n'est pas encore en vigueur, le code l'applique :
...
Do While Cells(ligne, colonne).Interior.ColorIndex = couleur_Index And _
Cells(ligne, colonne).Interior.Pattern <> xlGray50
Cells(ligne, colonne).Interior.Pattern = xlGray50
ligne = ligne + 1
Loop
...
Enfin, une dernière double boucle est enclenchée pour parcourir toutes les cases du plateau de jeu. Cette double boucle part des cellules du bas et remonte dans le plateau (Step - 1).
...
For j = 2 To 11
For i = 41 To 21 Step -1
...
Elle recherche toutes les cellules possédant un motif :
Do WhileCells(i, j).Interior.Pattern = xlGray50
Et donc la double boucle devient une triple boucle et bientôt une quadruple. En effet, la boucle qui suit consiste à ne pas traiter les cellules vides :
Do While Cells(ligne, colonne).Interior.ColorIndex <> -4142
A chaque fois qu'un motif est rencontré, la ligne en cours est affectée du motif et de la couleur de la case du dessus. Cette astuce donne l'impression que les briques descendent lorsqu'un jeu de couleur a été éliminé.
...
Cells(ligne, colonne).Interior.Pattern = Cells(ligne - 1, colonne).Interior.Pattern
Cells(ligne, colonne).Interior.ColorIndex = Cells(ligne - 1, colonne).Interior.ColorIndex
...
Voilà donc pour l'explication et l'articulation de ce jeu. Désormais, vous possédez toutes les armes pour l'adapter et le faire évoluer à votre guise.