Console
Clique sur « Exécuter » pour lancer le programme.
Code CoddyRun
@ CONFIGURATION
ecran est une toile
LARG_E est un nombre
LARG_E vaut 720
HAUT_E est un nombre
HAUT_E vaut 480
dimension(ecran, LARG_E, HAUT_E)
TUILE est un nombre
TUILE vaut 40
SOL_Y est un nombre
SOL_Y vaut 400
// le cube est dessine a cette distance du bord gauche (en cases)
DECALAGE est un nombre
DECALAGE vaut 4.5
// la physique, en cases et en secondes
VITESSE est un nombre
VITESSE vaut 10
GRAVITE est un nombre
GRAVITE vaut 84
ELAN_SAUT est un nombre
ELAN_SAUT vaut 19
ELAN_TREMPLIN est un nombre
ELAN_TREMPLIN vaut 26.4
// la physique avance par petits pas fixes : le jeu reagit pareil sur toutes les machines
PAS_TEMPS est un nombre
PAS_TEMPS vaut 1 / 120
@ LES NIVEAUX
// 4 lignes de texte par niveau, de la rangee du sol (0) a la rangee 3
// 0 vide, 1 bloc, 2 pic, 3 tremplin, 4 piece
NB_NIVEAUX est un nombre
NB_NIVEAUX vaut 3
NOM_NIVEAU est un tableau
NOM_NIVEAU vaut ["Premiers bonds", "Pulsation", "Haute tension"]
DIFFICULTE est un tableau
DIFFICULTE vaut ["Facile", "Moyen", "Difficile"]
COUL_FOND est un tableau
COUL_FOND vaut [#0B2A6F, #4A1272, #6B1414]
COUL_SOL est un tableau
COUL_SOL vaut [#071B4A, #2E0B49, #430B0B]
COUL_NEON est un tableau
COUL_NEON vaut [#38BDF8, #E879F9, #FB923C]
NIV_LIGNES est un tableau
NIV_LIGNES vaut ["0000000000002000000020000000220000000010000000200000001110000000022000000011111111000000002000000220000000011222110000000032222000000000220000000111200000000200000020000001111111100000000112221100000000220000000220000000000000000", "0000000000000000000000000000000000000000000000000000000000000000000000000000001111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111100000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "00000000000022000000222000000111200000011222110000002200000220000001111111111110000002220000003222200000002001100000011002200000011222112221100000022200000200000111120000001102222011000000022000002220000003001100000011222110000022200000011111111000002200000222000000000000000", "00000000000000000000000000000000000000000000000000000000000000000000000111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000001100000000001111000000000000000000000000000001100000000000000000000000000000001111000000000000000000000000000000", "00000000000000000000000000000000000000000040000000000000000000000000000000011110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0000000000002220000022200000112221122211000002001002000001112222220000000222000022000032222111220000012212200000110222201100000222000022200000111120000200110000110022000003222200000222000001122211222110000111111111111000022200002200001112222220000000200100200003001100000110222201100000222000022200001122211000022200000000000000", "0000000000000000000000000000000000000000000000000000000000001112220000000000000000000000000111000000000000000000000111100000000000000000000000001100000000000000000000000000000000000000000000000000000000000000011111111000000000000000000001112220000000000000000000001100000000111100000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000001110000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111000000000000000000000001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"]
@ LE NIVEAU EN COURS
// la case (colonne c, rangee r) est rangee dans carte[c * 4 + r]
LONG_MAX est un nombre
LONG_MAX vaut 340
carte, carteDepart est un tableau
pour kc de 0 à LONG_MAX * 4 - 1
carte ajoute 0
carteDepart ajoute 0
fin pour
niveau, longNiveau est un nombre
@ LE CUBE
// cubeX, cubeY : le coin bas gauche du cube, en cases (cubeY = 0 sur le sol)
cubeX, cubeY, elanY, angle, reste est un nombre
auSol, perdu, gagne est un booléen
nbPieces, essais, tempsNiveau est un nombre
// la trainee derriere le cube
traineeX, traineeY est un tableau
pour kc de 0 à 9
traineeX ajoute 0
traineeY ajoute 0
fin pour
// les eclats quand le cube explose
eclatX, eclatY, eclatVX, eclatVY est un tableau
pour kc de 0 à 15
eclatX ajoute 0
eclatY ajoute 0
eclatVX ajoute 0
eclatVY ajoute 0
fin pour
// les grands carres du decor
decorX, decorY, decorT est un tableau
pour kc de 0 à 7
decorX ajoute kc * 130 + hasard(0, 60)
decorY ajoute hasard(20, 300)
decorT ajoute hasard(40, 110)
fin pour
@ LA PARTIE
// etat : 0 menu, 1 course, 2 explosion, 3 niveau reussi
etat est un nombre
etat vaut 0
appActif est un booléen
appActif vaut vrai
dernierTemps, finExplosion, tic est un nombre
record, recordPieces est un tableau
pour kc de 0 à NB_NIVEAUX - 1
record ajoute 0
recordPieces ajoute 0
essayer
record[kc] vaut parametre('GeometryDash', 'p' + convertir_texte(kc + 1))
attraper
record[kc] vaut 0
fin essayer
essayer
recordPieces[kc] vaut parametre('GeometryDash', 'c' + convertir_texte(kc + 1))
attraper
recordPieces[kc] vaut 0
fin essayer
fin pour
nouveauRecord est un booléen
// la souris
sourisXC, sourisYC, finTampon est un nombre
appuye, etaitAppuye, clicSouris, vuAppuye, attendRelache est un booléen
@ OUTILS
procédure centrer(txt, xMil, ty, coul, tp)
label(ecran, xMil - label_largeur(txt, tp) / 2, ty, txt, coul, tp)
fin procédure
fonction caseEn(c, r)
si c < 0 ou c >= longNiveau ou r < 0 ou r > 3 alors
retourne 0
fin si
retourne carte[c * 4 + r]
fin fonction
fonction pourcent()
retourne limiter(arrondi_inferieur(cubeX * 100 / longNiveau), 0, 100)
fin fonction
@ CHARGER UN NIVEAU
procédure remettreAuDepart()
k est un nombre
pour k de 0 à longNiveau * 4 - 1
carte[k] vaut carteDepart[k]
fin pour
cubeX vaut 0
cubeY vaut 0
elanY vaut 0
angle vaut 0
reste vaut 0
auSol vaut vrai
perdu vaut faux
gagne vaut faux
nbPieces vaut 0
tempsNiveau vaut 0
pour k de 0 à 9
traineeX[k] vaut -100
traineeY[k] vaut 0
fin pour
attendRelache vaut vrai
finTampon vaut 0
etat vaut 1
fin procédure
procédure chargerNiveau(nv)
c, r, k est un nombre
txt est un texte
niveau vaut nv
txt vaut NIV_LIGNES[nv * 4]
longNiveau vaut longueur(txt)
pour r de 0 à 3
txt vaut NIV_LIGNES[nv * 4 + r]
pour c de 0 à longNiveau - 1
k vaut c * 4 + r
carteDepart[k] vaut convertir_nombre(copier(txt, c + 1, 1))
fin pour
fin pour
essais vaut 1
nouveauRecord vaut faux
appelle remettreAuDepart()
fin procédure
procédure noterRecord()
si pourcent() > record[niveau] alors
record[niveau] vaut pourcent()
nouveauRecord vaut vrai
essayer
parametre('GeometryDash', 'p' + convertir_texte(niveau + 1), record[niveau])
attraper
tic vaut tic
fin essayer
fin si
fin procédure
procédure exploser()
k est un nombre
perdu vaut vrai
etat vaut 2
finExplosion vaut chrono() + 750
pour k de 0 à 15
eclatX[k] vaut cubeX + 0.5
eclatY[k] vaut cubeY + 0.5
eclatVX[k] vaut hasard(-60, 90) / 10
eclatVY[k] vaut hasard(-20, 120) / 10
fin pour
appelle noterRecord()
fin procédure
procédure reussir()
gagne vaut vrai
etat vaut 3
cubeX vaut longNiveau
appelle noterRecord()
si nbPieces > recordPieces[niveau] alors
recordPieces[niveau] vaut nbPieces
essayer
parametre('GeometryDash', 'c' + convertir_texte(niveau + 1), nbPieces)
attraper
tic vaut tic
fin essayer
fin si
fin procédure
@ LA PHYSIQUE
// un petit pas de 1/120 de seconde ; saut = le joueur demande a sauter
procédure pasPhysique(saut)
avant, c, r, c1, r1, t, dessus est un nombre
si saut et auSol alors
elanY vaut ELAN_SAUT
auSol vaut faux
fin si
elanY vaut maximum(elanY - GRAVITE * PAS_TEMPS, -26)
avant vaut cubeY
cubeX vaut cubeX + VITESSE * PAS_TEMPS
cubeY vaut cubeY + elanY * PAS_TEMPS
auSol vaut faux
si cubeY <= 0 alors
cubeY vaut 0
elanY vaut 0
auSol vaut vrai
fin si
c vaut arrondi_inferieur(cubeX + 0.02)
c1 vaut arrondi_inferieur(cubeX + 0.98)
tant que c <= c1 et non perdu
r vaut arrondi_inferieur(cubeY)
r1 vaut arrondi_inferieur(cubeY + 0.98)
tant que r <= r1 et non perdu
t vaut caseEn(c, r)
si t = 1 alors
// un bloc : on se pose dessus si on arrive par le haut, sinon c'est le choc
dessus vaut r + 1
si elanY <= 0 et avant >= dessus - 0.35 alors
cubeY vaut dessus
elanY vaut 0
auSol vaut vrai
sinon
perdu vaut vrai
fin si
sinon si t = 2 alors
// un pic : seule sa partie centrale est dangereuse
si cubeX + 1 > c + 0.35 et cubeX < c + 0.65 et cubeY < r + 0.55 alors
perdu vaut vrai
fin si
sinon si t = 3 alors
si cubeX + 1 > c + 0.1 et cubeX < c + 0.9 et cubeY < r + 0.25 alors
elanY vaut ELAN_TREMPLIN
auSol vaut faux
fin si
sinon si t = 4 alors
carte[c * 4 + r] vaut 0
nbPieces vaut nbPieces + 1
fin si
r vaut r + 1
fin tant que
c vaut c + 1
fin tant que
si auSol alors
angle vaut arrondi(angle / 90) * 90
sinon
angle vaut angle + 400 * PAS_TEMPS
fin si
fin procédure
// fait avancer la course de dt secondes
procédure avancer(dt, saut)
k est un nombre
reste vaut reste + dt
tempsNiveau vaut tempsNiveau + dt
tant que reste >= PAS_TEMPS et non perdu et non gagne
reste vaut reste - PAS_TEMPS
appelle pasPhysique(saut)
si cubeX >= longNiveau alors
gagne vaut vrai
fin si
fin tant que
// la trainee
k vaut tic mod 10
traineeX[k] vaut cubeX
traineeY[k] vaut cubeY
fin procédure
@ LES DESSINS
// un carre de cote t, centre en (cx, cy), tourne de ang degres
procédure carreTourne(cx, cy, t, ang, coul)
ca, sa est un nombre
ca vaut cosinus(radians(ang)) * t / 2
sa vaut sinus(radians(ang)) * t / 2
polygone(ecran, cx - ca + sa, cy - sa - ca, cx + ca + sa, cy + sa - ca, cx + ca - sa, cy + sa + ca, cx - ca - sa, cy - sa + ca, coul)
fin procédure
procédure dessinerCube(cx, cy, ang)
ca, sa est un nombre
ca vaut cosinus(radians(ang))
sa vaut sinus(radians(ang))
appelle carreTourne(cx, cy, TUILE, ang, #111827)
appelle carreTourne(cx, cy, TUILE - 6, ang, #FACC15)
appelle carreTourne(cx, cy, TUILE - 18, ang, #F97316)
// les yeux, qui tournent avec le cube
appelle carreTourne(cx - 8 * ca + 8 * sa, cy - 8 * sa - 8 * ca, 8, ang, #111827)
appelle carreTourne(cx + 8 * ca + 8 * sa, cy + 8 * sa - 8 * ca, 8, ang, #111827)
fin procédure
procédure dessinerDecor(camX)
k, x, battement est un nombre
remplir(ecran, COUL_FOND[niveau])
// le decor bat au rythme : deux battements par seconde
battement vaut 0.05 + 0.04 * absolue(sinus(tempsNiveau * 2 * pi()))
pour k de 0 à 7
x vaut arrondi(decorX[k] - camX * 12 + 100000) mod 1040 - 160
rectangle(ecran, x, decorY[k], decorT[k], decorT[k], rgba(255, 255, 255, battement))
rectangle(ecran, x + 8, decorY[k] + 8, decorT[k] - 16, decorT[k] - 16, rgba(0, 0, 0, 0.08))
fin pour
// le sol
rectangle(ecran, 0, SOL_Y, LARG_E, HAUT_E - SOL_Y, COUL_SOL[niveau])
pour k de 0 à 18
x vaut (k - camX + arrondi_inferieur(camX)) * TUILE
rectangle(ecran, x, SOL_Y, 2, HAUT_E - SOL_Y, rgba(255, 255, 255, 0.06))
fin pour
rectangle(ecran, 0, SOL_Y, LARG_E, 3, COUL_NEON[niveau])
rectangle(ecran, 0, SOL_Y + 3, LARG_E, 6, rgba(255, 255, 255, 0.08))
fin procédure
procédure dessinerCases(camX)
c, r, c0, x, y, t est un nombre
c0 vaut arrondi_inferieur(camX)
pour c de c0 à c0 + 18
x vaut (c - camX) * TUILE
pour r de 0 à 3
t vaut caseEn(c, r)
y vaut SOL_Y - (r + 1) * TUILE
si t = 1 alors
rectangle(ecran, x, y, TUILE, TUILE, COUL_NEON[niveau])
rectangle(ecran, x + 3, y + 3, TUILE - 6, TUILE - 6, #0F172A)
rectangle(ecran, x + 9, y + 9, TUILE - 18, TUILE - 18, rgba(255, 255, 255, 0.08))
sinon si t = 2 alors
polygone(ecran, x + 2, y + TUILE, x + TUILE / 2, y + 2, x + TUILE - 2, y + TUILE, #F8FAFC)
polygone(ecran, x + 9, y + TUILE - 3, x + TUILE / 2, y + 14, x + TUILE - 9, y + TUILE - 3, #0F172A)
sinon si t = 3 alors
rectangle_arrondi(ecran, x + 4, y + TUILE - 10, TUILE - 8, 10, 4, #FDE047)
rectangle_arrondi(ecran, x + 10, y + TUILE - 16, TUILE - 20, 8, 4, rgba(253, 224, 71, 0.45))
sinon si t = 4 alors
cercle(ecran, x + TUILE / 2, y + TUILE / 2, 13, #CA8A04)
cercle(ecran, x + TUILE / 2, y + TUILE / 2, 10, #FDE047)
rectangle(ecran, x + TUILE / 2 - 2, y + TUILE / 2 - 6, 4, 12, #CA8A04)
fin si
fin pour
fin pour
// la ligne d'arrivee
x vaut (longNiveau - camX) * TUILE
si x < LARG_E alors
rectangle(ecran, x, 0, 6, SOL_Y, #FFFFFF)
rectangle(ecran, x + 6, 0, 60, SOL_Y, rgba(255, 255, 255, 0.25))
rectangle(ecran, x + 66, 0, LARG_E, SOL_Y, rgba(255, 255, 255, 0.12))
fin si
fin procédure
procédure dessinerCourse()
camX, k, j, x, y, age, p est un nombre
camX vaut cubeX - DECALAGE
appelle dessinerDecor(camX)
appelle dessinerCases(camX)
si etat = 2 alors
// les eclats de l'explosion
age vaut 0.75 - (finExplosion - chrono()) / 1000
pour k de 0 à 15
x vaut (eclatX[k] + eclatVX[k] * age - camX) * TUILE
y vaut SOL_Y - (eclatY[k] + eclatVY[k] * age - 14 * age * age) * TUILE
si y < SOL_Y alors
rectangle(ecran, x - 5, y - 5, 10, 10, rgba(250, 204, 21, 1 - age))
fin si
fin pour
cercle(ecran, DECALAGE * TUILE + 20, SOL_Y - cubeY * TUILE - 20, 20 + age * 90, rgba(255, 255, 255, 0.35 - age * 0.45))
sinon
// la trainee, de la plus ancienne a la plus recente
pour j de 1 à 9
k vaut (tic + j) mod 10
x vaut (traineeX[k] - camX) * TUILE + TUILE / 2
y vaut SOL_Y - traineeY[k] * TUILE - 8
rectangle(ecran, x - j * 0.8, y - j * 0.8, j * 1.6, j * 1.6, rgba(250, 204, 21, j * 0.05))
fin pour
appelle dessinerCube(DECALAGE * TUILE + TUILE / 2, SOL_Y - cubeY * TUILE - TUILE / 2, angle)
fin si
// la barre de progression
p vaut pourcent()
rectangle_arrondi(ecran, 210, 14, 300, 12, 6, rgba(0, 0, 0, 0.45))
rectangle_arrondi(ecran, 210, 14, maximum(12, 3 * p), 12, 6, COUL_NEON[niveau])
label(ecran, 520, 26, convertir_texte(p) + " %", #FFFFFF, 14)
label(ecran, 14, 26, NOM_NIVEAU[niveau], #FFFFFF, 14)
label(ecran, 14, 46, "Essai " + convertir_texte(essais), rgba(255, 255, 255, 0.7), 12)
pour k de 0 à 2
si k < nbPieces alors
cercle(ecran, 640 + k * 26, 22, 10, #FDE047)
sinon
cercle(ecran, 640 + k * 26, 22, 10, rgba(0, 0, 0, 0.4))
fin si
fin pour
si tempsNiveau < 2.5 et essais = 1 alors
appelle centrer("Espace, flèche Haut ou clic pour sauter", LARG_E / 2, 110, #FFFFFF, 18)
fin si
fin procédure
procédure dessinerReussi()
rectangle(ecran, 0, 0, LARG_E, HAUT_E, rgba(0, 0, 0, 0.5))
rectangle_arrondi(ecran, 180, 120, 360, 240, 18, #0F172A)
rectangle_arrondi(ecran, 184, 124, 352, 232, 15, #1E293B)
appelle centrer("Niveau réussi !", 360, 172, #FDE047, 28)
appelle centrer(NOM_NIVEAU[niveau], 360, 204, #FFFFFF, 16)
appelle centrer("Essais : " + convertir_texte(essais) + " Pièces : " + convertir_texte(nbPieces) + " / 3", 360, 244, #CBD5E1, 15)
rectangle_arrondi(ecran, 270, 280, 180, 46, 12, COUL_NEON[niveau])
appelle centrer("Menu", 360, 310, #0F172A, 18)
fin procédure
procédure dessinerMenu()
k, j, x est un nombre
remplir(ecran, #0F172A)
pour k de 0 à 7
x vaut arrondi(decorX[k] + tic * 0.6) mod 1040 - 160
rectangle(ecran, x, decorY[k] + 60, decorT[k], decorT[k], rgba(255, 255, 255, 0.04))
fin pour
rectangle(ecran, 0, 440, LARG_E, 40, #020617)
rectangle(ecran, 0, 440, LARG_E, 3, #38BDF8)
appelle dessinerCube(120 + 20 * sinus(tic * 0.05), 80 - 14 * absolue(sinus(tic * 0.12)), tic * 4)
appelle centrer("Geometry Dash v2", 380, 92, #FACC15, 46)
appelle centrer("Le cube file tout seul : à toi de sauter au bon moment !", 360, 128, #CBD5E1, 14)
pour k de 0 à 2
x vaut 45 + k * 215
rectangle_arrondi(ecran, x, 156, 200, 238, 16, COUL_NEON[k])
rectangle_arrondi(ecran, x + 4, 160, 192, 230, 13, COUL_FOND[k])
appelle centrer(convertir_texte(k + 1), x + 100, 214, rgba(255, 255, 255, 0.25), 44)
appelle centrer(NOM_NIVEAU[k], x + 100, 248, #FFFFFF, 17)
appelle centrer(DIFFICULTE[k], x + 100, 270, COUL_NEON[k], 13)
rectangle_arrondi(ecran, x + 24, 286, 152, 10, 5, rgba(0, 0, 0, 0.45))
si record[k] > 0 alors
rectangle_arrondi(ecran, x + 24, 286, maximum(10, 1.52 * record[k]), 10, 5, COUL_NEON[k])
fin si
appelle centrer("Record : " + convertir_texte(record[k]) + " %", x + 100, 316, #E2E8F0, 13)
pour j de 0 à 2
si j < recordPieces[k] alors
cercle(ecran, x + 76 + j * 24, 336, 8, #FDE047)
sinon
cercle(ecran, x + 76 + j * 24, 336, 8, rgba(0, 0, 0, 0.45))
fin si
fin pour
rectangle_arrondi(ecran, x + 40, 352, 120, 30, 10, COUL_NEON[k])
appelle centrer("Jouer", x + 100, 373, #0F172A, 15)
fin pour
appelle centrer("Clique sur un niveau ou tape 1, 2 ou 3 X : quitter", 360, 426, #94A3B8, 12)
fin procédure
procédure dessiner()
effacer(ecran)
contour(ecran, #0)
si etat = 0 alors
appelle dessinerMenu()
sinon
appelle dessinerCourse()
si etat = 3 alors
appelle dessinerReussi()
fin si
fin si
fin procédure
@ LES COMMANDES
procédure cliquerMenu(x, y)
k est un nombre
pour k de 0 à 2
si clique(x, y, 45 + k * 215, 156, 200, 238) alors
appelle chargerNiveau(k)
fin si
fin pour
fin procédure
// un tour de jeu : dt est le temps ecoule en secondes
procédure tourDeJeu(dt)
debut, saut est un booléen
tic vaut tic + 1
sourisXC vaut souris_x(ecran)
sourisYC vaut souris_y(ecran)
appuye vaut souris_appuyée(ecran)
clicSouris vaut souris_clic(ecran)
debut vaut faux
si appuye alors
vuAppuye vaut vrai
si non etaitAppuye alors
debut vaut vrai
fin si
sinon
attendRelache vaut faux
fin si
// si le bouton maintenu n'est pas vu, un simple clic compte quand meme
si clicSouris et non vuAppuye alors
debut vaut vrai
finTampon vaut chrono() + 130
fin si
etaitAppuye vaut appuye
si etat = 0 alors
si debut alors
appelle cliquerMenu(sourisXC, sourisYC)
fin si
si touche_pressée('1') alors
appelle chargerNiveau(0)
fin si
si touche_pressée('2') alors
appelle chargerNiveau(1)
fin si
si touche_pressée('3') alors
appelle chargerNiveau(2)
fin si
si touche_pressée('échap') alors
appActif vaut faux
fin si
sinon
si etat = 1 alors
saut vaut faux
si touche_enfoncée('espace') ou touche_enfoncée('haut') alors
saut vaut vrai
fin si
si appuye et non attendRelache alors
saut vaut vrai
fin si
si chrono() < finTampon alors
saut vaut vrai
fin si
appelle avancer(dt, saut)
si perdu alors
appelle exploser()
sinon si gagne alors
appelle reussir()
fin si
sinon si etat = 2 alors
si chrono() >= finExplosion alors
essais vaut essais + 1
appelle remettreAuDepart()
fin si
sinon
si debut ou touche_pressée('espace') alors
etat vaut 0
fin si
fin si
si touche_pressée('échap') alors
etat vaut 0
fin si
fin si
si touche_pressée('x') alors
appActif vaut faux
fin si
fin procédure
@ DEMARRAGE
maintenantMs est un nombre
dernierTemps vaut chrono()
tant que appActif
maintenantMs vaut chrono()
appelle tourDeJeu(limiter((maintenantMs - dernierTemps) / 1000, 0, 0.1))
dernierTemps vaut maintenantMs
appelle dessiner()
affiche ecran
pause 30
fin tant que
effacer(ecran)
remplir(ecran, #0F172A)
appelle centrer("À bientôt !", LARG_E / 2, HAUT_E / 2, #FACC15, 24)
affiche ecran