Le Jeu de l’Oie est un classique intemporel. Pourtant, derrière sa simplicité apparente se cache un terrain fertile pour l’apprentissage de la logique, de la programmation et de la gestion d’événements. Le programme présenté ici propose une version numérique modernisée, jouable sur une toile graphique, avec animations, emojis, cases spéciales et une véritable boucle de jeu interactive.
Un plateau isométrique soigneusement construit
Dès l’initialisation, le programme prépare une toile qui servira de plateau. Celui-ci est dessiné en perspective isométrique, donnant un effet 3D élégant.
Chaque case est représentée par un losange, positionné selon un calcul précis mêlant lignes, colonnes et décalages visuels.
Les couleurs et les emojis permettent d’identifier immédiatement les cases importantes :
- Case 0 : départ
- Case 63 : arrivée
- Case 6 : pont
- Case 31 : puits
- Case 42 : labyrinthe
- Case 52 : prison
- Case 58 : mort
- Cases d’oie : une série de cases qui déclenchent un bonus de déplacement
Les positions du joueur et de l’ordinateur sont affichées directement sur le plateau.
Une mécanique de jeu fidèle mais enrichie
Le cœur du programme repose sur une boucle de jeu qui s’exécute tant que la partie n’est pas terminée.
Chaque tour commence par un clic du joueur sur la toile, déclenchant le lancer des deux dés.
Lancer de dés et déplacement
Le programme génère deux valeurs aléatoires entre 1 et 6, puis calcule la somme.
Le déplacement suit les règles traditionnelles :
- Avancer du total des dés
- Si l’on dépasse la case 63, on recule du surplus
- Si l’on tombe sur une case d’oie, on rejoue immédiatement et avance à nouveau du même total
Chaque action est accompagnée d’un message affiché sur le plateau, créant une narration dynamique.
Les cases spéciales : obstacles et rebondissements Le programme gère plusieurs événements emblématiques du Jeu de l’Oie :
- Pont (case 6)
Le joueur saute directement à la case 12.
- Puits (case 31)
Le joueur est bloqué pendant deux tours.
- Labyrinthe (case 42)
Retour forcé à la case 30.
- Prison (case 52)
Encore un blocage de deux tours.
- Mort (case 58)
Retour au départ, un coup dur qui peut renverser la partie.
Ces événements sont traités dans une fonction dédiée, garantissant une structure claire et réutilisable.
Un adversaire automatisé mais équitable
L’ordinateur joue selon les mêmes règles que le joueur :
- Lancer de dés
- Gestion des cases spéciales
- Blocages
- Déplacements et rebonds
Le duel est équilibré, et la progression des deux participants est visible en temps réel sur le plateau.
Fin de partie et déclaration du vainqueur
La partie s’arrête lorsque l’un des joueurs atteint exactement la case 63.
Un panneau final s’affiche alors :
- Vainqueur : Toi ou Ordi
Si la partie dépasse 200 tours, elle est automatiquement interrompue pour éviter les boucles infinies.
Un programme pédagogique et ludique
Ce Jeu de l’Oie numérique est bien plus qu’une simple reproduction du jeu traditionnel.
Il illustre :
- La gestion d’une interface graphique
- Le dessin isométrique
- Les événements aléatoires
- Les structures conditionnelles
- Les boucles de jeu
- La modularité via des fonctions
- L’interactivité par clic utilisateur
C’est un excellent exemple de projet mêlant logique, créativité, et plaisir de jeu.
Programme :
@ Initialisation
plateau est une toile
posJoueur, posOrdi est un nombre
posJoueur vaut 0
posOrdi vaut 0
bloqueJoueur, bloqueOrdi est un nombre
bloqueJoueur vaut 0
bloqueOrdi vaut 0
de1, de2 est un nombre
de1 vaut 1
de2 vaut 1
clicX, clicY est un nombre
clicX vaut 0
clicY vaut 0
fini est un booléen
fini vaut faux
gagnant est un texte
gagnant vaut ""
messages est un tableau
messages ajoute "Bienvenue dans le Jeu de l'Oie !"
messages ajoute "Atteins la case 63 exactement."
messages ajoute "Clique sur la toile pour lancer les 2 dés."
@ Affichage du Plateau
procédure afficherPlateau()
// Efface tout le contenu de la toile avant de redessiner
effacer(plateau)
dimension(plateau, 600, 450)
remplir(plateau, #F5F5DC)
contour(plateau, #FFFFFF, 2)
TILE_W, TILE_H est un nombre
TILE_W vaut 64
TILE_H vaut 32
OFFSET_X, OFFSET_Y est un nombre
OFFSET_X vaut 300
// Décalage vers le bas (OFFSET_Y augmenté à 110)
OFFSET_Y vaut 110
rangee est un nombre
pour rangee de 0 à 7
colonne est un nombre
pour colonne de 0 à 7
i est un nombre
si rangee mod 2 = 0 alors
i vaut rangee * 8 + colonne
sinon
i vaut rangee * 8 + (7 - colonne)
fin si
isoX, isoY est un nombre
isoX vaut OFFSET_X + (colonne - rangee) * (TILE_W / 2)
isoY vaut OFFSET_Y + (colonne + rangee) * (TILE_H / 2)
coul est un texte
coul vaut #E8E4D0
si i = 0 alors
coul vaut #22C55E
sinon si i = 63 alors
coul vaut #FACC15
sinon si i = 6 alors
coul vaut #38BDF8
sinon si i = 31 alors
coul vaut #3B82F6
sinon si i = 42 alors
coul vaut #A855F7
sinon si i = 52 alors
coul vaut #6B7280
sinon si i = 58 alors
coul vaut #1F2937
sinon si contient([5, 9, 14, 18, 23, 27, 32, 36, 41, 45, 50, 54, 59], i) alors
coul vaut #FB923C
fin si
polygone(plateau, isoX, isoY - (TILE_H / 2), isoX + (TILE_W / 2), isoY, isoX, isoY + (TILE_H / 2), isoX - (TILE_W / 2), isoY, coul)
label(plateau, isoX - 6, isoY - 3, convertir_texte(i), #334155, 10)
emoji est un texte
emoji vaut ""
si i = 0 alors
emoji vaut "🏁"
sinon si i = 63 alors
emoji vaut "🏆"
sinon si i = 6 alors
emoji vaut "🌉"
sinon si i = 31 alors
emoji vaut "💧"
sinon si i = 42 alors
emoji vaut "🌀"
sinon si i = 52 alors
emoji vaut "🔒"
sinon si i = 58 alors
emoji vaut "💀"
sinon si contient([5, 9, 14, 18, 23, 27, 32, 36, 41, 45, 50, 54, 59], i) alors
emoji vaut "🦢"
fin si
si emoji <> "" alors
label(plateau, isoX - 8, isoY + 8, emoji, #000000, 13)
fin si
si i = posJoueur et i = posOrdi alors
label(plateau, isoX - 14, isoY - 16, "😎🤖", #000000, 14)
sinon si i = posJoueur alors
label(plateau, isoX - 8, isoY - 16, "😎", #000000, 14)
sinon si i = posOrdi alors
label(plateau, isoX - 8, isoY - 16, "🤖", #000000, 14)
fin si
fin pour
fin pour
contour(plateau, #0)
// Panneau de notifications
nbMsg est un nombre
nbMsg vaut longueur(messages)
pour k de 0 à nbMsg - 1
label(plateau, 10, 20 + k * 18, messages[k], #1E293B, 12)
fin pour
// Bouton d'interaction replacé en bas
si fini = faux alors
rectangle_arrondi(plateau, 170, 390, 140, 40, 8, #2563EB)
label(plateau, 185, 415, "🎲 Lancer les dés", #FFFFFF, 13)
fin si
// Dessin des 2 dés replacés en bas
contour(plateau, #334155, 2)
rectangle_arrondi(plateau, 330, 390, 38, 38, 6, #FFFFFF)
label(plateau, 343, 415, convertir_texte(de1), #000000, 18)
rectangle_arrondi(plateau, 375, 390, 38, 38, 6, #FFFFFF)
label(plateau, 388, 415, convertir_texte(de2), #000000, 18)
contour(plateau, #0)
affiche plateau
fin procédure
@ Fonctions
fonction caseSpeciale(p)
si p = 6 alors
messages ajoute " 🌉 PONT ! Saut à la case 12."
retourne 12
fin si
si p = 31 alors
messages ajoute " 💧 PUITS ! Bloqué."
retourne 31
fin si
si p = 42 alors
messages ajoute " 🌀 LABYRINTHE ! Retour à 30."
retourne 30
fin si
si p = 52 alors
messages ajoute " 🔒 PRISON ! Bloqué."
retourne 52
fin si
si p = 58 alors
messages ajoute " 💀 MORT ! Retour au départ."
retourne 0
fin si
retourne p
fin fonction
fonction jouerTour(nom, pos)
de1 vaut hasard(1, 6)
de2 vaut hasard(1, 6)
desTotal est un nombre
desTotal vaut de1 + de2
messages ajoute nom + " lance 2 dés : 🎲 " + convertir_texte(de1) + " + 🎲 " + convertir_texte(de2) + " = " + convertir_texte(desTotal)
nouvellePos est un nombre
nouvellePos vaut pos + desTotal
si nouvellePos > 63 alors
surplus est un nombre
surplus vaut nouvellePos - 63
nouvellePos vaut 63 - surplus
messages ajoute " ↩️ Dépassement ! Recule à " + convertir_texte(nouvellePos)
fin si
si contient([5, 9, 14, 18, 23, 27, 32, 36, 41, 45, 50, 54, 59], nouvellePos) alors
messages ajoute " 🦢 OIE ! Rejoue et avance de " + convertir_texte(desTotal)
nouvellePos vaut nouvellePos + desTotal
si nouvellePos > 63 alors
surplus2 est un nombre
surplus2 vaut nouvellePos - 63
nouvellePos vaut 63 - surplus2
fin si
fin si
nouvellePos vaut caseSpeciale(nouvellePos)
messages ajoute " -> " + nom + " est sur la case " + convertir_texte(nouvellePos)
retourne nouvellePos
fin fonction
@ Boucle de jeu
tour est un nombre
tour vaut 0
appelle afficherPlateau()
tant que fini = faux
cliquer plateau dans clicX, clicY
tour vaut tour + 1
vide messages
messages ajoute "--- Tour " + convertir_texte(tour) + " ---"
si bloqueJoueur > 0 alors
messages ajoute "😎 Tu es bloqué, tu passes."
bloqueJoueur vaut bloqueJoueur - 1
sinon
posJoueur vaut jouerTour("😎 Toi", posJoueur)
si posJoueur = 31 alors
bloqueJoueur vaut 2
fin si
si posJoueur = 52 alors
bloqueJoueur vaut 2
fin si
si posJoueur = 63 alors
gagnant vaut "😎 Toi"
fini vaut vrai
fin si
fin si
si fini = faux alors
si bloqueOrdi > 0 alors
messages ajoute "🤖 L'ordinateur est bloqué, il passe."
bloqueOrdi vaut bloqueOrdi - 1
sinon
posOrdi vaut jouerTour("🤖 Ordi", posOrdi)
si posOrdi = 31 alors
bloqueOrdi vaut 2
fin si
si posOrdi = 52 alors
bloqueOrdi vaut 2
fin si
si posOrdi = 63 alors
gagnant vaut "🤖 Ordi"
fini vaut vrai
fin si
fin si
fin si
appelle afficherPlateau()
si tour > 200 alors
fini vaut vrai
fin si
fin tant que
vide messages
messages ajoute "🏁 === FIN DE LA PARTIE === 🏁"
si gagnant = "" alors
messages ajoute "Partie interrompue."
sinon
messages ajoute "🎉 Vainqueur : " + gagnant + " ! 🎉"
fin si
appelle afficherPlateau()





