Console
Clique sur « Exécuter » pour lancer le programme.
Aucune exécutionCtrl+Entrée : exécuter · Échap : arrêter
Code CoddyRun
@ Reglages
niveauxMax est un nombre
niveauxMax vaut 12 // nombre d'iterations (12 = ~4000 segments)
largCarte est un nombre
hautCarte est un nombre
largCarte vaut 520
hautCarte vaut 420
@ Sequence de virages : 1 = tourner a GAUCHE, 0 = tourner a DROITE
// On part d'un seul virage a gauche.
virages est un tableau
virages ajoute 1
@ fonction : construit la sequence du niveau suivant
// Regle du dragon : nouveau = ancien + [1] + (ancien inverse et permute)
// "inverse et permute" = on lit l'ancien a l'envers en echangeant G<->D.
fonction niveauSuivant(seq)
resultat est un tableau
i est un nombre
// 1) recopier la sequence actuelle
pour i de 0 a longueur(seq) - 1
resultat ajoute seq[i]
fin pour
// 2) ajouter un virage a gauche au milieu
resultat ajoute 1
// 3) ajouter l'ancienne sequence, lue a l'envers et virages inverses
pour i de longueur(seq) - 1 a 0 pas - 1
si seq[i] = 1 alors
resultat ajoute 0
sinon
resultat ajoute 1
fin si
fin pour
retourne resultat
fin fonction
@ Procedure : trace la courbe correspondant a une sequence de virages
// Direction de depart = vers la droite (dx=1, dy=0). A chaque virage on
// tourne de 90 deg (echange de coordonnees, que des entiers).
// La longueur des segments s'adapte pour que la courbe tienne dans la toile.
// Fonction : couleur arc-en-ciel selon une progression p entre 0 et 1
// (bleu -> cyan -> vert -> jaune -> rouge)
fonction couleurArc(p)
r est un nombre
v est un nombre
b est un nombre
// teinte de 240 (bleu) a 0 (rouge)
h est un nombre
h vaut 240 - p * 240
// conversion teinte -> RGB simplifiee (saturation et luminosite max)
si h < 60 alors
r vaut 255
v vaut arrondi(h / 60 * 255)
b vaut 0
sinon si h < 120 alors
r vaut arrondi((120 - h) / 60 * 255)
v vaut 255
b vaut 0
sinon si h < 180 alors
r vaut 0
v vaut 255
b vaut arrondi((h - 120) / 60 * 255)
sinon
r vaut 0
v vaut arrondi((240 - h) / 60 * 255)
b vaut 255
fin si
retourne rgb(r, v, b)
fin fonction
procedure tracerDragon(t, seq)
nbSeg est un nombre
nbSeg vaut longueur(seq) + 1
_pas est un nombre
_pas vaut 12
si nbSeg > 40 alors
_pas vaut 9
fin si
si nbSeg > 200 alors
_pas vaut 5
fin si
si nbSeg > 1000 alors
_pas vaut 3
fin si
// ---- PASSE 1 : calculer tous les points et les bornes (pour centrer) ----
ptsX est un tableau
ptsY est un tableau
x est un nombre
y est un nombre
dx est un nombre
dy est un nombre
x vaut 0
y vaut 0
dx vaut 1
dy vaut 0
minX est un nombre
maxX est un nombre
minY est un nombre
maxY est un nombre
minX vaut 0
maxX vaut 0
minY vaut 0
maxY vaut 0
nx est un nombre
ny est un nombre
tmp est un nombre
k est un nombre
s est un nombre
ptsX ajoute x
ptsY ajoute y
pour k de 0 a nbSeg - 1
nx vaut x + dx * _pas
ny vaut y + dy * _pas
x vaut nx
y vaut ny
ptsX ajoute x
ptsY ajoute y
minX vaut minimum(minX, x)
maxX vaut maximum(maxX, x)
minY vaut minimum(minY, y)
maxY vaut maximum(maxY, y)
si k < longueur(seq) alors
s vaut seq[k]
si s = 1 alors
tmp vaut dx
dx vaut dy
dy vaut 0 - tmp
sinon
tmp vaut dx
dx vaut 0 - dy
dy vaut tmp
fin si
fin si
fin pour
// ---- centrage : decalage pour placer le milieu des bornes au centre ----
decX est un nombre
decY est un nombre
decX vaut largCarte / 2 - (minX + maxX) / 2
decY vaut hautCarte / 2 - (minY + maxY) / 2
// ---- PASSE 2 : tracer chaque segment avec une couleur du degrade ----
j est un nombre
prog est un nombre
coul est un texte
pour j de 0 a nbSeg - 1
prog vaut j / nbSeg
coul vaut couleurArc(prog)
ligne(t, ptsX[j] + decX, ptsY[j] + decY, ptsX[j + 1] + decX, ptsY[j + 1] + decY, coul, 2)
fin pour
fin procedure
@ Construction des images : une par niveau (1, 2, 3, ...)
images est un tableau
frame est une toile
dimension(frame, largCarte, hautCarte)
// couleur qui evolue avec le niveau (du bleu vers le violet)
n est un nombre
pour n de 1 a niveauxMax
effacer(frame)
remplir(frame, #0B1020)
// tracer la courbe du niveau courant (centree + degrade arc-en-ciel)
appelle tracerDragon(frame, virages)
// legende du niveau
label(frame, 12, 24, "Niveau " + convertir_texte(n), #FFD21A, 18)
label(frame, 12, 46, convertir_texte(longueur(virages) + 1) + " segments", #8FA4C8, 14)
images ajoute frame
// preparer le niveau suivant
si n < niveauxMax alors
virages vaut niveauSuivant(virages)
fin si
fin pour
@ Animation : chaque niveau reste 700 ms a l'ecran
animation(images, 700, 0)