Console
Clique sur « Exécuter » pour lancer le programme.
Aucune exécutionCtrl+Entrée : exécuter · Échap : arrêter
Code CoddyRun
@ CONFIGURATION
maToile est une toile
dimension(maToile, 400, 550)
OFFY est un nombre
OFFY vaut 120
COUPS_DEPART est un nombre
COUPS_DEPART vaut 20
niveau est un nombre
niveau vaut 1
coups est un nombre
coups vaut COUPS_DEPART
message est un texte
message vaut "Clique sur deux tuiles voisines"
// Défi du niveau : récupérer qteDefi tuiles de la couleur coulDefi (1 rouge, 2 bleu, 3 vert, 4 jaune)
coulDefi est un nombre
coulDefi vaut hasard(1, 4)
qteDefi est un nombre
qteDefi vaut 20
collecte est un nombre
collecte vaut 0
@ PLATEAU
plateau est un tableau
pour i de 0 à 7
ligne_p est un tableau
pour j de 0 à 7
ligne_p ajoute hasard(1, 4)
fin pour
plateau ajoute ligne_p
fin pour
@ DESSIN D'UNE TUILE
procédure dessinerTuile(t, x, y, val, sel)
// Case vide (fond du plateau)
rectangle_arrondi(t, x - 3, y - 3, 46, 46, 12, #172036)
// Cadre blanc si la tuile est sélectionnée
si sel = vrai alors
rectangle_arrondi(t, x - 4, y - 4, 48, 48, 14, #FFFFFF)
fin si
fond est un texte
clair est un texte
emoji est un texte
emoji vaut ""
si val = 1 alors
fond vaut #E63946
clair vaut #FF8A93
sinon si val = 2 alors
fond vaut #2A9DF4
clair vaut #7CC6FF
sinon si val = 3 alors
fond vaut #3ECF6B
clair vaut #8DF5A8
sinon si val = 4 alors
fond vaut #FFC53D
clair vaut #FFE08A
sinon si val = 5 alors
fond vaut #D1D5DB
clair vaut #F3F4F6
emoji vaut "🚀"
sinon si val = 6 alors
fond vaut #D1D5DB
clair vaut #F3F4F6
emoji vaut "💣"
sinon si val = 7 alors
fond vaut #0EA5A5
clair vaut #6EE7E7
emoji vaut "🌈"
sinon
arrête
fin si
rectangle_arrondi(t, x, y, 40, 40, 12, fond)
// Reflet en haut de la tuile
rectangle_arrondi(t, x + 5, y + 4, 30, 12, 6, clair)
// Emoji des jokers
si emoji <> "" alors
label(t, x + 9, y + 30, emoji, #FFFFFF, 18)
fin si
fin procédure
@ EN-TÊTE
procédure dessinerEntete(t, cp, niv, col, qte, cDefi)
rectangle_arrondi(t, 10, 10, 380, 100, 16, #1E293B)
label(t, 22, 40, "CASCADE", #F8FAFC, 22)
label(t, 22, 68, "Niveau " + niv, #CBD5E1, 16)
couleurCoups est un texte
si cp <= 5 alors
couleurCoups vaut #F87171
sinon
couleurCoups vaut #93C5FD
fin si
label(t, 210, 68, "Coups restants : " + cp, couleurCoups, 16)
// Ligne défi : niveau + progression + carré de la couleur + barre
cDefiHex est un texte
nomDefi est un texte
si cDefi = 1 alors
cDefiHex vaut #E63946
nomDefi vaut "rouges"
sinon si cDefi = 2 alors
cDefiHex vaut #2A9DF4
nomDefi vaut "bleues"
sinon si cDefi = 3 alors
cDefiHex vaut #3ECF6B
nomDefi vaut "vertes"
sinon
cDefiHex vaut #FFC53D
nomDefi vaut "jaunes"
fin si
rectangle_arrondi(t, 22, 84, 14, 14, 4, cDefiHex)
label(t, 42, 96, "Défi : " + col + " / " + qte + " tuiles " + nomDefi, #CBD5E1, 13)
rectangle_arrondi(t, 230, 84, 150, 14, 7, #334155)
largD est un nombre
largD vaut arrondi_inferieur(150 * col / qte)
largD vaut limiter(largD, 0, 150)
si largD > 0 alors
rectangle_arrondi(t, 230, 84, largD, 14, 7, cDefiHex)
fin si
fin procédure
@ AFFICHAGE COMPLET
procédure afficherJeu(t, p, sX, sY, cp, niv, col, qte, cDefi, msg)
effacer(t)
remplir(t, #0B1020)
appelle dessinerEntete(t, cp, niv, col, qte, cDefi)
// Cadre du plateau
rectangle_arrondi(t, 0, OFFY - 8, 400, 416, 0, #0F172A)
pour i de 0 à 7
pour j de 0 à 7
xP est un nombre
yP est un nombre
xP vaut j * 50 + 5
yP vaut i * 50 + OFFY + 5
sel est un booléen
sel vaut faux
si i = sY et j = sX alors
sel vaut vrai
fin si
appelle dessinerTuile(t, xP, yP, p[i][j], sel)
fin pour
fin pour
// Bandeau de message en bas de la toile
rectangle_arrondi(t, 10, 530, 380, 16, 0, #0B1020)
label(t, 14, 544, msg, #FDE68A, 14)
affiche t
fin procédure
@ ÉCRAN DE FIN
procédure afficherFin(t, gagne, niv, col, qte)
rectangle_arrondi(t, 40, 190, 320, 180, 20, #1E293B)
si gagne = vrai alors
label(t, 70, 240, "🏆 BRAVO !", #FDE68A, 28)
label(t, 70, 275, "Niveau " + niv + " terminé : défi réussi !", #F8FAFC, 16)
label(t, 70, 300, "Prépare-toi, le défi augmente !", #CBD5E1, 13)
label(t, 70, 345, "Clique pour le niveau suivant", #93C5FD, 14)
sinon
label(t, 70, 240, "💀 PLUS DE COUPS", #FCA5A5, 26)
label(t, 70, 275, "Défi non terminé : " + col + " / " + qte, #F8FAFC, 16)
label(t, 70, 300, "Niveau atteint : " + niv, #CBD5E1, 13)
label(t, 70, 345, "Clique pour rejouer", #93C5FD, 14)
fin si
affiche t
fin procédure
@ MESSAGE JEU BLOQUÉ
procédure afficherBloque(t)
rectangle_arrondi(t, 40, 200, 320, 150, 20, #1E293B)
label(t, 70, 250, "🔀 JEU BLOQUÉ", #FDE68A, 26)
label(t, 70, 285, "Aucun coup possible : on mélange", #F8FAFC, 15)
label(t, 70, 325, "Clique pour continuer", #93C5FD, 14)
affiche t
fin procédure
@ BOUCLE PRINCIPALE
selX est un nombre
selY est un nombre
selX vaut - 1
selY vaut - 1
premierTour est un booléen
premierTour vaut vrai
// Mémorise le dernier échange pour l'annuler s'il ne crée aucun match
verifEchange est un booléen
verifEchange vaut faux
eY1 est un nombre
eX1 est un nombre
eY2 est un nombre
eX2 est un nombre
enJeu est un booléen
enJeu vaut vrai
tant que enJeu = vrai
// --- PHASE 1 : DÉTECTION, DESTRUCTION, GRAVITÉ, COLLECTE ---
actionRequise est un booléen
actionRequise vaut vrai
tant que actionRequise = vrai
actionRequise vaut faux
aSuppr est un tableau
aSpawns est un tableau
pour i de 0 à 7
ligneS est un tableau
ligneSp est un tableau
pour j de 0 à 7
ligneS ajoute faux
ligneSp ajoute 0
fin pour
aSuppr ajoute ligneS
aSpawns ajoute ligneSp
fin pour
// Détection HORIZONTALE
pour i de 0 à 7
pour j de 0 à 7
c1 est un nombre
c1 vaut plateau[i][j]
si c1 >= 1 et c1 <= 4 alors
estDebut est un booléen
estDebut vaut faux
si j = 0 alors
estDebut vaut vrai
sinon si plateau[i][j - 1] <> c1 alors
estDebut vaut vrai
fin si
si estDebut = vrai alors
cpt est un nombre
cpt vaut 1
chercheLigne est un booléen
chercheLigne vaut vrai
tant que chercheLigne = vrai
si j + cpt <= 7 alors
si plateau[i][j + cpt] = c1 alors
cpt ajoute 1
sinon
chercheLigne vaut faux
fin si
sinon
chercheLigne vaut faux
fin si
fin tant que
si cpt >= 6 alors
pour k de 0 à 7
aSuppr[i][k] vaut vrai
fin pour
aSpawns[i][j] vaut 7
actionRequise vaut vrai
sinon si cpt >= 5 alors
pour k de 0 à cpt - 1
aSuppr[i][j + k] vaut vrai
fin pour
aSpawns[i][j] vaut 7
actionRequise vaut vrai
sinon si cpt = 4 alors
pour k de 0 à cpt - 1
aSuppr[i][j + k] vaut vrai
fin pour
aSpawns[i][j] vaut 5
actionRequise vaut vrai
sinon si cpt = 3 alors
pour k de 0 à cpt - 1
aSuppr[i][j + k] vaut vrai
fin pour
actionRequise vaut vrai
fin si
fin si
fin si
fin pour
fin pour
// Détection VERTICALE
pour j de 0 à 7
pour i de 0 à 7
c1 est un nombre
c1 vaut plateau[i][j]
si c1 >= 1 et c1 <= 4 alors
estDebut est un booléen
estDebut vaut faux
si i = 0 alors
estDebut vaut vrai
sinon si plateau[i - 1][j] <> c1 alors
estDebut vaut vrai
fin si
si estDebut = vrai alors
cpt est un nombre
cpt vaut 1
chercheCol est un booléen
chercheCol vaut vrai
tant que chercheCol = vrai
si i + cpt <= 7 alors
si plateau[i + cpt][j] = c1 alors
cpt ajoute 1
sinon
chercheCol vaut faux
fin si
sinon
chercheCol vaut faux
fin si
fin tant que
si cpt >= 6 alors
pour k de 0 à 7
aSuppr[k][j] vaut vrai
fin pour
aSpawns[i][j] vaut 7
actionRequise vaut vrai
sinon si cpt >= 5 alors
pour k de 0 à cpt - 1
aSuppr[i + k][j] vaut vrai
fin pour
aSpawns[i][j] vaut 7
actionRequise vaut vrai
sinon si cpt = 4 alors
pour k de 0 à cpt - 1
aSuppr[i + k][j] vaut vrai
fin pour
aSpawns[i][j] vaut 5
actionRequise vaut vrai
sinon si cpt = 3 alors
pour k de 0 à cpt - 1
aSuppr[i + k][j] vaut vrai
fin pour
actionRequise vaut vrai
fin si
fin si
fin si
fin pour
fin pour
// Détection CARRÉ 2x2 (génère une Bombe)
pour i de 0 à 6
pour j de 0 à 6
c1 est un nombre
c1 vaut plateau[i][j]
si c1 >= 1 et c1 <= 4 alors
si c1 = plateau[i][j + 1] et c1 = plateau[i + 1][j] et c1 = plateau[i + 1][j + 1] alors
aSuppr[i][j] vaut vrai
aSuppr[i][j + 1] vaut vrai
aSuppr[i + 1][j] vaut vrai
aSuppr[i + 1][j + 1] vaut vrai
aSpawns[i][j] vaut 6
actionRequise vaut vrai
fin si
fin si
fin pour
fin pour
// Comptage des tuiles à détruire
nbDetruites est un nombre
nbDetruites vaut 0
pour i de 0 à 7
pour j de 0 à 7
si aSuppr[i][j] = vrai alors
nbDetruites ajoute 1
fin si
fin pour
fin pour
// Vérification de l'échange : s'il ne crée aucun match, on l'annule sans perdre de coup
si verifEchange = vrai alors
verifEchange vaut faux
si nbDetruites = 0 alors
tmpV est un nombre
tmpV vaut plateau[eY1][eX1]
plateau[eY1][eX1] vaut plateau[eY2][eX2]
plateau[eY2][eX2] vaut tmpV
coups ajoute 1
message vaut "Échange invalide : aucun alignement"
fin si
fin si
// Application des destructions et apparition des jokers (+ collecte du défi)
pour i de 0 à 7
pour j de 0 à 7
si aSuppr[i][j] = vrai alors
si plateau[i][j] = coulDefi et premierTour = faux alors
collecte ajoute 1
fin si
plateau[i][j] vaut 0
fin si
si aSpawns[i][j] > 0 alors
plateau[i][j] vaut aSpawns[i][j]
fin si
fin pour
fin pour
// Gravité et nouvelles tuiles
pour j de 0 à 7
pour i de 7 à 0 pas - 1
si plateau[i][j] = 0 alors
actionRequise vaut vrai
trouve est un booléen
trouve vaut faux
si i > 0 alors
pour k de i - 1 à 0 pas - 1
si plateau[k][j] > 0 alors
plateau[i][j] vaut plateau[k][j]
plateau[k][j] vaut 0
trouve vaut vrai
arrête
fin si
fin pour
fin si
si trouve = faux alors
plateau[i][j] vaut hasard(1, 4)
fin si
fin si
fin pour
fin pour
fin tant que
premierTour vaut faux
// --- PHASE 1b : NIVEAU RÉUSSI OU PARTIE PERDUE ---
finDePartie est un booléen
finDePartie vaut faux
gagne est un booléen
gagne vaut faux
si collecte >= qteDefi alors
gagne vaut vrai
finDePartie vaut vrai
sinon si coups <= 0 alors
finDePartie vaut vrai
fin si
si finDePartie = vrai alors
appelle afficherJeu(maToile, plateau, - 1, - 1, coups, niveau, collecte, qteDefi, coulDefi, message)
appelle afficherFin(maToile, gagne, niveau, collecte, qteDefi)
xF est un nombre
yF est un nombre
cliquer maToile dans xF, yF
si gagne = vrai alors
niveau ajoute 1
// Un peu moins de coups à chaque niveau (minimum 12)
coups vaut COUPS_DEPART - (niveau - 1)
coups vaut limiter(coups, 12, COUPS_DEPART)
// Nouveau défi : une autre couleur, quantité croissante
nouvColl est un nombre
nouvColl vaut hasard(1, 4)
tant que nouvColl = coulDefi
nouvColl vaut hasard(1, 4)
fin tant que
coulDefi vaut nouvColl
// Le défi augmente à chaque niveau
qteDefi vaut 20 + 6 * (niveau - 1)
collecte vaut 0
message vaut "Niveau " + niveau + " ! Défi : " + qteDefi + " tuiles"
// Nouvelle grille pour le niveau suivant
pour r de 0 à 7
pour c de 0 à 7
plateau[r][c] vaut hasard(1, 4)
fin pour
fin pour
premierTour vaut vrai
sinon
niveau vaut 1
coups vaut COUPS_DEPART
coulDefi vaut hasard(1, 4)
qteDefi vaut 20
collecte vaut 0
message vaut "Nouvelle partie !"
pour r de 0 à 7
pour c de 0 à 7
plateau[r][c] vaut hasard(1, 4)
fin pour
fin pour
premierTour vaut vrai
fin si
selX vaut - 1
selY vaut - 1
sinon
// --- PHASE 1c : DÉTECTION DE BLOCAGE ---
existeCoup est un booléen
existeCoup vaut faux
// Coups "jokers" : un arc-en-ciel, ou deux fusées / deux bombes voisines
pour i de 0 à 7
pour j de 0 à 7
v est un nombre
v vaut plateau[i][j]
si v = 7 alors
existeCoup vaut vrai
fin si
si v = 5 ou v = 6 alors
si j < 7 alors
si plateau[i][j + 1] = v alors
existeCoup vaut vrai
fin si
fin si
si i < 7 alors
si plateau[i + 1][j] = v alors
existeCoup vaut vrai
fin si
fin si
fin si
fin pour
fin pour
// Coups "classiques" : on teste chaque échange voisin (droite et bas)
si existeCoup = faux alors
pour i de 0 à 7
pour j de 0 à 7
pour dir de 0 à 1
nI est un nombre
nJ est un nombre
si dir = 0 alors
nI vaut i
nJ vaut j + 1
sinon
nI vaut i + 1
nJ vaut j
fin si
si nI <= 7 et nJ <= 7 et existeCoup = faux alors
// Échange temporaire
tmpE est un nombre
tmpE vaut plateau[i][j]
plateau[i][j] vaut plateau[nI][nJ]
plateau[nI][nJ] vaut tmpE
// Vérifie un alignement autour des deux cases échangées
pour q de 0 à 1
cy est un nombre
cx est un nombre
si q = 0 alors
cy vaut i
cx vaut j
sinon
cy vaut nI
cx vaut nJ
fin si
cv est un nombre
cv vaut plateau[cy][cx]
si cv >= 1 et cv <= 4 alors
// Horizontal
cnt est un nombre
cnt vaut 1
k est un nombre
cont est un booléen
k vaut cx - 1
cont vaut vrai
tant que cont = vrai
si k >= 0 alors
si plateau[cy][k] = cv alors
cnt ajoute 1
k vaut k - 1
sinon
cont vaut faux
fin si
sinon
cont vaut faux
fin si
fin tant que
k vaut cx + 1
cont vaut vrai
tant que cont = vrai
si k <= 7 alors
si plateau[cy][k] = cv alors
cnt ajoute 1
k ajoute 1
sinon
cont vaut faux
fin si
sinon
cont vaut faux
fin si
fin tant que
si cnt >= 3 alors
existeCoup vaut vrai
fin si
// Vertical
cnt vaut 1
k vaut cy - 1
cont vaut vrai
tant que cont = vrai
si k >= 0 alors
si plateau[k][cx] = cv alors
cnt ajoute 1
k vaut k - 1
sinon
cont vaut faux
fin si
sinon
cont vaut faux
fin si
fin tant que
k vaut cy + 1
cont vaut vrai
tant que cont = vrai
si k <= 7 alors
si plateau[k][cx] = cv alors
cnt ajoute 1
k ajoute 1
sinon
cont vaut faux
fin si
sinon
cont vaut faux
fin si
fin tant que
si cnt >= 3 alors
existeCoup vaut vrai
fin si
// Carré 2x2 contenant la case
pour oy de - 1 à 0
pour ox de - 1 à 0
ty est un nombre
tx est un nombre
ty vaut cy + oy
tx vaut cx + ox
si ty >= 0 et ty <= 6 et tx >= 0 et tx <= 6 alors
si plateau[ty][tx] = cv et plateau[ty][tx + 1] = cv et plateau[ty + 1][tx] = cv et plateau[ty + 1][tx + 1] = cv alors
existeCoup vaut vrai
fin si
fin si
fin pour
fin pour
fin si
fin pour
// On remet le plateau en place
plateau[nI][nJ] vaut plateau[i][j]
plateau[i][j] vaut tmpE
fin si
fin pour
fin pour
fin pour
fin si
si existeCoup = faux alors
// Jeu bloqué : message, puis mélange complet du plateau
appelle afficherJeu(maToile, plateau, - 1, - 1, coups, niveau, collecte, qteDefi, coulDefi, message)
appelle afficherBloque(maToile)
xB est un nombre
yB est un nombre
cliquer maToile dans xB, yB
pour r de 0 à 7
pour c de 0 à 7
plateau[r][c] vaut hasard(1, 4)
fin pour
fin pour
premierTour vaut vrai
selX vaut - 1
selY vaut - 1
message vaut "Plateau mélangé"
sinon
// --- PHASE 2 : INTERACTION ET JOKERS ---
appelle afficherJeu(maToile, plateau, selX, selY, coups, niveau, collecte, qteDefi, coulDefi, message)
x_clic est un nombre
y_clic est un nombre
cliquer maToile dans x_clic, y_clic
si y_clic < OFFY alors
selX vaut - 1
selY vaut - 1
message vaut "Sélection annulée"
sinon
indexX est un nombre
indexY est un nombre
indexX vaut arrondi_inferieur(x_clic / 50)
indexY vaut arrondi_inferieur((y_clic - OFFY) / 50)
indexX vaut limiter(indexX, 0, 7)
indexY vaut limiter(indexY, 0, 7)
si selX = -1 alors
selX vaut indexX
selY vaut indexY
message vaut "Choisis une tuile voisine"
sinon
diffX est un nombre
diffY est un nombre
diffX vaut absolue(indexX - selX)
diffY vaut absolue(indexY - selY)
si (diffX = 1 et diffY = 0) ou (diffX = 0 et diffY = 1) alors
temp est un nombre
cible est un nombre
temp vaut plateau[selY][selX]
cible vaut plateau[indexY][indexX]
estJoker est un booléen
estJoker vaut faux
tempJoker est un booléen
cibleJoker est un booléen
tempJoker vaut temp >= 5
cibleJoker vaut cible >= 5
// Tableau des cases touchées par l'effet du joker
marqJ est un tableau
pour i de 0 à 7
ligneM est un tableau
pour j de 0 à 7
ligneM ajoute faux
fin pour
marqJ ajoute ligneM
fin pour
// 1. Arc-en-ciel + joker -> tout le plateau
si (temp = 7 et cibleJoker = vrai) ou (cible = 7 et tempJoker = vrai) alors
estJoker vaut vrai
message vaut "MÉGA EXPLOSION !"
pour r de 0 à 7
pour c de 0 à 7
marqJ[r][c] vaut vrai
fin pour
fin pour
// 2. Arc-en-ciel + tuile simple -> détruit toute cette couleur
sinon si temp = 7 ou cible = 7 alors
estJoker vaut vrai
message vaut "Arc-en-ciel : une couleur disparaît !"
coulCible est un nombre
si temp = 7 alors
coulCible vaut cible
sinon
coulCible vaut temp
fin si
marqJ[selY][selX] vaut vrai
marqJ[indexY][indexX] vaut vrai
pour r de 0 à 7
pour c de 0 à 7
si plateau[r][c] = coulCible alors
marqJ[r][c] vaut vrai
fin si
fin pour
fin pour
// 3. Bombe + Bombe -> carré 6x6 centré sur la tuile cliquée
sinon si temp = 6 et cible = 6 alors
estJoker vaut vrai
message vaut "Double bombe : carré 6x6 !"
marqJ[selY][selX] vaut vrai
marqJ[indexY][indexX] vaut vrai
pour r de indexY - 2 à indexY + 3
pour c de indexX - 2 à indexX + 3
si r >= 0 et r <= 7 et c >= 0 et c <= 7 alors
marqJ[r][c] vaut vrai
fin si
fin pour
fin pour
// 4. Fusée + Fusée -> ligne + colonne de la tuile cliquée
sinon si temp = 5 et cible = 5 alors
estJoker vaut vrai
message vaut "Double fusée : croix !"
marqJ[selY][selX] vaut vrai
marqJ[indexY][indexX] vaut vrai
pour k de 0 à 7
marqJ[indexY][k] vaut vrai
marqJ[k][indexX] vaut vrai
fin pour
fin si
// (Fusée + Bombe, ou joker avec une tuile simple : échange standard)
si estJoker = vrai alors
// Application de l'effet du joker
pour r de 0 à 7
pour c de 0 à 7
si marqJ[r][c] = vrai alors
si plateau[r][c] = coulDefi alors
collecte ajoute 1
fin si
plateau[r][c] vaut 0
fin si
fin pour
fin pour
sinon
// 6. Échange standard si aucun joker n'a réagi
plateau[selY][selX] vaut cible
plateau[indexY][indexX] vaut temp
message vaut "Échange"
// On vérifiera au prochain tour que l'échange crée bien un match
verifEchange vaut vrai
eY1 vaut selY
eX1 vaut selX
eY2 vaut indexY
eX2 vaut indexX
fin si
coups vaut coups - 1
selX vaut - 1
selY vaut - 1
sinon
si indexX = selX et indexY = selY alors
selX vaut - 1
selY vaut - 1
message vaut "Sélection annulée"
sinon
selX vaut indexX
selY vaut indexY
message vaut "Choisis une tuile voisine"
fin si
fin si
fin si
fin si
fin si
fin si
fin tant que