formateur informatique

Jeu de société en Visual Basic Excel

Accueil  >  Bureautique  >  Excel  >  Excel VBA  >  Jeu de société 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 :


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.

plateau du jeu de société VBA Excel avec cases, pions, dés et cartes chances



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.

Début de partie jeu de société VBA Excel, inscrire le nom des joueurs

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,
Premier joueur choisi aléatoirement par le code VBA Excel pour débuter la partie de jeu

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,
Jeter les dés par bouton de UserForm VBA Excel, avancer du nombre de cases et répondre à la question

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.

Base de données Excel du contenu des cartes chance tirées aléatoirement pendant la partie de jeu

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.

Tableau Excel des questions posées aléatoirement pendant la partie de jeu VBA

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,
Evènement VBA Excel pour déclencher UserForm sur ouverture classeur et démarrer partie de jeu

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,
Formulaire VBA Excel pour guider la partie du jeu de société

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.

 
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