Console
Clique sur « Exécuter » pour lancer le programme.
Aucune exécutionCtrl+Entrée : exécuter · Échap : arrêter
Code CoddyRun
@ toile
t est une toile
largeurT est un nombre
hauteurT est un nombre
plafond est un nombre
largeurT vaut 320
hauteurT vaut 460
plafond vaut 40
dimension(t, largeurT, hauteurT)
@ Déclaration des variables
balX, balY, balVX, balVY, balVive est un tableau // jusqu'à 3 balles
brVie, brType est un tableau // 30 briques
bonX, bonY, bonType, bonVif est un tableau // 6 bonus en vol
rayon, nbVives, src, nouv est un nombre
raqX, raqY, raqL, raqH est un nombre
score, vies, nbBriques, cassees, palier est un nombre
vitesse, vitesseBase, vitesseMax, norme est un nombre
col, lig, brX, brY, dx, dy, rel, tirage est un nombre
i, j, k, sp est un nombre
messageTemps est un nombre
message, teinte, lettre est un texte
jeuFini, gagne, place est un booléen
action, clicX, clicY est un nombre
@ Initialisation
rayon vaut 6
raqL vaut 70
raqH vaut 12
raqY vaut 434
raqX vaut 125
score vaut 0
vies vaut 3
vitesseBase vaut 7
vitesseMax vaut 12
vitesse vaut vitesseBase
palier vaut 5
cassees vaut 0
messageTemps vaut 0
message vaut ""
jeuFini vaut faux
gagne vaut faux
// --- les 3 emplacements de balle ---
répète 3 fois
balX ajoute 0
balY ajoute 0
balVX ajoute 0
balVY ajoute 0
balVive ajoute faux
fin répète
// --- les 6 emplacements de bonus ---
répète 6 fois
bonX ajoute 0
bonY ajoute 0
bonType ajoute 0
bonVif ajoute faux
fin répète
// --- les 30 briques (6 colonnes x 5 lignes) ---
// brType : 0 = normale, 1 = multi-balle, 2 = vie, 3 = raquette
// brVie : 1 = normale, 2 = brique solide (deux coups)
pour i de 0 à 29
tirage vaut hasard(1, 100)
si tirage <= 8 alors
brType ajoute 1
brVie ajoute 1
sinon si tirage <= 13 alors
brType ajoute 2
brVie ajoute 1
sinon si tirage <= 21 alors
brType ajoute 3
brVie ajoute 1
sinon si tirage <= 40 alors
brType ajoute 0
brVie ajoute 2
sinon
brType ajoute 0
brVie ajoute 1
fin si
fin pour
nbBriques vaut 30
// --- première balle, posée sur la raquette ---
balVive[0] vaut vrai
balX[0] vaut raqX + raqL / 2
balY[0] vaut raqY - rayon - 2
balVX[0] vaut (hasard(0, 1) * 2 - 1) * vitesse * 5 / 10
balVY[0] vaut - racine(maximum(vitesse * vitesse - balVX[0] * balVX[0], 1))
@ processus principal du jeu
processus Moteur()
tant que jeuFini = faux
// ---------- 1. Déplacement des balles (2 sous-pas) ----------
pour sp de 1 à 2
pour i de 0 à 2
si balVive[i] = vrai alors
balX[i] vaut balX[i] + balVX[i] / 2
balY[i] vaut balY[i] + balVY[i] / 2
// --- murs ---
si balX[i] - rayon <= 0 alors
balX[i] vaut rayon
balVX[i] vaut absolue(balVX[i])
fin si
si balX[i] + rayon >= largeurT alors
balX[i] vaut largeurT - rayon
balVX[i] vaut - absolue(balVX[i])
fin si
si balY[i] - rayon <= plafond alors
balY[i] vaut plafond + rayon
balVY[i] vaut absolue(balVY[i])
fin si
// --- raquette : l'angle dépend du point de contact ---
si balVY[i] > 0 et balY[i] + rayon >= raqY et balY[i] - rayon <= raqY + raqH et balX[i] >= raqX - rayon et balX[i] <= raqX + raqL + rayon alors
balY[i] vaut raqY - rayon
rel vaut (balX[i] - (raqX + raqL / 2)) / (raqL / 2)
rel vaut limiter(rel, -1, 1)
balVX[i] vaut vitesse * rel * 8 / 10
balVY[i] vaut - maximum(racine(maximum(vitesse * vitesse - balVX[i] * balVX[i], 1)), 2)
fin si
// --- briques ---
pour j de 0 à 29
si brVie[j] > 0 alors
col vaut j mod 6
lig vaut arrondi_inferieur(j / 6)
brX vaut col * 52 + 6
brY vaut 62 + lig * 24
si balX[i] + rayon >= brX et balX[i] - rayon <= brX + 46 et balY[i] + rayon >= brY et balY[i] - rayon <= brY + 18 alors
// rebond sur le côté le plus proche
dx vaut absolue(balX[i] - (brX + 23))
dy vaut absolue(balY[i] - (brY + 9))
si dx / 23 > dy / 9 alors
balVX[i] vaut - balVX[i]
sinon
balVY[i] vaut - balVY[i]
fin si
brVie[j] vaut brVie[j] - 1
score ajoute 10
si brVie[j] = 0 alors
nbBriques soustrait 1
cassees ajoute 1
score ajoute 20
// la brique lâche un bonus ?
si brType[j] > 0 alors
place vaut faux
pour k de 0 à 5
si bonVif[k] = faux et place = faux alors
bonVif[k] vaut vrai
bonX[k] vaut brX + 11
bonY[k] vaut brY + 2
bonType[k] vaut brType[j]
place vaut vrai
fin si
fin pour
fin si
// --- accélération par paliers ---
si cassees mod palier = 0 et vitesse < vitesseMax alors
vitesse ajoute 1
pour k de 0 à 2
si balVive[k] = vrai alors
norme vaut racine(maximum(balVX[k] * balVX[k] + balVY[k] * balVY[k], 1))
balVX[k] vaut balVX[k] * vitesse / norme
balVY[k] vaut balVY[k] * vitesse / norme
fin si
fin pour
fin si
fin si
arrête
fin si
fin si
fin pour
// --- balle sortie par le bas ---
si balY[i] - rayon > hauteurT alors
balVive[i] vaut faux
fin si
fin si
fin pour
fin pour
// ---------- 2. Plus aucune balle en jeu ? ----------
nbVives vaut 0
pour i de 0 à 2
si balVive[i] = vrai alors
nbVives ajoute 1
fin si
fin pour
si nbVives = 0 alors
vies soustrait 1
si vies <= 0 alors
vies vaut 0
jeuFini vaut vrai
sinon
vitesse vaut maximum(vitesseBase, vitesse - 2)
balVive[0] vaut vrai
balX[0] vaut raqX + raqL / 2
balY[0] vaut raqY - rayon - 2
balVX[0] vaut (hasard(0, 1) * 2 - 1) * vitesse * 5 / 10
balVY[0] vaut - racine(maximum(vitesse * vitesse - balVX[0] * balVX[0], 1))
message vaut "BALLE PERDUE"
messageTemps vaut 10
fin si
fin si
// ---------- 3. Chute et capture des bonus ----------
pour k de 0 à 5
si bonVif[k] = vrai alors
bonY[k] vaut bonY[k] + 3
si bonY[k] + 14 >= raqY et bonY[k] <= raqY + raqH et bonX[k] + 24 >= raqX et bonX[k] <= raqX + raqL alors
bonVif[k] vaut faux
score ajoute 50
messageTemps vaut 14
si bonType[k] = 1 alors
// MULTI-BALLE : on remplit les emplacements libres
src vaut - 1
pour i de 0 à 2
si balVive[i] = vrai et src = -1 alors
src vaut i
fin si
fin pour
si src >= 0 alors
nouv vaut 0
pour i de 0 à 2
si balVive[i] = faux alors
balVive[i] vaut vrai
balX[i] vaut balX[src]
balY[i] vaut balY[src]
balVX[i] vaut vitesse * (nouv * 2 - 1) * 6 / 10
balVY[i] vaut - racine(maximum(vitesse * vitesse - balVX[i] * balVX[i], 1))
nouv ajoute 1
fin si
fin pour
fin si
message vaut "MULTI-BALLE !"
sinon si bonType[k] = 2 alors
vies ajoute 1
message vaut "+1 VIE"
sinon
raqL vaut limiter(raqL + 20, 50, 130)
message vaut "RAQUETTE ELARGIE"
fin si
fin si
si bonY[k] > hauteurT alors
bonVif[k] vaut faux
fin si
fin si
fin pour
// ---------- 4. Victoire ? ----------
si nbBriques <= 0 alors
gagne vaut vrai
jeuFini vaut vrai
fin si
// ---------- 5. Dessin ----------
effacer(t)
dégradé(t, [#0b1020, #16203c, #0b1020])
// bandeau du haut
rectangle(t, 0, 0, largeurT, plafond, #070c18)
ligne(t, 0, plafond, largeurT, plafond, #2b3a5b, 2)
label(t, 10, 26, "SCORE " + convertir_texte(score), #e9ecef, 15)
pour k de 1 à minimum(vies, 6)
cercle(t, largeurT - 16 - (k - 1) * 18, 20, 6, #ff6b6b)
fin pour
label(t, 132, 26, "VIT " + convertir_texte(arrondi(vitesse)), #74c0fc, 13)
// briques
pour j de 0 à 29
si brVie[j] > 0 alors
col vaut j mod 6
lig vaut arrondi_inferieur(j / 6)
brX vaut col * 52 + 6
brY vaut 62 + lig * 24
lettre vaut ""
si brType[j] = 1 alors
teinte vaut rgb(132, 94, 247)
lettre vaut "M"
sinon si brType[j] = 2 alors
teinte vaut rgb(240, 62, 118)
lettre vaut "V"
sinon si brType[j] = 3 alors
teinte vaut rgb(32, 201, 151)
lettre vaut "R"
sinon si brVie[j] >= 2 alors
teinte vaut rgb(134, 142, 150)
sinon
selon lig
cas 0 : teinte vaut rgb(255, 107, 107)
cas 1 : teinte vaut rgb(255, 146, 43)
cas 2 : teinte vaut rgb(255, 212, 59)
cas 3 : teinte vaut rgb(105, 219, 124)
sinon selon : teinte vaut rgb(77, 171, 247)
fin selon
fin si
rectangle_arrondi(t, brX, brY, 46, 18, 5, teinte)
rectangle_arrondi(t, brX + 4, brY + 3, 38, 4, 2, #FFFFFF44)
si lettre <> "" alors
label(t, brX + 19, brY + 14, lettre, #0b1020, 12)
fin si
fin si
fin pour
// bonus en chute
pour k de 0 à 5
si bonVif[k] = vrai alors
si bonType[k] = 1 alors
teinte vaut rgb(132, 94, 247)
lettre vaut "M"
sinon si bonType[k] = 2 alors
teinte vaut rgb(240, 62, 118)
lettre vaut "V"
sinon
teinte vaut rgb(32, 201, 151)
lettre vaut "R"
fin si
rectangle_arrondi(t, bonX[k], bonY[k], 24, 14, 7, teinte)
label(t, bonX[k] + 8, bonY[k] + 11, lettre, #0b1020, 11)
fin si
fin pour
// raquette
rectangle_arrondi(t, raqX, raqY, raqL, raqH, 6, #1c7ed6)
rectangle_arrondi(t, raqX + 4, raqY + 2, raqL - 8, 4, 2, #a5d8ff)
// balles (avec halo)
pour i de 0 à 2
si balVive[i] = vrai alors
cercle(t, balX[i], balY[i], rayon + 4, #FFD43B33)
cercle(t, balX[i], balY[i], rayon, #ffe066)
cercle(t, balX[i] - 2, balY[i] - 2, 2, #fff9db)
fin si
fin pour
// message flash
si messageTemps > 0 alors
label(t, 90, 300, message, #ffffff, 16)
messageTemps soustrait 1
fin si
affiche t
pause 60
fin tant que
// ---------- Écran de fin ----------
rectangle(t, 0, 0, largeurT, hauteurT, #000000BB)
si gagne = vrai alors
label(t, 70, 210, "GAGNÉ !", #69db7c, 32)
sinon
label(t, 60, 210, "PERDU...", #ff6b6b, 32)
fin si
label(t, 80, 250, "Score : " + convertir_texte(score), #ffffff, 18)
label(t, 55, 285, "Appuie sur une touche", #adb5bd, 14)
affiche t
fin processus
@ Programme principal
affiche t
Moteur() // démarre l'animation
tant que jeuFini = faux
interagir t, ['q', 'd', 'x'] dans action, clicX, clicY
si action = 0 alors
raqX vaut clicX - raqL / 2 // clic : la raquette se centre
sinon si action = 1 alors
raqX soustrait 28
sinon si action = 2 alors
raqX ajoute 28
sinon
jeuFini vaut vrai
arrête
fin si
raqX vaut limiter(raqX, 0, largeurT - raqL)
fin tant que
si gagne = vrai alors
affiche "Bravo ! Toutes les briques sont tombées. Score final : " + convertir_texte(score)
sinon
affiche "Partie terminée. Score final : " + convertir_texte(score)
fin si