Console
Clique sur « Exécuter » pour lancer le programme.
Code CoddyRun
@ CONFIGURATION
ecran est une toile
dimension(ecran, 480, 540)
CX est un nombre
CX vaut 240
CY est un nombre
CY vaut 290
R_EXT est un nombre
R_EXT vaut 170
R_INT est un nombre
R_INT vaut 75
// Couleurs Neon Cyberpunk
coulTerne est un tableau
coulTerne ajoute #08281D
coulTerne ajoute #360A15
coulTerne ajoute #332B00
coulTerne ajoute #042333
coulBord est un tableau
coulBord ajoute #00FF88
coulBord ajoute #FF2A6D
coulBord ajoute #FFE600
coulBord ajoute #05D9E8
coulVive est un tableau
coulVive ajoute #00FF99
coulVive ajoute #FF3366
coulVive ajoute #FFEB3B
coulVive ajoute #00E5FF
lettre est un tableau
lettre vaut ["A", "Z", "Q", "S"]
angDebut est un tableau
angDebut vaut [180, 270, 90, 0]
// Etoiles de fond
etoilesX, etoilesY, etoilesT, etoilesO est un tableau
iE est un nombre
pour iE de 1 à 35
etoilesX ajoute hasard(10, 470)
etoilesY ajoute hasard(10, 530)
etoilesT ajoute hasard(1, 3)
etoilesO ajoute hasard(2, 8) / 10
fin pour
@ ETAT DU JEU
etat est un nombre
etat vaut 0
appActif est un booléen
appActif vaut vrai
sequence est un tableau
rang, chrono2, allumee, allumeeT, appui, tic, meilleur, secousse est un nombre
action, ptX, ptY est un nombre
eclX, eclY, eclVX, eclVY, eclT, eclC, eclR est un tableau
appui vaut -1
allumee vaut -1
tic vaut 0
essayer
meilleur vaut parametre('simon_neon', 'meilleur')
attraper
meilleur vaut 0
fin essayer
@ OUTILS
fonction score()
retourne maximum(0, longueur(sequence) - 1)
fin fonction
fonction dureeLumiere()
retourne maximum(4, 10 - arrondi_inferieur(longueur(sequence) / 2))
fin fonction
procédure eclats(x, y, coul, nb)
ke est un nombre
pour ke de 1 à nb
si longueur(eclT) < 120 alors
eclX ajoute x
eclY ajoute y
eclVX ajoute hasard(-9, 9)
eclVY ajoute hasard(-11, 4)
eclT ajoute hasard(12, 28)
eclC ajoute coul
eclR ajoute hasard(2, 5)
fin si
fin pour
fin procédure
// Centrage vertical sans label_hauteur
procédure centrer(txt, xMil, yMil, coul, taillePolice)
lx est un nombre
lx vaut xMil - label_largeur(txt, taillePolice) / 2
ly est un nombre
ly vaut yMil + taillePolice * 0.35
label(ecran, lx, ly, txt, coul, taillePolice)
fin procédure
fonction toucheSous(x, y)
dx est un nombre
dx vaut x - CX
dy est un nombre
dy vaut y - CY
d est un nombre
d vaut racine(dx * dx + dy * dy)
si d < R_INT ou d > R_EXT alors
retourne -1
fin si
si dy < 0 alors
si dx < 0 alors
retourne 0
fin si
retourne 1
fin si
si dx < 0 alors
retourne 2
fin si
retourne 3
fin fonction
@ LE DEROULEMENT
procédure nouvellePartie()
vide sequence
sequence ajoute hasard(0, 3)
vide eclX
vide eclY
vide eclVX
vide eclVY
vide eclT
vide eclC
vide eclR
appelle lancerDemo()
fin procédure
procédure lancerDemo()
rang vaut 0
chrono2 vaut -8
allumee vaut -1
etat vaut 1
fin procédure
procédure verifierAppui(t)
allumee vaut t
allumeeT vaut 5
si t = sequence[rang] alors
rang ajoute 1
si rang >= longueur(sequence) alors
appelle eclats(CX, CY, coulVive[t], 30)
etat vaut 3
chrono2 vaut 0
fin si
sinon
secousse vaut 12
appelle eclats(CX, CY, #FF2A6D, 35)
si score() > meilleur alors
meilleur vaut score()
parametre('simon_neon', 'meilleur', meilleur)
fin si
etat vaut 4
chrono2 vaut 0
fin si
fin procédure
procédure animer()
si etat = 1 alors
chrono2 ajoute 1
si chrono2 >= 0 alors
d est un nombre
d vaut dureeLumiere()
etape est un nombre
etape vaut arrondi_inferieur(chrono2 / (d + 3))
dansEtape est un nombre
dansEtape vaut chrono2 mod (d + 3)
si etape >= longueur(sequence) alors
allumee vaut -1
rang vaut 0
etat vaut 2
sinon si dansEtape < d alors
allumee vaut sequence[etape]
sinon
allumee vaut -1
fin si
fin si
sinon si etat = 2 alors
si allumeeT > 0 alors
allumeeT soustrait 1
sinon
allumee vaut -1
fin si
sinon si etat = 3 alors
chrono2 ajoute 1
si allumeeT > 0 alors
allumeeT soustrait 1
sinon
allumee vaut -1
fin si
si chrono2 > 12 alors
sequence ajoute hasard(0, 3)
appelle lancerDemo()
fin si
sinon si etat = 4 alors
chrono2 ajoute 1
allumee vaut -1
fin si
nbE est un nombre
nbE vaut longueur(eclT)
si nbE > 0 alors
ke est un nombre
pour ke de nbE - 1 à 0 pas -1
eclX[ke] vaut eclX[ke] + eclVX[ke]
eclY[ke] vaut eclY[ke] + eclVY[ke]
eclVY[ke] vaut eclVY[ke] + 0.5
eclT[ke] vaut eclT[ke] - 1
si eclT[ke] <= 0 alors
eclX supprime ke
eclY supprime ke
eclVX supprime ke
eclVY supprime ke
eclT supprime ke
eclC supprime ke
eclR supprime ke
fin si
fin pour
fin si
si secousse > 0 alors
secousse soustrait 1
fin si
fin procédure
@ DESSIN
procédure quartier(t, ox, oy, coul, grossi)
pts est un tableau
a0 est un nombre
a0 vaut angDebut[t] + 4
a1 est un nombre
a1 vaut angDebut[t] + 86
re est un nombre
re vaut R_EXT + grossi
ka est un nombre
an est un nombre
pour ka de 0 à 14
an vaut radians(a0 + (a1 - a0) * ka / 14)
pts ajoute ox + cosinus(an) * re
pts ajoute oy + sinus(an) * re
fin pour
pour ka de 14 à 0 pas -1
an vaut radians(a0 + (a1 - a0) * ka / 14)
pts ajoute ox + cosinus(an) * R_INT
pts ajoute oy + sinus(an) * R_INT
fin pour
polygone(ecran, pts, coul)
fin procédure
procédure dessiner()
effacer(ecran)
contour(ecran, #0)
dégradé(ecran, [#050512, #0D0826, #140A2E])
// Poussières de fond
iE2 est un nombre
pour iE2 de 0 à longueur(etoilesX) - 1
cercle(ecran, etoilesX[iE2], etoilesY[iE2], etoilesT[iE2], rgba(255, 255, 255, etoilesO[iE2] * 0.4))
fin pour
sx, sy est un nombre
sx vaut 0
sy vaut 0
si secousse > 0 alors
sx vaut hasard(-secousse, secousse)
sy vaut hasard(-secousse, secousse)
fin si
ox est un nombre
ox vaut CX + sx
oy est un nombre
oy vaut CY + sy
bonneTouche est un nombre
bonneTouche vaut -1
si rang < longueur(sequence) alors
bonneTouche vaut sequence[rang]
fin si
kt est un nombre
pour kt de 0 à 3
si kt = allumee alors
contour(ecran, coulBord[kt], 3)
appelle quartier(kt, ox, oy, coulVive[kt], 4)
contour(ecran, #0)
sinon si etat = 4 et kt = bonneTouche et chrono2 mod 10 < 5 alors
contour(ecran, coulBord[kt], 2)
appelle quartier(kt, ox, oy, coulVive[kt], 2)
contour(ecran, #0)
sinon
contour(ecran, rgba(255, 255, 255, 0.08), 1)
appelle quartier(kt, ox, oy, coulTerne[kt], 0)
contour(ecran, #0)
fin si
// Puces de touches avec leurs cercles de fond
am est un nombre
am vaut radians(angDebut[kt] + 45)
lx est un nombre
lx vaut ox + cosinus(am) * 122
ly est un nombre
ly vaut oy + sinus(am) * 122
cercle(ecran, lx, ly, 16, rgba(20, 20, 45, 0.7))
contour(ecran, rgba(255, 255, 255, 0.25), 1)
cercle(ecran, lx, ly, 16, rgba(0, 0, 0, 0))
contour(ecran, #0)
si kt = allumee alors
appelle centrer(lettre[kt], lx, ly, #FFFFFF, 18)
sinon
appelle centrer(lettre[kt], lx, ly, rgba(255, 255, 255, 0.75), 18)
fin si
fin pour
// Centre métallisé / néon
cercle(ecran, ox, oy, R_INT - 6, #0A0A18)
contour(ecran, rgba(0, 229, 255, 0.4), 2)
cercle(ecran, ox, oy, R_INT - 12, #101026)
contour(ecran, rgba(255, 255, 255, 0.1), 1)
cercle(ecran, ox, oy, R_INT - 16, #090916)
contour(ecran, #0)
si etat = 0 alors
appelle centrer("SIMON", ox, oy - 14, #00E5FF, 20)
appelle centrer("NÉON", ox, oy + 12, #FF2A6D, 18)
sinon
appelle centrer(convertir_texte(score()), ox, oy - 10, #FFFFFF, 34)
si etat = 1 alors
appelle centrer("DÉMO...", ox, oy + 22, #00E5FF, 11)
sinon si etat = 2 alors
appelle centrer("À TOI !", ox, oy + 22, #FFE600, 11)
sinon si etat = 3 alors
appelle centrer("BRAVO !", ox, oy + 22, #00FF88, 11)
sinon
appelle centrer("RATÉ !", ox, oy + 22, #FF2A6D, 11)
fin si
fin si
// Particules d'éclats
si longueur(eclT) > 0 alors
ke est un nombre
pour ke de 0 à longueur(eclT) - 1
cercle(ecran, eclX[ke], eclY[ke], eclR[ke] + eclT[ke] / 8, eclC[ke])
fin pour
fin si
// En-tête HUD
rectangle_arrondi(ecran, 100, 18, 280, 68, 16, rgba(255, 255, 255, 0.04))
contour(ecran, rgba(255, 255, 255, 0.1), 1)
rectangle_arrondi(ecran, 100, 18, 280, 68, 16, rgba(0, 0, 0, 0))
contour(ecran, #0)
appelle centrer("S I M O N N É O N", 240, 38, #00E5FF, 18)
appelle centrer("MEILLEUR SCORE : " + convertir_texte(meilleur), 240, 64, rgba(255, 255, 255, 0.75), 13)
// Bas de page HUD
si etat = 0 alors
si tic mod 20 < 14 alors
rectangle_arrondi(ecran, 60, 485, 360, 40, 12, rgba(0, 229, 255, 0.12))
contour(ecran, rgba(0, 229, 255, 0.4), 1)
rectangle_arrondi(ecran, 60, 485, 360, 40, 12, rgba(0, 0, 0, 0))
contour(ecran, #0)
appelle centrer("ESPACE OU CLIC AU CENTRE POUR JOUER", 240, 505, #FFFFFF, 13)
fin si
sinon si etat = 4 et chrono2 > 15 alors
rectangle_arrondi(ecran, 70, 485, 340, 40, 12, rgba(255, 42, 109, 0.15))
contour(ecran, rgba(255, 42, 109, 0.5), 1)
rectangle_arrondi(ecran, 70, 485, 340, 40, 12, rgba(0, 0, 0, 0))
contour(ecran, #0)
si score() >= meilleur et score() > 0 alors
appelle centrer("NOUVEAU RECORD : " + convertir_texte(score()) + " !", 240, 505, #FFE600, 13)
sinon
appelle centrer("SCORE : " + convertir_texte(score()) + " — ESPACE : REJOUER", 240, 505, #FFFFFF, 13)
fin si
sinon si etat = 2 alors
appelle centrer("PROGRESSION : " + convertir_texte(rang) + " / " + convertir_texte(longueur(sequence)), 240, 505, rgba(255, 255, 255, 0.6), 13)
fin si
fin procédure
@ LE PROCESSUS
processus Moteur()
tant que appActif
tic ajoute 1
si appui >= 0 alors
si etat = 2 alors
appelle verifierAppui(appui)
fin si
appui vaut -1
fin si
si etat <> 9 alors
appelle animer()
appelle dessiner()
affiche ecran
fin si
pause 60
fin tant que
fin processus
@ DEMARRAGE
Moteur()
tant que appActif
interagir ecran, ["a", "z", "q", "s", " ", "x"] dans action, ptX, ptY
si action = 6 alors
appActif vaut faux
sinon si etat = 2 alors
si action >= 1 et action <= 4 alors
appui vaut action - 1
sinon si action = 0 alors
appui vaut toucheSous(ptX, ptY)
fin si
sinon si etat = 0 ou (etat = 4 et chrono2 > 15) alors
si action = 5 ou action = 0 alors
etat vaut 9
appelle nouvellePartie()
fin si
sinon si action = 0 alors
// clic pendant démo/pause
fin si
fin tant que
effacer(ecran)
dégradé(ecran, [#050512, #0D0826])
appelle centrer("À bientôt !", 240, 270, #FFFFFF, 34)
affiche ecran