Ce programme met en scène un petit jeu d’escape-room en 2D, entièrement géré dans une toile graphique. Le joueur explore une pièce, fouille des objets, trouve une clé, découvre un code secret et finit par déverrouiller une porte pour s’échapper.
Voyons comment ce jeu est construit, scène par scène, et comment les variables orchestrent la progression.
Les variables : le cœur de la logique du jeu
Dès le début, plusieurs variables essentielles sont déclarées :
sceneCourante : indique dans quelle scène se trouve le joueur (1 = pièce principale, 2 = tableau, etc.).
- aCle : booléen qui indique si le joueur a trouvé la clé.
- estGagne : booléen qui devient vrai lorsque le joueur s’échappe.
- clicX / clicY : coordonnées du clic du joueur.
- saisieCode : texte entré dans le digicode.
Ces variables permettent de suivre l’état du jeu et de réagir aux actions du joueur.
La boucle principale : le moteur du jeu
Le jeu fonctionne dans une boucle :
tant que non estGagne
À chaque tour :
- La toile est effacée.
- La scène correspondant à sceneCourante est dessinée.
- Le programme attend un clic du joueur.
- Il vérifie si ce clic correspond à un élément interactif.
- Il met à jour l’état du jeu (changement de scène, clé trouvée, code entré…).
Cette boucle continue jusqu’à ce que le joueur atteigne la scène de victoire.
Scène 1 : La pièce principale
La première scène est une salle d’escape-room avec quatre éléments interactifs :
- Le tableau : mène à la scène 2
- La commode : mène à la scène 3
- La fenêtre : mène à la scène 5
- La porte : mène à la scène 4
Une barre d’inventaire affiche si le joueur possède la clé.
Cette scène sert de hub central : le joueur y revient souvent.
Scène 2 : Le tableau et l’indice
- Le tableau contient un code secret gravé : 421.
- Le joueur ne peut pas interagir davantage ici, mais cet indice sera crucial pour le digicode de la porte.
Un bouton « Retour » permet de revenir à la pièce principale.
Scène 3 : La commode et la clé
La commode contient un tiroir interactif :
- Si le joueur n’a pas encore la clé : un bouton « Fouiller le tiroir » apparaît.
- Après le clic : aCle devient vrai et un message confirme la découverte.
- Si la clé est déjà prise : le tiroir affiche un état « fouillé ».
Encore une fois, un bouton « Retour » ramène à la scène 1.
Scène 4 : La porte et le digicode
La porte est verrouillée par deux systèmes :
- Une serrure : nécessite la clé.
- Un boîtier CODE : nécessite d’entrer le bon code.
Si le joueur clique sur le boîtier :
Sans clé : message d’erreur.
Avec clé : une demande de saisie apparaît.
Si le joueur entre 421 : passage à la scène 6 (victoire).
Sinon : « Code incorrect ! ».
Scène 5 : La fenêtre
La fenêtre permet simplement d’observer l’extérieur.
Elle ne contient aucun indice, ce qui ajoute un peu de fausse piste au jeu.
Scène 6 : La victoire
Si le joueur a :
- trouvé la clé
- découvert le code
- déverrouillé la porte
Alors la scène finale s’affiche : un écran de victoire avec animations et messages de félicitations.
La variable estGagne passe à vrai, ce qui met fin à la boucle du jeu.
Conclusion : un escape-room simple mais complet
Ce programme illustre parfaitement la structure d’un mini-jeu :
- Gestion d’état via des variables
- Navigation entre scènes
- Interactions par clic
- Inventaire minimaliste
- Indices et énigmes
- Condition de victoire
Programme :
@ Déclaration des variables
jeuToile est une toile
dimension(jeuToile, 550, 500)
sceneCourante est un nombre
sceneCourante vaut 1
aCle est un booléen
aCle vaut faux
estGagne est un booléen
estGagne vaut faux
clicX, clicY est un nombre
saisieCode est un texte
@ Boucle principale du jeu
tant que non estGagne
effacer(jeuToile)
// SCÈNE 1 : Pièce principale
si sceneCourante = 1 alors
// Mur & parquet
remplir(jeuToile, #2C3E50)
rectangle(jeuToile, 0, 400, 550, 100, #3E2723)
ligne(jeuToile, 0, 400, 550, 400, #1B0000, 3)
label(jeuToile, 160, 40, "SCÈNE 1 : La Pièce", #ECF0F1, 22)
label(jeuToile, 140, 65, "Trouvez le moyen de sortir !", #BDC3C7, 13)
// Élément 1 : Tableau (vers scène 2)
rectangle(jeuToile, 40, 110, 160, 110, #D35400)
rectangle(jeuToile, 50, 120, 140, 90, #F39C12)
cercle(jeuToile, 120, 165, 25, #E67E22)
label(jeuToile, 85, 172, "Tableau", #FFFFFF, 16)
// Élément 2 : Commode (vers scène 3)
rectangle(jeuToile, 40, 260, 160, 130, #5D4037)
rectangle_arrondi(jeuToile, 50, 275, 140, 40, 5, #8D6E63)
rectangle_arrondi(jeuToile, 50, 335, 140, 40, 5, #8D6E63)
cercle(jeuToile, 120, 295, 5, #F1C40F)
cercle(jeuToile, 120, 355, 5, #F1C40F)
label(jeuToile, 75, 245, "Commode", #FFFFFF, 15)
// Élément 3 : Fenêtre (vers scène 5)
rectangle(jeuToile, 350, 100, 160, 120, #ECF0F1)
rectangle(jeuToile, 358, 108, 68, 48, #3498DB)
rectangle(jeuToile, 434, 108, 68, 48, #3498DB)
rectangle(jeuToile, 358, 164, 68, 48, #3498DB)
rectangle(jeuToile, 434, 164, 68, 48, #3498DB)
cercle(jeuToile, 460, 130, 12, #F4D03F)
label(jeuToile, 395, 85, "Fenêtre", #FFFFFF, 15)
// Élément 4 : Porte (vers scène 4)
rectangle(jeuToile, 350, 240, 160, 160, #145A32)
rectangle(jeuToile, 360, 250, 140, 140, #1E8449)
cercle(jeuToile, 375, 320, 7, #F1C40F)
rectangle(jeuToile, 470, 305, 20, 30, #F39C12)
label(jeuToile, 405, 320, "Porte", #FFFFFF, 16)
// Barre d'inventaire
rectangle_arrondi(jeuToile, 30, 445, 490, 45, 8, #1A252F)
si aCle alors
cercle(jeuToile, 60, 467, 8, #F1C40F)
ligne(jeuToile, 60, 467, 80, 467, #F1C40F, 3)
ligne(jeuToile, 75, 467, 75, 473, #F1C40F, 3)
label(jeuToile, 95, 472, "Inventaire : Clé en métal", #F1C40F, 14)
sinon
label(jeuToile, 60, 472, "Inventaire : Vide (Cliquez sur un élément)", #BDC3C7, 13)
fin si
// SCÈNE 2 : Le Tableau (Indice)
sinon si sceneCourante = 2 alors
remplir(jeuToile, #34495E)
label(jeuToile, 160, 45, "SCÈNE 2 : Le Tableau", #FFFFFF, 20)
// Cadre et toile
rectangle(jeuToile, 60, 80, 430, 290, #B9770E)
rectangle(jeuToile, 75, 95, 400, 260, #FEF9E7)
// Décoration peinte sur la toile
cercle(jeuToile, 275, 170, 50, #E74C3C)
polygone(jeuToile, [200, 280, 350, 280, 275, 180], #27AE60)
// Indice gravé en bas
rectangle_arrondi(jeuToile, 130, 300, 290, 45, 5, #E5E7E9)
label(jeuToile, 145, 330, "Code secret : 421", #C0392B, 22)
// Bouton Retour
rectangle_arrondi(jeuToile, 200, 415, 150, 45, 10, #7F8C8D)
label(jeuToile, 245, 443, "Retour", #FFFFFF, 16)
// SCÈNE 3 : La Commode (La clé)
sinon si sceneCourante = 3 alors
remplir(jeuToile, #34495E)
label(jeuToile, 150, 45, "SCÈNE 3 : La Commode", #FFFFFF, 20)
rectangle(jeuToile, 80, 90, 390, 290, #5D4037)
rectangle_arrondi(jeuToile, 100, 110, 350, 110, 5, #795548)
rectangle_arrondi(jeuToile, 100, 240, 350, 120, 5, #795548)
si non aCle alors
rectangle_arrondi(jeuToile, 150, 265, 250, 70, 8, #E67E22)
cercle(jeuToile, 275, 300, 10, #F1C40F)
label(jeuToile, 185, 306, "Fouiller le tiroir", #FFFFFF, 16)
sinon
rectangle_arrondi(jeuToile, 150, 265, 250, 70, 8, #27AE60)
label(jeuToile, 170, 306, "Tiroir fouillé (Clé prise)", #FFFFFF, 15)
fin si
// Bouton Retour
rectangle_arrondi(jeuToile, 200, 415, 150, 45, 10, #7F8C8D)
label(jeuToile, 245, 443, "Retour", #FFFFFF, 16)
// SCÈNE 4 : La Porte (Verrou & Digicode)
sinon si sceneCourante = 4 alors
remplir(jeuToile, #2C3E50)
label(jeuToile, 180, 45, "SCÈNE 4 : La Porte", #FFFFFF, 20)
rectangle(jeuToile, 150, 80, 250, 320, #145A32)
rectangle(jeuToile, 165, 95, 220, 290, #1E8449)
// Serrures et Digicode
cercle(jeuToile, 190, 240, 10, #F1C40F)
rectangle_arrondi(jeuToile, 310, 200, 55, 75, 5, #34495E)
rectangle(jeuToile, 318, 208, 39, 20, #2C3E50)
label(jeuToile, 325, 222, "###", #2ECC71, 10)
cercle(jeuToile, 337, 250, 12, #E74C3C)
label(jeuToile, 323, 254, "CODE", #FFFFFF, 9)
si non aCle alors
rectangle_arrondi(jeuToile, 70, 410, 410, 35, 5, #C0392B)
label(jeuToile, 100, 432, "La porte est verrouillée à clé !", #FFFFFF, 14)
sinon
rectangle_arrondi(jeuToile, 60, 410, 430, 35, 5, #27AE60)
label(jeuToile, 85, 432, "Clé insérée ! Cliquez sur le boîtier 'CODE'.", #FFFFFF, 13)
fin si
// Bouton Retour
rectangle_arrondi(jeuToile, 200, 450, 150, 40, 10, #7F8C8D)
label(jeuToile, 245, 476, "Retour", #FFFFFF, 15)
// SCÈNE 5 : La Fenêtre (Observation)
sinon si sceneCourante = 5 alors
remplir(jeuToile, #1B2631)
label(jeuToile, 160, 45, "SCÈNE 5 : La Fenêtre", #FFFFFF, 20)
// Cadre et ciel nocturne
rectangle(jeuToile, 100, 80, 350, 290, #ECF0F1)
rectangle(jeuToile, 115, 95, 320, 260, #0B132B)
// Lune et étoiles
cercle(jeuToile, 360, 160, 40, #F4D03F)
cercle(jeuToile, 345, 160, 35, #0B132B)
cercle(jeuToile, 160, 140, 2, #FFFFFF)
cercle(jeuToile, 220, 180, 3, #FFFFFF)
cercle(jeuToile, 280, 120, 2, #FFFFFF)
label(jeuToile, 130, 395, "La nuit est claire, mais aucun passage ici.", #ECF0F1, 13)
// Bouton Retour
rectangle_arrondi(jeuToile, 200, 420, 150, 45, 10, #7F8C8D)
label(jeuToile, 245, 448, "Retour", #FFFFFF, 16)
// SCÈNE 6 : La Sortie (Victoire)
sinon si sceneCourante = 6 alors
remplir(jeuToile, #1E8449)
// Rayons de victoire
polygone(jeuToile, [275, 250, 0, 0, 150, 0], #27AE60)
polygone(jeuToile, [275, 250, 400, 0, 550, 0], #27AE60)
polygone(jeuToile, [275, 250, 550, 200, 550, 350], #27AE60)
polygone(jeuToile, [275, 250, 0, 200, 0, 350], #27AE60)
rectangle_arrondi(jeuToile, 75, 120, 400, 220, 15, #145A32)
label(jeuToile, 145, 180, "VICTOIRE !", #F1C40F, 32)
label(jeuToile, 115, 230, "Vous avez déverrouillé la porte", #FFFFFF, 16)
label(jeuToile, 160, 260, "et réussi à vous échapper !", #FFFFFF, 16)
estGagne vaut vrai
fin si
affiche jeuToile
// Gestion des clics
si non estGagne alors
cliquer jeuToile dans clicX, clicY
// Interaction Scène 1
si sceneCourante = 1 alors
si clique(clicX, clicY, 40, 110, 160, 110) alors
sceneCourante vaut 2
sinon si clique(clicX, clicY, 40, 260, 160, 130) alors
sceneCourante vaut 3
sinon si clique(clicX, clicY, 350, 100, 160, 120) alors
sceneCourante vaut 5
sinon si clique(clicX, clicY, 350, 240, 160, 160) alors
sceneCourante vaut 4
fin si
// Interaction Scène 2
sinon si sceneCourante = 2 alors
si clique(clicX, clicY, 200, 415, 150, 45) alors
sceneCourante vaut 1
fin si
// Interaction Scène 3
sinon si sceneCourante = 3 alors
si non aCle et clique(clicX, clicY, 150, 265, 250, 70) alors
aCle vaut vrai
affiche "Vous avez trouvé la clé en métal !"
sinon si clique(clicX, clicY, 200, 415, 150, 45) alors
sceneCourante vaut 1
fin si
// Interaction Scène 4
sinon si sceneCourante = 4 alors
si clique(clicX, clicY, 310, 200, 55, 75) alors
si non aCle alors
affiche "La porte est verrouillée ! Il vous faut la clé."
sinon
demande "Entrez le code secret : " dans saisieCode
si saisieCode = "421" alors
sceneCourante vaut 6
sinon
affiche "Code incorrect !"
fin si
fin si
sinon si clique(clicX, clicY, 200, 450, 150, 40) alors
sceneCourante vaut 1
fin si
// Interaction Scène 5
sinon si sceneCourante = 5 alors
si clique(clicX, clicY, 200, 420, 150, 45) alors
sceneCourante vaut 1
fin si
fin si
fin si
fin tant que





