Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Créer un jeu de société en VBA Excel
Dans ce support, nous proposons de découvrir un
jeu de société créé en
Visual Basic Excel . Il ne s'agit pas d'une formation destinée à le reconstruire. Le code est offert. Libre à vous de l'adapter et de l'améliorer. Nous proposons simplement de survoler les instructions pour comprendre le mécanisme.
Source et présentation du jeu
Tout d'abord, nous devons récupérer le
classeur Excel hébergeant le
code VBA .
Télécharger le classeur jeux_societe.xlsm en cliquant sur son lien ,
Puis, double cliquer sur le fichier téléchargé pour l'ouvrir dans Excel ,
Ensuite, cliquer sur le bouton Activer la modification du bandeau jaune de sécurité,
Fermer la boîte de dialogue qui se propose puis fermer Excel ,
En effet, cette sécurité détectant que le fichier émane d'une source externe, neutralise dans un premier temps le
code VBA programmé pour se déclencher à l'ouverture du classeur.
Double cliquer de nouveau sur le fichier téléchargé,
Cette fois l'alerte disparaît et la partie commence.
La boîte de dialogue pour le lancement de la partie apparaît automatiquement. Elle consiste à inscrire quatre joueurs, ni plus ni moins. C'est ainsi que le
code VBA est paramétré. Et c'est aussi l'une des adaptations à entrevoir pour permettre de jouer de 2 à 4 personnes par exemple. Pour identifier un jouer, il faut saisir deux lettres. Il peut s'agir de la première lettre du prénom suivie de la première lettre du nom. Cette paire fera office de pion sur le plateau de jeu.
Taper les deux premières lettres et valider par Ok,
La boîte de dialogue réapparaît. Elle demande donc de renseigner le deuxième joueur.
De la même façon, renseigner les trois joueurs restants,
La partie débute par un joueur choisi
aléatoirement par le code VBA . La personne concernée en est informée par une boîte de message. Vous remarquez la présence des quatre pions, matérialisés par leurs lettres, dans la première case du
plateau de jeu .
Valider l'information en cliquant sur le bouton Ok de la boîte de message,
Une nouvelle boîte de dialogue surgit.
Cliquer sur le bouton Dé, pour lancer les dés,
Un
nombre aléatoire est de nouveau généré. Le joueur progresse du nombre de cases indiqué. Suite à cela, au centre de la boîte de dialogue, une question lui est posée. La thématique est le
gestionnaire de base de données Access . Quatre propositions lui sont offertes, sur la droite de la boîte de dialogue, sous forme de boutons. Si la réponse est juste, le joueur relance les dés et poursuit sa progression. Le cas échéant, la main est passée au joueur suivant.
Cliquer sur la croix de la boîte de dialogue pour mettre fin à la partie,
Le
plateau de jeu offre quelques particularités. Des jonctions, matérialisées par des cellules jaunes et une double flèche rouge, permettent de relier différentes parties du plateau. Si vous vous arrêtez à l'entrée, vous êtes propulsé à la sortie et vous gagnez un nombre important de positions. Si vous tombez à la sortie, vous êtes projeté à l'entrée et vous perdez un grand nombre de positions. Malgré ou grâce à ces tunnels, l'objectif d'une partie est simple. C'est le premier joueur à rejoindre la case de l'arrivée qui a gagné.
Les cellules hachurées sont des
cases chances . Lorsque vous tombez dessus, une carte de jeu aléatoire est proposée, comme si elle était mélangée dans le tas. Vous pouvez perdre ou gagner des positions. Le contenu de ces cartes est archivé dans la troisième feuille de ce classeur, nommée
Chance .
Vous pouvez donc les ajuster à votre guise en modifiant le contenu des cellules.
De même, vous notez que la deuxième feuille de ce classeur archive toutes les questions auxquelles il s'agit de répondre pour continuer la progression sur le
plateau de jeu .
Vous pouvez donc modifier le questionnaire à loisir. Là encore, l'une des modifications consisterait à demander aux joueurs de choisir la thématique du Qcm avant de débuter la partie. Chacun serait archivé dans une feuille indépendante. Le choix serait enregistré dans une
variable publique . Cette variable serait exploitée par le
code VBA pour se référer au bon questionnaire.
Une nouvelle partie peut reprendre à tout moment. C'est la raison de la présence du
bouton Go , sur la
feuille Carte du plateau de jeu. Sachez que si vous annulez l'inscription de tous les joueurs, le
code VBA est programmé pour fermer le
classeur Excel .
Analyse du code VBA
Vous vous en doutez, sans être complexe, le
code VBA est dense. Les combinaisons sont nombreuses pour prévoir tous les cas sur un tel plateau de jeu. C'est la raison pour laquelle, nous nous contenterons de présenter sa structure. Mais rassurez-vous, ce programme est largement commenté.
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'élément ThisWorkbook ,
Nous accédons ainsi à sa
feuille de code , au centre de l'écran. A l'
ouverture du classeur Excel , l'
évènement est géré et le
UserForm JeuCarte est appelé par sa
méthode Show .
Dans l'explorateur de projet, double cliquer sur le UserForm JeuCarte ,
Nous y retrouvons l'
interface graphique du jeu de société , celle qui est appelée à l'
ouverture du classeur . Pourtant, et comme nous l'avons constaté, une partie débute par l'inscription des joueurs. Un évènement associé à un formulaire permet en effet de coder des instructions avant l'
affichage du UserForm .
Double cliquer sur un emplacement vide du UserForm ,
Nous basculons ainsi entre les bornes de la
procédure UserForm_Initialize . Cet évènement est généré avant l'activation du formulaire (
UserForm_Activate ). Vous constatez la présence des commentaires assez riches et l'exploitation de la
fonction VBA InputBox . C'est elle qui offre cette boîte de dialogue avec une zone de saisie pour l'inscription des joueurs.
Plus bas, la
procédure Nettoie est appelée dans une boucle parcourant les 48 cases du plateau de jeu. Puis, un
nombre aléatoire entier compris entre 1 et 4 est généré pour déterminer le joueur qui débute la partie.
La
procédure nettoie est placée juste en dessous. Le code est assez statique car le plateau de jeu est défini comme connu et rigide. Il s'agit d'une amélioration intéressante à entrevoir. Le
code VBA peut s'adapter à de nouveaux plateaux, en détectant l'apparence des cellules. Certes, le développement mérite étude et réflexion. Bref, cette procédure se contente de vider les cellules de leur contenu pour effacer la position des pions d'une potentielle précédente partie.
Revenir sur le UserForm JeuCarte ,
Puis, double cliquer sur le bouton du dé ,
Nous basculons ainsi entre les bornes de la
procédure de_Click . Ce
code VBA est naturellement déclenché au clic sur le
bouton du dé . Là encore, les commentaires fournissent des indications précieuses sur le fonctionnement.
Pour simuler le dé, un
nombre aléatoire entier entre 1 et 6 est généré. Ce score est ajouté aux positions cumulées par le joueur durant la partie. C'est pourquoi, une variable publique respective à chaque joueur mémorise l'état (ptj1, ptj2...).
...
'Génère un chiffre de dé compris entre 1 et 6.
Randomize
de.Caption = Int((6 - 1 + 1) * Rnd + 1)
'Etat est la variable publique permettant de connaître le joueur courant.
Select Case etat
Case 1
'Le nombre de points du joueur est incrémenté du chiffre du dé...
ptj1 = ptj1 + de.Caption
references ptj1, 1, True '...et traduit en références de cellule (Ligne et colonne).
...
Puis, la
procédure references est appelée. Cette
procédure references analyse tous les cas possibles en fonction des points cumulés par le participant. Ces points correspondent à une case spécifique du plateau. Les 48 cases sont passées en revue dans une
instruction Select Case . En fonction de cette case, des indices de ligne et colonne sont attribués. Ils sont mémorisés sous les
variables publiques ligne et colonne . Grâce à l'
objet Cells , ils permettent dès lors de positionner le
pion du joueur en fonction du score réalisé au dé.
Toutes les cases spécifiques sont analysées en fonction de la position interceptée. Dans le cas d'un tunnel, la position peut être incrémentée ou décrémentée.
...
Case 8
If Letat = etat And val = True Then
MsgBox 'Joli, vous passez par le tunnel !', vbExclamation
ligne = 5
colonne = 7
Select Case Letat
Case 1
ptj1 = 20
Case 2
ptj2 = 20
Case 3
ptj3 = 20
Case 4
ptj4 = 20
End Select
Else
ligne = 3
colonne = 7
End If
...
Lorsqu'il s'agit d'une
case chance , la procédure dédiée est appelée. Mais cet appel est réalisé par la
procédure évènementielle de_click qui réceptionne les nouvelles coordonnées du pion après le traitement de la
procédure references :
...
Select Case ptj1
Case 23
Chance ptj1
ligneAv1 = ligne
colonneAv1 = colonne
GoTo 1
Case 32
Chance ptj1
ligneAv1 = ligne
colonneAv1 = colonne
GoTo 1
Case 42
Chance ptj1
ligneAv1 = ligne
colonneAv1 = colonne
GoTo 1
End Select
...
Seules trois
cases chances sont en effet prévues sur le
plateau de jeu . Vous pouvez donc en ajouter sans oublier d'ajuster le
traitement VBA . Une
branche Case identifiant la position doit correspondre à chacune.
Cette
procédure Chance génère un
nombre aléatoire pour piocher une carte au hasard dans les bornes du tableau de la
feuille Chance :
...
'Initialise la génération sur l'horloge interne.
Randomize
'Génère un nombre aléatoire dans la plage spécifiée.
nbAlea = Int((derligne - 2 + 1) * Rnd + 2)
'S'agit-il d'un bonus ou d'un malus.
plus = Sheets(3).Cells(nbAlea, 3)
moins = Sheets(3).Cells(nbAlea, 4)
'Le joueur conserve-t-il la main (Oui ou non).
LaMain = Sheets(3).Cells(nbAlea, 5)
...
Bien sûr elle restitue ensuite le message de la carte à l'écran et influe sur la partie en fonction des conditions associées, archivées dans le tableau.
N'oublions pas l'appel essentiel de la
procédure questions . Elle est appelée à l'initialisation du formulaire mais aussi après chaque déplacement, en bas de la
procédure references . Pour continuer de progresser sur le
plateau de jeu , le participant doit répondre correctement à la nouvelle question.
...
Private Sub questions()
Dim nb As Byte
'Détermine la ligne de la dernière cellule empruntée sur la feuille des questions.
ligneDer = Sheets(2).Cells.SpecialCells(xlCellTypeLastCell).Row
'================
'Affiche tous les numéros de lignes possibles pour les questions à afficher, dans '
'une zone de texte. Aléatoirement, c'est une autre procédure qui pioche dans cette'
'zone les questions non encore sorties. '
'================
For nb = 2 To ligneDer
chaine.Text = chaine.Text & ' ' & nb
Next nb
End Sub
...
Elle se contente d'identifier tous les numéros de questions proposées. C'est la
procédure genere qui se charge de piocher la
question aléatoire et de la restituer sur le
UserForm , avec les quatre propositions de réponse.
...
Private Sub genere()
'================
'CETTE PROCEDURE CHOISIE ALEATOIREMENT UNE QUESTION DE LA LISTE SELON LA ZONE DE TEXTE
'CONSTRUITE DES NUMEROS DE CES QUESTIONS, PUIS SUPPRIME CES NUMEROS POUR NE PLUS
'PROPOSER LA QUESTION.
'================
10:
Dim nbchar As Byte
Dim alea As Integer
Dim position As Integer
'Initialise la génération sur l'horloge interne.
Randomize
'Génère un nombre aléatoire dans la plage spécifiée.
alea = Int((ligneDer - 2 + 1) * Rnd + 2)
'Nb de caractères du nombre aléatoire.
lalea.Text = alea
nbchar = Len(lalea)
'Trouve la position du nombre aléatoire dans la zone de texte
position = InStr(1, chaine.Text, alea, vbTextCompare)
If position < 1 Then GoTo 10
'S'assure que les caractères avant et après sont vides et reconstruit la chaine en éliminant
'le numéro généré. La question ne sera plus posée.
If (Mid(chaine.Text, position - 1, 1)) = ' ' And (Mid(chaine.Text,position + nbchar, 1)) = ' ' Then
chaine.Text = Left(chaine.Text, position - 1) & Mid(chaine.Text, position + nbchar + 1)
Else
GoTo 10
End If
'Affiche la question et les quatre propositions dans les contrôles prévus à cet effet.
question.Caption = Sheets(2).Cells(alea, 2)
choix1.Caption = Sheets(2).Cells(alea, 3)
choix2.Caption = Sheets(2).Cells(alea, 4)
choix3.Caption = Sheets(2).Cells(alea, 5)
choix4.Caption = Sheets(2).Cells(alea, 6)
End Sub
...
Cette
procédure genere est fort naturellement appelée après chaque nouveau lancé de dé, en bas de la
procédure évènementielle de_Click .
Dans l'explorateur de projet, double cliquer sur le UserForm JeuCarte pour l'afficher,
Puis, double cliquer sur le premier des boutons de réponses , vide d'intitulé par défaut,
Nous basculons ainsi entre les bornes de la
procédure évènementielle choix1_Click . Les quatre procédures attachées aux boutons respectifs fonctionnent fort naturellement de la même façon. La bonne réponse issue de la
feuille Questions est mémorisée dans la
variable rep :
rep = Right(Sheets(2).Cells(lalea.Text, 7), 1)
C'est ainsi qu'elle est comparée avec la proposition du joueur :
'Et compare ce numéro de la bonne réponse au chiffre 1 du choix cliqué.
If rep <> '1' Then
'S'il est différent, mauvaise réponse ==> On change de joueur (etat).
If etat < nb.Caption Then
etat = etat + 1
Else
etat = 1
End If
Pour comprendre l'erreur commise, la bonne réponse est alors restituée dans une boîte de message. C'est une fois encore, l'instruction Select Case qui permet d'envisager toutes les conditions :
...
'On affiche la bonne réponse en fonction du numéro extrait
Select Case rep
Case '2'
MsgBox 'Non!, il fallait répondre : ' & Sheets(2).Cells(lalea.Text,4) & Chr(13) & Chr(10) & _
'A vous de jouer ' & UCase(personne) & '!',vbCritical
Case '3'
MsgBox 'Non!, il fallait répondre : ' & Sheets(2).Cells(lalea.Text, 5) & Chr(13) & Chr(10) & _
'A vous de jouer ' & UCase(personne) & '!',vbCritical
Case '4'
MsgBox 'Non!, il fallait répondre : ' & Sheets(2).Cells(lalea.Text, 6) & Chr(13) & Chr(10) & _
'A vous de jouer ' & UCase(personne) & '!',vbCritical
End Select
'Sinon la réponse est correcte. Le joueur peut rejouer.
Else
MsgBox 'Bravo ' & UCase(personne) & '. Jetez les dés pour continuer', vbExclamation
...
Voilà donc pour cette présentation de ce
jeu de société programmé en
VBA Excel . Une fois de plus, l'amélioration la plus saisissante, consisterait à faire en sorte que le
code VBA s'adapte à n'importe quel nouveau
plateau de jeu , par reconnaissance des cellules.