[VIDEO]Comment créer un jeu sur Excel : TIC TAC TOE - Le jeu du morpion [Tutoriel VBA débutant]
Pour ce nouveau tutoriel nous allons voir comment créer simplement un jeu sur Excel, avec l’exemple du célèbre « TIC TAC TOE », également connu sous le nom de « jeu du morpion ». Notre jeu sera jouable à deux joueurs, et nous aurons l’occasion de voir différentes fonctionnalités avancées d'Excel : comme la programmation en VBA, ou encore le fonctionnement de la mise en forme conditionnelle.
Pour suivre cet article dans les meilleures conditions, je vous invite à télécharger le fichier dans le lien disponible en fin d’article (cliquez ici pour y accéder).
Télécharger le jeu
Vous pouvez télécharger le fichier d'exemple de cet article en cliquant sur le lien suivant :
1. Création du plateau de jeu
Notre partie de morpion s'effectuera sur un tableau de 3x3 cases. Nous allons donc commencer par sélectionner les cases B3 à D5, qui matérialiseront la zone de jeu.
Pour commencer, nous allons tracer les lignes du plateau, en ajoutant des bordures.
Puis modifier la couleur de fond des cellules.
Et enfin, nous allons donner un nom à la plage des cellules sélectionnées, en saisissant « _plateau » dans la zone de nom, en haut de la fenêtre. Puis nous validons en appuyant sur la touche [Entrée] du clavier.
Le nom que nous venons d’affecter à la plage des cellules permettra, lorsque nous allons mettre en place notre code VBA, d'appeler rapidement les cellules du plateau.
Maintenant nous allons agrandir les cases du plateau et leur donner la forme d’un carrée. Pour cela nous allons sélectionner les colonnes B à D, afin d’obtenir une largeur de 60 pixels (en faisant glisser la bordure qui se trouve à droite des en-têtes de colonne comme le montre l’illustration ci-dessous).
Nous allons procéder de la même manière pour donner une hauteur de 60 pixels pour les lignes 3 à 5.
Enfin dans une nouvelle cellule nous allons venir saisir l’identifiant du joueur qui a la main. Cette cellule, à qui nous allons donner le nom de « _joueur » pourra prendre alternativement « 1 » et « -1 », respectivement lorsque le tour sera au joueur 1, puis au joueur 2 (nous verrons plus bas dans ce tutoriel pourquoi il vaut utiliser le -1 plutôt que le 2).
2. Un peu de code
2.1. La logique du jeu
À présent, la zone de jeu est grossièrement dessinée, nous allons pouvoir nous plonger dans le développement du moteur du jeu.
Pour cela, nous allons nous rendre dans l'outil développement d’Excel (VBA) en effectuant un clic droit sur l’onglet de la feuille, puis « Visualiser le code ».
Nous arrivons directement dans le code de la feuille en cours (feuille qui porte le nom de « Feuil1 » si celle-ci n’a pas encore été modifiée).
Pour commencer, nous allons insérer une procédure évènementielle, c’est-à-dire que nous allons demander à Excel d’exécuter une commande particulière à chaque fois qu’une action va être exécutée dans la feuille de calcul.
Cette procédure « Worksheet_SelectionChange » va ainsi être invoquée à chaque fois que l’utilisateur va cliquer sur une cellule différente (et donc que la sélection va changer).
Vous pouvez soit effectuer un copier/coller du code suivant, soit l’insérer automatiquement en choisissant « Worksheet » dans le menu déroulant situé au-dessus de la zone de saisie du code, puis « SelectionChange » dans la zone de droite :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
End Sub
Comme nous venons de le voir ce code permet d’exécuter une procédure lorsqu’une ou plusieurs cellules sont sélectionnées. Ces cellules sont rassemblées dans une variable de type « Range » qui porte le nom de « Target ».
Pour bien comprendre le fonctionnement de l’évènement, nous allons simplement ajouter la ligne suivante qui va nous permettre d’afficher un message avec les coordonnées de la cellule sélectionnée :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Msgbox Target.Address
End Sub
Si nous revenons sur notre feuille de calcul, à chaque fois nous allons sélectionner une cellule Excel va nous renvoyer son adresse.
Maintenant, la première chose à faire est de vérifier que la cellule sélectionnée appartient bien à notre plateau. Pour cela nous allons utiliser l'instruction « Intersect ». Cette instruction permet de récupérer l’ensemble des cellules situées à l’intersection de deux plages de cellules. Lorsqu’aucune cellule n’est commune aux deux plages, cette dernière retournera comme résultat « nothing ».
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect([_plateau], Target) Is Nothing Then
Msgbox Target.Address
End If
End Sub
Dans cet exemple, nous n’allons plus afficher l’adresse de la cellule sélectionnée que lorsque le résultat de l’intersection de cette dernière et du plateau de jeu n’est pas égal à « nothing » (il y a au moins une cellule de communes entre la cellule sélectionnée et le plateau).
Maintenant à chaque fois que nous allons cliquer sur le plateau, plutôt que d'afficher l'adresse de la cellule sélectionnés, ce qui n’apporte rien au jeu, nous allons vouloir que le numéro du joueur soit inscrit directement à l’endroit sélectionné.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect([_plateau], Target) Is Nothing Then
If Target = "" Then ' 1
Target = [_joueur] ' 2
[_joueur] = -1 * [_joueur] ' 3
End If
End If
End Sub
Voici le détail du code que nous venons de saisir :
- 1 : Pour commencer nous allons vérifier que la cellule est vide (aucun pion n’a encore été posé à cet endroit),
- 2 : Si c’est le cas, alors nous affectons la valeur du joueur (« 1 » pour le joueur 1 et « -1 » pour le deuxième joueur) à la case sélectionnée,
- 3 : Enfin, nous passons la main au joueur suivant, en multipliant simplement la valeur contenue dans la cellule « _joueur » par -1.
Ensuite, lorsque le joueur suivant va sélectionner une nouvelle case, la procédure va à nouveau être appelée, et ainsi de suite.
2.2. Créer une nouvelle partie
Nous allons maintenant créer une nouvelle instruction qui va permettre de recommencer une nouvelle partie.
Cette instruction va simplement consister à supprimer le contenu déjà présent sur le plateau et à donner la main au joueur 1 :
Sub nouvellePartie()
[_plateau].ClearContents
[_joueur] = 1
End Sub
Pour appeler rapidement cette instruction nous allons insérer un nouveau bouton :
- Dans l’onglet « Insertion » du ruban, nous allons sélectionner « Formes » (dans le groupe « Illustrations »,
- Choisissons par exemple un rectangle avec des coins arrondis,
- Nous allons dessiner le rectangle à la position, et aux dimensions souhaitées,
- Puis insérer un texte (clic droit sur rectangle, puis « Modifier le texte »), et saisir le texte du bouton (par exemple : « Nouvelle partie »),
- À nouveau clic-droit, puis « Affecter une macro », dans la fenêtre qui s’affiche nous allons alors simplement sélectionner l’instruction que nous venons de taper : « nouvellePartie »
2.3. Fin de partie
Nous allons maintenant demander à Excel de déterminer automatiquement lorsqu’un jour à remporté la partie. Pour cela nous n’aurons pas besoin de macro-commande, nous allons uniquement utiliser une série de formules.
Dans la règle du morpion un joueur gagne lorsque celui-ci a réussi à placer trois pions sur une ligne, sur une colonne ou encore sur une diagonale.
Étant donné que les pions peuvent prendre la valeur « 1 », ou de « -1 », on peut en déduire qu’un joueur a gagné lorsqu'une ligne, une colonne ou une diagonale aura pour valeur « 3 » ou « -3 ».
Il va donc nous suffire effectuer une somme sur chacune de ces zones.
Commençons par calculer la somme des valeurs des cellules situées sur la première ligne :
- Dans une des cellules situées en dessous du plateau, par exemple dans la cellule « C8 », nous allons insérer la formule suivante : « =SOMME(B3:D3) », puis valider en appuyant sur la touche [Entrée] du clavier,
- Nous allons procéder de la même manière pour les deux autres lignes :
- En cellule « C9 » : : « =SOMME(B4:D4) »,
- En cellule « C10 » : : « =SOMME(B5:D5) »,
- Puis à la suite, nous allons sommer les valeurs contenues dans les colonnes :
- En cellule « C11 » : : « =SOMME(B3:B5) »,
- En cellule « C12 » : : « =SOMME(C3:C5) »,
- En cellule « C13 » : : « =SOMME(D3:D5) »,
- En enfin les deux diagonales :
- En cellule « C14 » : : « =SOMME(B3;C4;D5) » (remarquez ici que nous séparons chacune des cellules par un point-virgule car il s’agit de cellules non adjacentes),
- En cellule « C15 » : : « =SOMME(B5;C4;D3) »,
Maintenant, nous disposons d’un tableau qui va synthétiser l’ensemble des combinaisons existantes sur notre plateau.
À droite de chacune des formules que nous venons d’insérer, nous allons maintenant chercher à savoir si une des cellules est égale à « 3 » ou à « -3 », synonyme de victoire pour l’un des deux joueurs :
- Nous allons commencer par sélectionner les cellules juste à droite des cellules dans lesquelles nous avons inséré les formules : les cellules « D8 » à « D15 ». Pour cela nous cliquons sur la première de ces cellules (« D8 »), puis en faisant glisser la souris nous sélectionnons les cellules suivantes également,
- Nous saisissons la formule suivante : « =SI(ABS(C8)=3;C8/3;0) » :
- Nous cherchons dans un premier temps à savoir si « C8 » est égale à « 3 », ou à « -3 », en demandant à Excel la valeur absolue de cette cellule,
- Si tel est le cas, alors nous retournons la valeur de cette cellule, que nous divisons par trois pour avoir l’identifiant du joueur vainqueur (« 1 » ou « -1 »).
- Dans le cas contraire, nous retournons simplement « 0 »
- Nous validons cette formule en appuyant en même temps sur les touches [Ctrl] et [Entrée], afin de valider la formule pour toutes les cellules sélectionnées
Enfin, pour récupérer l’identifiant du vainqueur, il suffit d'effectuer une somme sur cette colonne de formules, en insérant dans une nouvelle cellule (par exemple en position « G9 ») une formule qui va juste effectuer la somme de ces cellules :
=SOMME(D8:D15)
Nous allons maintenant nommer cette cellule en « _vainqueur », et à présent à chaque tour de jeu, il suffira de regarder si cette cellule vos « 0 » et si ce n'est pas le cas (donc la cellule vaut « 1 » ou « -1 »), alors cela voudra dire qu’un joueur a gagné.
Nous allons modifier notre procédure de la manière suivante :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect([_plateau], Target) Is Nothing Then
If Target = "" Then
Target = [_joueur]
[_joueur] = -1 * [_joueur]
If [_vainqueur] <> 0 Then
MsgBox "Le joueur " & [_vainqueur] & " a gagné la partie !"
Call nouvellePartie
End If
End If
End If
End Sub
Le moteur du jeu est maintenant terminé, vous pouvez ainsi commencer à vous amuser à le tester en cliquant sur le bouton « Nouvelle partie ».
Lorsque l’un des joueurs gagne la partie, un message est affiché et une nouvelle partie est lancée automatiquement.
Nous pouvons maintenant masquer les lignes que nous venons de créer dans notre feuille de calcul et modifier l’apparence des jetons pour les rendre plus attrayant.
2.4. Insérer des jetons avec la mise-en-forme conditionnelle
Nous allons à présent utiliser la mise-en-forme conditionnelle pour afficher des symboles à la place des nombres « 1 » et « -1 ».
Pour cela nous allons commencer par sélectionner les neuf cases de notre plateau, ce qui va générer immédiatement une erreur VBA.
En effet nous avons sélectionné plusieurs cellules du plateau ce qui ne plaît pas à notre procédure. Pour corriger cette erreur, nous allons effectuer un premier contrôle en tout début de procédure afin de quitter cette dernière lorsque plusieurs cellules sont sélectionnées :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Not Intersect([_plateau], Target) Is Nothing Then
If Target = "" Then
Target = [_joueur]
[_joueur] = -1 * [_joueur]
If [_vainqueur] <> 0 Then
MsgBox "Le joueur " & [_vainqueur] & " a gagné la partie !"
Call nouvellePartie
End If
End If
End If
End Sub
Nous utilisons ici la propriété « count » de la variable « Target » afin de savoir combien de cellules ont été sélectionnées. Si plusieurs cellules sont effectivement sélectionnées, alors nous sortons directement de la procédure avec l’instruction « Exit Sub ».
Revenons sur notre feuille de calculs afin de sélectionner les neuf cases de notre plateau. Désormais cela ne devrait plus causer de problème.
Pour insérer une mise-en-forme conditionnelle, rendons-nous dans l’onglet « Accueil » du ruban, puis dans « Mise-en-forme conditionnelle », choisissons « Jeux d’icônes » afin de sélectionner l’un des jeux proposés par Excel.
Vous constaterez ainsi que des jetons sous forme d’icônes ont été ajoutés à côté des chiffres.
Pour supprimer ces chiffres, revenons dans le menu « Mise-en-forme conditionnelles », puis cette fois-ci nous choisissons l’option « Gérer les règles ».
Double-cliquons sur la mise-en-forme conditionnelle que nous venons de créer afin de cocher la case « Afficher l'icône uniquement ». Validons en cliquant sur le bouton [OK].
Afin de conserver une cohérence entre l'identifiant du joueur (en haut de la feuille) et le jeton qui va être posé, nous allons appliquer la mise-en-forme conditionnelle que nous venons juste de créer à la formule joueurs. Pour cela nous allons revenir dans « Gérer les règles », dans le menu déroulant en haut de la fenêtre, nous allons sélectionner l’affichage de toutes les règles de mise en forme conditionnelle « Pour cette feuille de calculs ».
Puis nous allons simplement ajouter les coordonnées de la cellule « _joueur » (« D1 » dans notre exemple) à la suite (en séparant les coordonnées du plateau et cette dernière avec un point-virgule).
Voilà notre jeu est maintenant terminé !
Il ne nous restera plus qu'à mettre un petit peu de mise-en-forme pour le rendre plus conviviable (par exemple supprimer le quadrillage, ajouter un titre, ajouter des illustrations, …).