Console
Clique sur « Exécuter » pour lancer le programme.
Aucune exécutionCtrl+Entrée : exécuter · Échap : arrêter
Code CoddyRun
@ Constantes
CASE_L est un nombre
CASE_L vaut 40
NB_COL est un nombre
NB_COL vaut 200
VIT est un nombre
VIT vaut 10
IMPULSION est un nombre
IMPULSION vaut 28
GRAVITE est un nombre
GRAVITE vaut 4
X_CUBE est un nombre
X_CUBE vaut 120
L_CUBE est un nombre
L_CUBE vaut 32
Y_SOL est un nombre
Y_SOL vaut 360
@ Le niveau
rang0 est un texte
rang1 est un texte
rang2 est un texte
rang0 vaut "..............^.......^.......^^^......#......^......^.#......^^......#.....#.#.....^.....^^^....#......#.^.....^#^....^^....^....##....##....^....^^....#.#....#....^....^^....^#^....................."
rang1 vaut "...............................o......................................^....................o......#..............o.................#............................^................o......................"
rang2 vaut "........................................................................................................................................................................................................"
@ Etat du jeu
ecran est une toile
dimension(ecran, 640, 480)
decalage, hauteur, vy est un nombre
demandeSaut, angleCube est un nombre
tentatives, progression, meilleure est un nombre
etat, gelEtat est un nombre
resultat, hauteurPose est un nombre
auSol, enJeu, surOrbe est un booleen
i, c, col, colA, colB, rg, cx, cy, sx, sy, sx2 est un nombre
cosA, sinA, bas, haut, oBas, oHaut est un nombre
caract est un texte
action est un nombre
decalage vaut 0
hauteur vaut 0
vy vaut 0
demandeSaut vaut 0
angleCube vaut 0
tentatives vaut 1
progression vaut 0
etat vaut 0
gelEtat vaut 0
auSol vaut vrai
surOrbe vaut faux
enJeu vaut vrai
essayer
meilleure vaut parametre('geodash', 'record')
attraper
meilleure vaut 0
parametre('geodash', 'record', meilleure)
fin essayer
@ Lecture du niveau
fonction caseA(rg2, col2)
si col2 < 0 ou col2 >= NB_COL alors
retourne "."
fin si
si rg2 = 0 alors
retourne copier(rang0, col2 + 1, 1)
sinon si rg2 = 1 alors
retourne copier(rang1, col2 + 1, 1)
sinon
retourne copier(rang2, col2 + 1, 1)
fin si
fin fonction
@ Collisions
procédure testerEtat()
resultat vaut 0
hauteurPose vaut -1
surOrbe vaut faux
bas vaut hauteur
haut vaut hauteur + L_CUBE
colA vaut arrondi_inferieur((X_CUBE + decalage) / CASE_L)
colB vaut arrondi_inferieur((X_CUBE + L_CUBE - 1 + decalage) / CASE_L)
pour col de colA à colB
pour rg de 0 à 2
caract vaut caseA(rg, col)
si caract <> "." alors
oBas vaut rg * CASE_L
oHaut vaut oBas + CASE_L
si caract = "^" alors
si X_CUBE + L_CUBE + decalage > col * CASE_L + 10 et X_CUBE + decalage < col * CASE_L + 30 alors
si bas < oBas + 30 et haut > oBas alors
resultat vaut 2
fin si
fin si
sinon si caract = "o" alors
si X_CUBE + L_CUBE + decalage > col * CASE_L et X_CUBE + decalage < col * CASE_L + CASE_L alors
si bas < oHaut et haut > oBas alors
surOrbe vaut vrai
fin si
fin si
sinon
si haut > oBas et bas < oHaut alors
si vy <= 0 et bas >= oHaut - 14 alors
si oHaut > hauteurPose alors
hauteurPose vaut oHaut
fin si
sinon
resultat vaut 2
fin si
fin si
fin si
fin si
fin pour
fin pour
si resultat <> 2 et hauteurPose >= 0 alors
resultat vaut 1
fin si
fin procédure
procédure recommencer()
decalage vaut 0
hauteur vaut 0
vy vaut 0
auSol vaut vrai
surOrbe vaut faux
demandeSaut vaut 0
angleCube vaut 0
etat vaut 0
fin procédure
@ Dessin
procédure dessinerFond(g)
// Fond bleu uni vif
remplir(g, #0055FF)
// Gros blocs géométriques en arrière-plan (parallaxe) avec transparence
pour i de 0 à 5
sx vaut 50 + i * 200 - (decalage / 4 mod 200)
rectangle(g, sx, 80, 120, 120, rgba(0, 100, 255, 0.4))
sx2 vaut 150 + i * 250 - (decalage / 3 mod 250)
rectangle(g, sx2, 220, 90, 90, rgba(0, 70, 200, 0.4))
fin pour
fin procédure
procédure dessinerSol(g)
// Base bleue foncée
rectangle(g, 0, Y_SOL, 640, 120, #003399)
// Séparateurs verticaux dans le sol
pour i de 0 à 17
sx vaut 0 - (decalage mod 40) + i * 40
ligne(g, sx, Y_SOL, sx, 480, #002277, 4)
fin pour
// Ligne de crête lumineuse (cyan puis blanche par-dessus)
rectangle(g, 0, Y_SOL - 2, 640, 6, #00FFFF)
rectangle(g, 0, Y_SOL, 640, 2, #FFFFFF)
fin procédure
procédure dessinerPic(g, ax, ay)
// Contour extérieur cyan
triangle(g, ax + 20, ay - 2, ax + 42, ay + CASE_L, ax - 2, ay + CASE_L, #00FFFF)
// Remplissage noir
triangle(g, ax + 20, ay + 2, ax + 38, ay + CASE_L, ax + 2, ay + CASE_L, #000000)
fin procédure
procédure dessinerBloc(g, ax, ay)
// Contour cyan
rectangle(g, ax, ay, CASE_L, CASE_L, #00FFFF)
// Remplissage noir
rectangle(g, ax + 2, ay + 2, CASE_L - 4, CASE_L - 4, #000000)
fin procédure
procédure dessinerOrbe(g, ax, ay)
// Anneaux cyan concentriques vides
contour(g, #00FFFF, 2)
cercle(g, ax + 20, ay + 20, 16, rgba(0, 0, 0, 0))
cercle(g, ax + 20, ay + 20, 10, rgba(0, 0, 0, 0))
contour(g, #0)
// Centre jaune vif avec coeur blanc
cercle(g, ax + 20, ay + 20, 6, #FFFF00)
cercle(g, ax + 20, ay + 20, 3, #FFFFFF)
fin procédure
procédure dessinerCube(g)
cx vaut X_CUBE + L_CUBE / 2
cy vaut Y_SOL - hauteur - L_CUBE / 2
cosA vaut cosinus(radians(angleCube))
sinA vaut sinus(radians(angleCube))
// Base rose avec contour noir
contour(g, #000000, 2)
polygone(g, cx + (0 - 16) * cosA - (0 - 16) * sinA, cy + (0 - 16) * sinA + (0 - 16) * cosA, cx + 16 * cosA - (0 - 16) * sinA, cy + 16 * sinA + (0 - 16) * cosA, cx + 16 * cosA - 16 * sinA, cy + 16 * sinA + 16 * cosA, cx + (0 - 16) * cosA - 16 * sinA, cy + (0 - 16) * sinA + 16 * cosA, #FF33CC)
contour(g, #0)
// Icone intérieur / visage géométrique (noir et vert)
polygone(g, cx + (0 - 8) * cosA - (0 - 8) * sinA, cy + (0 - 8) * sinA + (0 - 8) * cosA, cx + 8 * cosA - (0 - 8) * sinA, cy + 8 * sinA + (0 - 8) * cosA, cx + 8 * cosA - 8 * sinA, cy + 8 * sinA + 8 * cosA, cx + (0 - 8) * cosA - 8 * sinA, cy + (0 - 8) * sinA + 8 * cosA, #000000)
polygone(g, cx + (0 - 4) * cosA - (0 - 4) * sinA, cy + (0 - 4) * sinA + (0 - 4) * cosA, cx + 4 * cosA - (0 - 4) * sinA, cy + 4 * sinA + (0 - 4) * cosA, cx + 4 * cosA - 4 * sinA, cy + 4 * sinA + 4 * cosA, cx + (0 - 4) * cosA - 4 * sinA, cy + (0 - 4) * sinA + 4 * cosA, #00FF00)
fin procédure
procédure dessinerBandeau(g)
rectangle(g, 0, 0, 640, 45, rgba(0, 30, 100, 0.8))
rectangle_arrondi(g, 120, 15, 400, 14, 7, #002277)
rectangle_arrondi(g, 120, 15, 400 * progression / 100, 14, 7, #00FFFF)
label(g, 536, 26, convertir_texte(arrondi(progression)) + " %", #FFFFFF, 16)
label(g, 14, 27, "ESSAI " + convertir_texte(tentatives), #00FFFF, 15)
fin procédure
@ Moteur du jeu
processus MoteurJeu()
tant que enJeu
si etat = 0 alors
si demandeSaut > 0 alors
si auSol ou surOrbe alors
vy vaut IMPULSION
auSol vaut faux
surOrbe vaut faux
demandeSaut vaut 0
sinon
demandeSaut vaut demandeSaut - 1
fin si
fin si
decalage vaut decalage + VIT
hauteur vaut hauteur + vy
vy vaut vy - GRAVITE
auSol vaut faux
si hauteur <= 0 alors
hauteur vaut 0
vy vaut 0
auSol vaut vrai
fin si
appelle testerEtat()
si resultat = 2 alors
etat vaut 1
gelEtat vaut 22
si progression > meilleure alors
meilleure vaut arrondi(progression)
parametre('geodash', 'record', meilleure)
fin si
sinon si resultat = 1 alors
hauteur vaut hauteurPose
vy vaut 0
auSol vaut vrai
fin si
si auSol alors
angleCube vaut 0
sinon
angleCube vaut angleCube + 6
fin si
progression vaut limiter(decalage * 100 / (NB_COL * CASE_L - 400), 0, 100)
si progression >= 100 alors
etat vaut 2
gelEtat vaut 60
meilleure vaut 100
parametre('geodash', 'record', 100)
fin si
sinon
gelEtat vaut gelEtat - 1
si gelEtat <= 0 alors
si etat = 1 alors
tentatives vaut tentatives + 1
appelle recommencer()
sinon
enJeu vaut faux
fin si
fin si
fin si
effacer(ecran)
appelle dessinerFond(ecran)
colA vaut arrondi_inferieur(decalage / CASE_L) - 1
colB vaut colA + 18
pour col de colA à colB
pour rg de 0 à 2
caract vaut caseA(rg, col)
si caract <> "." alors
cx vaut col * CASE_L - decalage
cy vaut Y_SOL - (rg + 1) * CASE_L
si caract = "^" alors
appelle dessinerPic(ecran, cx, cy)
sinon si caract = "o" alors
appelle dessinerOrbe(ecran, cx, cy)
sinon
appelle dessinerBloc(ecran, cx, cy)
fin si
fin si
fin pour
fin pour
appelle dessinerSol(ecran)
si etat <> 1 alors
appelle dessinerCube(ecran)
fin si
appelle dessinerBandeau(ecran)
si etat = 1 alors
// Éclats roses lors de l'explosion du cube
pour i de 0 à 15
cercle(ecran, X_CUBE + 16 + (i - 7) * (30 - gelEtat) / 2, Y_SOL - hauteur - 16 + (i mod 5 - 2) * (25 - gelEtat) / 2, 6, #FF33CC)
fin pour
label(ecran, 224, 200, "RECOMMENCE", #00FFFF, 26)
label(ecran, 214, 232, "Meilleure tentative : " + convertir_texte(meilleure) + " %", #FFFFFF, 15)
fin si
si etat = 2 alors
rectangle_arrondi(ecran, 160, 170, 320, 110, 14, rgba(0, 30, 100, 0.9))
label(ecran, 238, 216, "NIVEAU FINI", #00FFFF, 28)
label(ecran, 224, 250, "en " + convertir_texte(tentatives) + " tentatives", #FFFFFF, 18)
fin si
affiche ecran
pause 60
fin tant que
fin processus
@ Programme principal
appelle dessinerFond(ecran)
appelle dessinerSol(ecran)
appelle dessinerCube(ecran)
rectangle_arrondi(ecran, 90, 120, 460, 160, 14, rgba(0, 30, 100, 0.9))
label(ecran, 148, 178, "GEOMETRY DASH", #00FFFF, 36)
label(ecran, 216, 214, "Z = Sauter P = Quitter", #FFFFFF, 17)
label(ecran, 144, 244, "Appuyez sur 'Z' dans un orbe pour rebondir en vol !", #FF33CC, 15)
affiche ecran
pause 2800
MoteurJeu()
tant que enJeu
appuyer ["z", "p"] dans action
si non enJeu alors
arrête
fin si
si action = 1 alors
demandeSaut vaut 3
sinon
enJeu vaut faux
arrête
fin si
fin tant que
affiche "Meilleure tentative : " + convertir_texte(meilleure) + " % en " + convertir_texte(tentatives) + " essais"