Console
Clique sur « Exécuter » pour lancer le programme.
Code CoddyRun
@ Configuration et Variables
ecran est une toile
dimension(ecran, 640, 480)
joueurX est un nombre
joueurX vaut 320
joueurY est un nombre
joueurY vaut 420
scoreJeu est un nombre
scoreJeu vaut 0
vies est un nombre
vies vaut 3
meilleurScore est un nombre
essayer
meilleurScore vaut paramètre("astra", "meilleur_score")
attraper
meilleurScore vaut 0
paramètre("astra", "meilleur_score", meilleurScore)
fin essayer
enJeu est un booleen
enJeu vaut vrai
obsX est un tableau
obsY est un tableau
obsVitesse est un tableau
obsTaille est un tableau
tirsX est un tableau
tirsY est un tableau
etoileX est un nombre
etoileX vaut 0
etoileY est un nombre
etoileY vaut 0
etoileVitesse est un nombre
etoileVitesse vaut 5
etoilesFondX est un tableau
etoilesFondY est un tableau
etoilesFondTaille est un tableau
action est un nombre
clicX est un nombre
clicY est un nombre
phaseAnim est un nombre
phaseAnim vaut 0
k est un nombre
m est un nombre
procédure initialiserPartie()
joueurX vaut 320
scoreJeu vaut 0
vies vaut 3
enJeu vaut vrai
vide obsX
vide obsY
vide obsVitesse
vide obsTaille
vide tirsX
vide tirsY
pour k de 0 à 3
obsX ajoute 80 + k * 140
obsY ajoute 0 - hasard(100, 300)
obsVitesse ajoute 4 + hasard(3)
obsTaille ajoute 16 + hasard(8)
fin pour
etoileX vaut hasard(50, 590)
etoileY vaut 0 - hasard(100, 200)
etoileVitesse vaut 5
vide etoilesFondX
vide etoilesFondY
vide etoilesFondTaille
pour k de 0 à 25
etoilesFondX ajoute hasard(10, 630)
etoilesFondY ajoute hasard(10, 470)
etoilesFondTaille ajoute hasard(1, 3)
fin pour
fin procédure
procédure ajouterTir()
tirsX ajoute joueurX
tirsY ajoute joueurY - 22
fin procédure
@ Graphismes et Rendu
procédure dessinerVaisseau(g, x, y, anim)
flammeH est un nombre
flammeH vaut 12 + (anim mod 3) * 4
// Réacteur
triangle(g, x - 8, y + 16, x + 8, y + 16, x, y + 16 + flammeH, #EF4444)
triangle(g, x - 4, y + 16, x + 4, y + 16, x, y + 14 + flammeH / 2, #F59E0B)
// Ailes
triangle(g, x - 26, y + 20, x - 10, y + 8, x - 10, y + 20, #1E40AF)
triangle(g, x + 26, y + 20, x + 10, y + 8, x + 10, y + 20, #1E40AF)
// Corps
triangle(g, x, y - 22, x - 18, y + 18, x + 18, y + 18, #2563EB)
triangle(g, x, y - 16, x - 10, y + 14, x + 10, y + 14, #60A5FA)
// Cockpit
ellipse(g, x, y - 2, 6, 10, #38BDF8)
fin procédure
procédure dessinerMeteore(g, x, y, rayon)
cercle(g, x, y - rayon - 4, arrondi(rayon * 0.7), #EF4444)
cercle(g, x, y, rayon, #374151)
cercle(g, x - 2, y - 2, rayon - 3, #4B5563)
cercle(g, x - arrondi(rayon / 3), y - arrondi(rayon / 4), arrondi(rayon / 3), #1F2937)
fin procédure
procédure dessinerScene(g)
effacer(g)
couleursFond est un tableau
couleursFond vaut [#030712, #0F172A, #1E1B4B]
dégradé(g, couleursFond)
pour k de 0 à 25
cercle(g, etoilesFondX[k], etoilesFondY[k], etoilesFondTaille[k], #FFFFFF)
fin pour
// Météores
pour k de 0 à 3
appelle dessinerMeteore(g, obsX[k], obsY[k], obsTaille[k])
fin pour
// Tirs de laser
pour m de 0 à longueur(tirsY) - 1
rectangle_arrondi(g, tirsX[m] - 2, tirsY[m], 4, 12, 2, #38BDF8)
fin pour
// Étoile bonus score
cercle(g, etoileX, etoileY, 12, #FEF08A)
cercle(g, etoileX, etoileY, 6, #FACC15)
// Vaisseau
appelle dessinerVaisseau(g, joueurX, joueurY, phaseAnim)
// HUD
contour(g, #3B82F6, 1)
rectangle_arrondi(g, 15, 12, 140, 36, 10, #1E293B)
contour(g, #0)
label(g, 28, 36, "SCORE : " + convertir_texte(scoreJeu), #60A5FA, 15)
contour(g, #EF4444, 1)
rectangle_arrondi(g, 240, 12, 120, 36, 10, #1E293B)
contour(g, #0)
label(g, 255, 36, "VIES : " + convertir_texte(vies), #F87171, 15)
contour(g, #10B981, 1)
rectangle_arrondi(g, 470, 12, 155, 36, 10, #1E293B)
contour(g, #0)
label(g, 482, 36, "RECORD : " + convertir_texte(meilleurScore), #34D399, 15)
si non enJeu alors
contour(g, #EF4444, 2)
rectangle_arrondi(g, 140, 130, 360, 220, 16, #0F172A)
contour(g, #0)
label(g, 225, 180, "GAME OVER", #EF4444, 32)
label(g, 235, 225, "Score obtenu : " + convertir_texte(scoreJeu), #F3F4F6, 18)
label(g, 235, 260, "Meilleur record : " + convertir_texte(meilleurScore), #34D399, 16)
label(g, 175, 310, "Appuie sur une touche ou Clic pour rejouer", #60A5FA, 13)
fin si
affiche g
fin procédure
@ Moteur de jeu
processus MoteurJeu()
vitesseBonus est un nombre
distX est un nombre
distY est un nombre
vitesseBonus vaut 0
distX vaut 0
distY vaut 0
tant que enJeu
phaseAnim vaut phaseAnim + 1
vitesseBonus vaut limiter(scoreJeu / 60, 0, 6)
// Déplacement et gestion des tirs
pour m de longueur(tirsY) - 1 à 0 pas -1
tirsY[m] vaut tirsY[m] - 16
si tirsY[m] < -20 alors
tirsX supprime m
tirsY supprime m
sinon
// Collisions laser - météores
pour k de 0 à 3
si m < longueur(tirsY) alors
distX vaut absolue(tirsX[m] - obsX[k])
distY vaut absolue(tirsY[m] - obsY[k])
si distX < (obsTaille[k] + 8) et distY < (obsTaille[k] + 8) alors
scoreJeu vaut scoreJeu + 15
obsY[k] vaut 0 - hasard(100, 250)
obsX[k] vaut hasard(40, 600)
tirsX supprime m
tirsY supprime m
fin si
fin si
fin pour
fin si
fin pour
// Déplacement des météores
pour k de 0 à 3
obsY[k] vaut obsY[k] + obsVitesse[k] + vitesseBonus
// Collision météore - joueur
distX vaut absolue(obsX[k] - joueurX)
distY vaut absolue(obsY[k] - joueurY)
si distX < (obsTaille[k] + 12) et distY < (obsTaille[k] + 12) alors
vies vaut vies - 1
obsY[k] vaut 0 - hasard(100, 250)
obsX[k] vaut hasard(40, 600)
si vies <= 0 alors
enJeu vaut faux
si scoreJeu > meilleurScore alors
meilleurScore vaut scoreJeu
paramètre("astra", "meilleur_score", meilleurScore)
fin si
fin si
fin si
si obsY[k] > 510 alors
obsY[k] vaut 0 - hasard(50, 150)
obsX[k] vaut hasard(40, 600)
fin si
fin pour
// Étoile de score
etoileY vaut etoileY + etoileVitesse
distX vaut absolue(etoileX - joueurX)
distY vaut absolue(etoileY - joueurY)
si distX < 25 et distY < 25 alors
scoreJeu vaut scoreJeu + 10
etoileY vaut 0 - hasard(150, 300)
etoileX vaut hasard(40, 600)
fin si
si etoileY > 510 alors
etoileY vaut 0 - hasard(100, 200)
etoileX vaut hasard(40, 600)
fin si
appelle dessinerScene(ecran)
pause 60
fin tant que
fin processus
@ Boucle Principale
tant que vrai
appelle initialiserPartie()
MoteurJeu()
// Contrôles en jeu
tant que enJeu
interagir ecran, ["q", "d", "z", "s", " ", "p"] dans action, clicX, clicY
si non enJeu alors
arrête
fin si
si action = 1 alors // Q (Gauche)
joueurX vaut limiter(joueurX - 35, 30, 610)
sinon si action = 2 alors // D (Droite)
joueurX vaut limiter(joueurX + 35, 30, 610)
sinon si action = 3 ou action = 5 alors // Z ou Espace (Tir)
appelle ajouterTir()
sinon si action = 6 alors // Quitter
enJeu vaut faux
arrête
sinon si action = 0 alors // Clic (Se déplacer + Tirer)
joueurX vaut limiter(clicX, 30, 610)
appelle ajouterTir()
fin si
fin tant que
// Écran de fin
interagir ecran, ["z", "s", "q", "d", " ", "p"] dans action, clicX, clicY
si action = 6 alors
terminer
fin si
fin tant que