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)
OFFX est un nombre
OFFX vaut 20
OFFY est un nombre
OFFY vaut 130
CELL est un nombre
CELL vaut 40
MINES_DEPART est un nombre
MINES_DEPART vaut 10
NB_CASES est un nombre
NB_CASES vaut 81
niveau est un nombre
niveau vaut 1
nbMines est un nombre
nbMines vaut MINES_DEPART
mode est un texte
mode vaut "creuser"
message est un texte
message vaut "Clique sur une case pour commencer"
@ GRILLES
// mines : y a-t-il une mine ? / vus : case creusée ?
// drapeaux : drapeau posé ? / voisins : nombre de mines autour
mines est un tableau
vus est un tableau
drapeaux est un tableau
voisins est un tableau
pour i de 0 à 8
ligneM est un tableau
ligneV est un tableau
ligneD est un tableau
ligneN est un tableau
pour j de 0 à 8
ligneM ajoute faux
ligneV ajoute faux
ligneD ajoute faux
ligneN ajoute 0
fin pour
mines ajoute ligneM
vus ajoute ligneV
drapeaux ajoute ligneD
voisins ajoute ligneN
fin pour
@ DESSIN D'UNE CASE
procédure dessinerCase(t, x, y, vis, dr, estMine, nb, fini)
si vis = vrai alors
// Case creusée : fond sombre
rectangle_arrondi(t, x, y, 36, 36, 8, #172036)
si estMine = vrai alors
rectangle_arrondi(t, x, y, 36, 36, 8, #7F1D1D)
label(t, x + 8, y + 27, "💣", #FFFFFF, 18)
sinon si nb > 0 alors
coulNb est un texte
si nb = 1 alors
coulNb vaut #60A5FA
sinon si nb = 2 alors
coulNb vaut #34D399
sinon si nb = 3 alors
coulNb vaut #FBBF24
sinon si nb = 4 alors
coulNb vaut #F472B6
sinon si nb = 5 alors
coulNb vaut #C084FC
sinon
coulNb vaut #F87171
fin si
label(t, x + 12, y + 27, "" + nb, coulNb, 20)
fin si
sinon
// Case encore cachée : relief gris
rectangle_arrondi(t, x, y, 36, 36, 8, #475569)
rectangle_arrondi(t, x + 4, y + 4, 28, 10, 5, #64748B)
si dr = vrai alors
label(t, x + 8, y + 28, "🚩", #FFFFFF, 18)
sinon si fini = vrai et estMine = vrai alors
label(t, x + 8, y + 28, "💣", #FCA5A5, 18)
fin si
fin si
fin procédure
@ EN-TÊTE
procédure dessinerEntete(t, niv, restants, md, reste)
rectangle_arrondi(t, 10, 10, 380, 110, 16, #1E293B)
label(t, 22, 45, "DÉMINEUR", #F8FAFC, 24)
label(t, 22, 72, "Niveau " + niv, #CBD5E1, 16)
couleurDrap est un texte
si restants < 0 alors
couleurDrap vaut #F87171
sinon
couleurDrap vaut #FDE68A
fin si
label(t, 250, 45, "🚩 " + restants, couleurDrap, 20)
label(t, 250, 72, "Reste : " + reste, #93C5FD, 14)
// Bouton de changement de mode
coulB est un texte
txtB est un texte
si md = "drapeau" alors
coulB vaut #B45309
txtB vaut "MODE DRAPEAU 🚩"
sinon
coulB vaut #1D4ED8
txtB vaut "MODE CREUSER"
fin si
rectangle_arrondi(t, 22, 84, 180, 26, 10, coulB)
label(t, 34, 102, txtB, #FFFFFF, 14)
label(t, 210, 102, "(clique pour changer)", #94A3B8, 11)
fin procédure
@ AFFICHAGE COMPLET
procédure afficherJeu(t, gM, gV, gD, gN, niv, restants, md, reste, msg, fini)
effacer(t)
remplir(t, #0B1020)
appelle dessinerEntete(t, niv, restants, md, reste)
// Cadre de la grille
rectangle_arrondi(t, 12, OFFY - 8, 376, 376, 12, #0F172A)
pour i de 0 à 8
pour j de 0 à 8
xC est un nombre
yC est un nombre
xC vaut OFFX + j * CELL
yC vaut OFFY + i * CELL
appelle dessinerCase(t, xC, yC, gV[i][j], gD[i][j], gM[i][j], gN[i][j], fini)
fin pour
fin pour
// Bandeau de message en bas de la toile
rectangle_arrondi(t, 10, 512, 380, 16, 0, #0B1020)
label(t, 14, 528, msg, #FDE68A, 14)
affiche t
fin procédure
@ ÉCRAN DE FIN
procédure afficherFin(t, gagne, niv, mn)
rectangle_arrondi(t, 40, 200, 320, 170, 20, #1E293B)
si gagne = vrai alors
label(t, 70, 250, "🏆 TERRAIN DÉMINÉ !", #FDE68A, 24)
label(t, 70, 285, "Niveau " + niv + " réussi", #F8FAFC, 16)
label(t, 70, 310, "Attention, il y aura plus de mines...", #CBD5E1, 13)
label(t, 70, 350, "Clique pour le niveau suivant", #93C5FD, 14)
sinon
label(t, 70, 250, "💥 BOUM !", #FCA5A5, 26)
label(t, 70, 285, "Tu as creusé sur une mine", #F8FAFC, 16)
label(t, 70, 310, "Niveau atteint : " + niv + " (" + mn + " mines)", #CBD5E1, 13)
label(t, 70, 350, "Clique pour rejouer", #93C5FD, 14)
fin si
affiche t
fin procédure
@ BOUCLE PRINCIPALE
// Les mines ne sont placées qu'au premier clic : on ne perd jamais au 1er coup
premierClic est un booléen
premierClic vaut vrai
perdu est un booléen
perdu vaut faux
gagne est un booléen
gagne vaut faux
enJeu est un booléen
enJeu vaut vrai
tant que enJeu = vrai
// --- PHASE 1 : COMPTAGE ET TEST DE VICTOIRE ---
nbDrap est un nombre
nbDrap vaut 0
nbVus est un nombre
nbVus vaut 0
pour i de 0 à 8
pour j de 0 à 8
si drapeaux[i][j] = vrai alors
nbDrap ajoute 1
fin si
si vus[i][j] = vrai alors
nbVus ajoute 1
fin si
fin pour
fin pour
restants est un nombre
restants vaut nbMines - nbDrap
reste est un nombre
reste vaut NB_CASES - nbMines - nbVus
si perdu = faux et premierClic = faux et reste <= 0 alors
gagne vaut vrai
fin si
// --- PHASE 2 : FIN DE PARTIE ---
si gagne = vrai ou perdu = vrai alors
appelle afficherJeu(maToile, mines, vus, drapeaux, voisins, niveau, restants, mode, reste, message, vrai)
appelle afficherFin(maToile, gagne, niveau, nbMines)
xF est un nombre
yF est un nombre
cliquer maToile dans xF, yF
si gagne = vrai alors
niveau ajoute 1
// 2 mines de plus par niveau (maximum 24)
nbMines vaut MINES_DEPART + 2 * (niveau - 1)
nbMines vaut limiter(nbMines, MINES_DEPART, 24)
message vaut "Niveau " + niveau + " : " + nbMines + " mines cachées"
sinon
niveau vaut 1
nbMines vaut MINES_DEPART
message vaut "Nouvelle partie : " + nbMines + " mines"
fin si
// Remise à zéro de la grille
pour r de 0 à 8
pour c de 0 à 8
mines[r][c] vaut faux
vus[r][c] vaut faux
drapeaux[r][c] vaut faux
voisins[r][c] vaut 0
fin pour
fin pour
premierClic vaut vrai
perdu vaut faux
gagne vaut faux
mode vaut "creuser"
sinon
// --- PHASE 3 : INTERACTION ---
appelle afficherJeu(maToile, mines, vus, drapeaux, voisins, niveau, restants, mode, reste, message, faux)
x_clic est un nombre
y_clic est un nombre
cliquer maToile dans x_clic, y_clic
si y_clic < OFFY alors
// Clic dans l'en-tête : bouton de mode
si x_clic >= 22 et x_clic <= 202 et y_clic >= 84 et y_clic <= 110 alors
si mode = "drapeau" alors
mode vaut "creuser"
message vaut "Mode creuser : tu ouvres les cases"
sinon
mode vaut "drapeau"
message vaut "Mode drapeau : tu marques les mines"
fin si
fin si
sinon si y_clic >= OFFY + 9 * CELL alors
message vaut "Clique sur la grille"
sinon
cJ est un nombre
cI est un nombre
cJ vaut arrondi_inferieur((x_clic - OFFX) / CELL)
cI vaut arrondi_inferieur((y_clic - OFFY) / CELL)
cJ vaut limiter(cJ, 0, 8)
cI vaut limiter(cI, 0, 8)
si mode = "drapeau" alors
// --- POSE / RETRAIT D'UN DRAPEAU ---
si vus[cI][cJ] = vrai alors
message vaut "Cette case est déjà creusée"
sinon si drapeaux[cI][cJ] = vrai alors
drapeaux[cI][cJ] vaut faux
message vaut "Drapeau retiré"
sinon
drapeaux[cI][cJ] vaut vrai
message vaut "Drapeau posé"
fin si
sinon
// --- CREUSER ---
si drapeaux[cI][cJ] = vrai alors
message vaut "Retire d'abord le drapeau"
sinon si vus[cI][cJ] = vrai alors
message vaut "Cette case est déjà creusée"
sinon
// Placement des mines au premier clic (jamais autour du clic)
si premierClic = vrai alors
premierClic vaut faux
posees est un nombre
posees vaut 0
tant que posees < nbMines
mr est un nombre
mc est un nombre
mr vaut hasard(0, 8)
mc vaut hasard(0, 8)
libre est un booléen
libre vaut vrai
si mines[mr][mc] = vrai alors
libre vaut faux
fin si
si absolue(mr - cI) <= 1 et absolue(mc - cJ) <= 1 alors
libre vaut faux
fin si
si libre = vrai alors
mines[mr][mc] vaut vrai
posees ajoute 1
fin si
fin tant que
// Calcul du nombre de mines voisines de chaque case
pour r de 0 à 8
pour c de 0 à 8
n est un nombre
n vaut 0
pour dr de - 1 à 1
pour dc de - 1 à 1
vr est un nombre
vc est un nombre
vr vaut r + dr
vc vaut c + dc
si vr >= 0 et vr <= 8 et vc >= 0 et vc <= 8 alors
si mines[vr][vc] = vrai alors
n ajoute 1
fin si
fin si
fin pour
fin pour
voisins[r][c] vaut n
fin pour
fin pour
message vaut "C'est parti, bonne chance !"
fin si
si mines[cI][cJ] = vrai alors
vus[cI][cJ] vaut vrai
perdu vaut vrai
message vaut "Mine touchée..."
sinon
vus[cI][cJ] vaut vrai
// Propagation : on ouvre en cascade toutes les zones à 0 mine
propage est un booléen
propage vaut vrai
tant que propage = vrai
propage vaut faux
pour r de 0 à 8
pour c de 0 à 8
si vus[r][c] = vrai et voisins[r][c] = 0 alors
pour dr de - 1 à 1
pour dc de - 1 à 1
pr est un nombre
pc est un nombre
pr vaut r + dr
pc vaut c + dc
si pr >= 0 et pr <= 8 et pc >= 0 et pc <= 8 alors
si vus[pr][pc] = faux et drapeaux[pr][pc] = faux alors
vus[pr][pc] vaut vrai
propage vaut vrai
fin si
fin si
fin pour
fin pour
fin si
fin pour
fin pour
fin tant que
si voisins[cI][cJ] = 0 alors
message vaut "Zone vide ouverte !"
sinon
message vaut "" + voisins[cI][cJ] + " mine(s) autour de cette case"
fin si
fin si
fin si
fin si
fin si
fin si
fin tant que