Console
Clique sur « Exécuter » pour lancer le programme.
Aucune exécutionCtrl+Entrée : exécuter · Échap : arrêter
Code CoddyRun
@ PUISSANCE 4 CONTRE L'IA
@ Aligne 4 jetons (ligne, colonne ou diagonale) avant l'ordinateur !
@ CONFIGURATION ET VARIABLES
LARG est un nombre
LARG vaut 700
HAUT est un nombre
HAUT vaut 500
@ taille d'une case, coin haut-gauche de la grille, rayon d'un jeton
TCASE est un nombre
TCASE vaut 54
X0 est un nombre
X0 vaut 161
Y0 est un nombre
Y0 vaut 100
RJ est un nombre
RJ vaut 21
@ couleurs : 0 trou vide, 1 toi (jaune), 2 IA (rouge)
coulJeton est un tableau
coulJeton ajoute #0f1422
coulJeton ajoute #ffd43b
coulJeton ajoute #e63946
coulFonce est un tableau
coulFonce ajoute #0f1422
coulFonce ajoute #e0a800
coulFonce ajoute #a4161a
@ couleurs du message : 0 blanc, 1 jaune, 2 rose, 3 vert
msgTons est un tableau
msgTons ajoute #ffffff
msgTons ajoute #ffd43b
msgTons ajoute #ff8fa3
msgTons ajoute #7bed9f
nivNoms est un tableau
nivNoms ajoute ""
nivNoms ajoute "Facile"
nivNoms ajoute "Normal"
nivNoms ajoute "Expert"
@ les 4 directions : horizontale, verticale, diagonale descendante, diagonale montante
dirR est un tableau
dirR ajoute 0
dirR ajoute 1
dirR ajoute 1
dirR ajoute -1
dirC est un tableau
dirC ajoute 1
dirC ajoute 0
dirC ajoute 1
dirC ajoute 1
@ la grille : 6 lignes x 7 colonnes, la case (r, c) est plateau[r * 7 + c]
plateau est un tableau
@ cases de l'alignement gagnant (pour les entourer)
gagneCases est un tableau
gDir est un nombre
gDir vaut 0
tourDe est un nombre
tourDe vaut 1
quiCommence est un nombre
quiCommence vaut 1
@ etat : 0 manche en cours, 1 manche terminee
etat est un nombre
etat vaut 0
@ gagnant : 0 match nul, 1 toi, 2 IA
gagnant est un nombre
gagnant vaut 0
dernCoup est un nombre
dernCoup vaut -1
nbCoups est un nombre
nbCoups vaut 0
victJ est un nombre
victJ vaut 0
victI est un nombre
victI vaut 0
nuls est un nombre
nuls vaut 0
manche est un nombre
manche vaut 0
@ niveau : 1 facile, 2 normal, 3 expert
niveau est un nombre
niveau vaut 2
msgJeu est un texte
msgJeu vaut "A toi de jouer !"
msgTon est un nombre
msgTon vaut 0
@ OUTILS SUR LA GRILLE
fonction ligneLibre(c)
res est un nombre
res vaut -1
lr est un nombre
pour lr de 0 a 5
si plateau[lr * 7 + c] = 0 alors
res vaut lr
fin si
fin pour
retourne res
fin fonction
fonction grillePleine()
ok est un nombre
ok vaut 1
pc est un nombre
pour pc de 0 a 6
si plateau[pc] = 0 alors
ok vaut 0
fin si
fin pour
retourne ok
fin fonction
@ compte les jetons du joueur j a la suite, en partant a cote de (r, c)
fonction compteDir(r, c, dr, dc, j)
n est un nombre
n vaut 0
rr est un nombre
rr vaut r + dr
cc est un nombre
cc vaut c + dc
avance est un booléen
avance vaut vrai
tant que avance
si rr < 0 ou rr > 5 ou cc < 0 ou cc > 6 alors
avance vaut faux
sinon si plateau[rr * 7 + cc] = j alors
n vaut n + 1
rr vaut rr + dr
cc vaut cc + dc
sinon
avance vaut faux
fin si
fin tant que
retourne n
fin fonction
@ 1 si un jeton j pose en (r, c) fait un alignement de 4
fonction gagneEn(r, c, j)
ok est un nombre
ok vaut 0
gd est un nombre
pour gd de 0 a 3
tot est un nombre
tot vaut 1 + compteDir(r, c, dirR[gd], dirC[gd], j) + compteDir(r, c, 0 - dirR[gd], 0 - dirC[gd], j)
si tot >= 4 et ok = 0 alors
ok vaut 1
gDir vaut gd
fin si
fin pour
retourne ok
fin fonction
procédure marquerLigne(r, c, j)
vide gagneCases
dr est un nombre
dr vaut dirR[gDir]
dc est un nombre
dc vaut dirC[gDir]
arr est un nombre
arr vaut compteDir(r, c, 0 - dr, 0 - dc, j)
av est un nombre
av vaut compteDir(r, c, dr, dc, j)
rs est un nombre
rs vaut r - arr * dr
cs est un nombre
cs vaut c - arr * dc
mk est un nombre
pour mk de 0 a arr + av
gagneCases ajoute (rs + mk * dr) * 7 + cs + mk * dc
fin pour
fin procédure
fonction estGagnante(idx)
ok est un nombre
ok vaut 0
eg est un nombre
pour eg de 0 a longueur(gagneCases) - 1
si gagneCases[eg] = idx alors
ok vaut 1
fin si
fin pour
retourne ok
fin fonction
@ DESSIN DES JETONS
@ en CoddyRun, contour s'applique aux formes dessinees APRES lui
@ et reste actif : on le coupe avec sansContour apres chaque usage
procédure sansContour(t)
contour(t, rgba(0, 0, 0, 0), 1)
fin procédure
procédure jeton(t, x, y, j)
appelle sansContour(t)
cercle(t, x, y, RJ, coulJeton[j])
cercle(t, x, y, RJ - 7, coulFonce[j])
contour(t, rgba(255, 255, 255, 0.25), 2)
cercle(t, x, y, RJ - 11, coulJeton[j])
appelle sansContour(t)
ellipse(t, x - 7, y - 8, 6, 4, rgba(255, 255, 255, 0.45))
fin procédure
procédure etoile(t, x, y)
polygone(t, [x, y - 14, x + 4, y - 4, x + 15, y - 3, x + 7, y + 4, x + 9, y + 15, x, y + 9, x - 9, y + 15, x - 7, y + 4, x - 15, y - 3, x - 4, y - 4], #ffd43b)
fin procédure
@ DESSIN DE LA TABLE
@ volJ > 0 : un jeton qui tombe dans la colonne volC, a la ligne volR (-1 = au-dessus)
procédure dessinerSurToile(t, msg, ton, volJ, volC, volR)
dimension(t, LARG, HAUT)
appelle sansContour(t)
dégradé(t, [#1d2233, #0d1018])
ellipse(t, 350, 260, 330, 210, rgba(255, 255, 255, 0.03))
@ BANDEAU DU HAUT
rectangle(t, 0, 0, LARG, 46, rgba(0, 0, 0, 0.4))
ligne(t, 0, 46, LARG, 46, rgba(255, 255, 255, 0.09), 1)
rectangle_arrondi(t, 14, 10, 34, 26, 8, #2563eb)
label(t, 21, 29, "P4", #ffffff, 14)
label(t, 58, 29, "PUISSANCE 4", #ffffff, 15)
label(t, 190, 28, "Manche " + convertir_texte(manche), #ffd43b, 13)
contour(t, #2ed573, 1)
rectangle_arrondi(t, LARG - 300, 10, 96, 26, 12, rgba(46, 213, 115, 0.15))
appelle sansContour(t)
label(t, LARG - 288, 28, "IA : " + nivNoms[niveau], #7bed9f, 12)
contour(t, #ffd43b, 1)
rectangle_arrondi(t, LARG - 192, 10, 80, 26, 12, rgba(255, 212, 59, 0.16))
appelle sansContour(t)
label(t, LARG - 180, 28, "Nouvelle", #ffd43b, 12)
contour(t, #e63946, 1)
rectangle_arrondi(t, LARG - 96, 10, 80, 26, 12, rgba(230, 57, 70, 0.2))
appelle sansContour(t)
label(t, LARG - 80, 28, "Quitter", #ff8fa3, 12)
@ PANNEAU DU JOUEUR
si tourDe = 1 et etat = 0 alors
contour(t, #ffd43b, 2)
sinon
contour(t, rgba(255, 255, 255, 0.12), 1)
fin si
rectangle_arrondi(t, 12, 104, 108, 180, 14, rgba(255, 255, 255, 0.06))
appelle sansContour(t)
si etat = 1 et gagnant = 1 alors
appelle etoile(t, 66, 124)
fin si
appelle jeton(t, 66, 166, 1)
label(t, 52, 212, "TOI", #ffffff, 13)
label(t, 54, 250, convertir_texte(victJ), #ffd43b, 30)
label(t, 40, 270, "victoires", #8b93b0, 10)
@ PANNEAU DE L'IA
si tourDe = 2 et etat = 0 alors
contour(t, #e63946, 2)
sinon
contour(t, rgba(255, 255, 255, 0.12), 1)
fin si
rectangle_arrondi(t, 580, 104, 108, 180, 14, rgba(255, 255, 255, 0.06))
appelle sansContour(t)
si etat = 1 et gagnant = 2 alors
appelle etoile(t, 634, 124)
fin si
appelle jeton(t, 634, 166, 2)
label(t, 626, 212, "IA", #ffffff, 13)
label(t, 622, 250, convertir_texte(victI), #ff8fa3, 30)
label(t, 608, 270, "victoires", #8b93b0, 10)
@ INFOS ET REGLE
rectangle_arrondi(t, 12, 296, 108, 96, 14, rgba(255, 255, 255, 0.04))
label(t, 24, 320, "Matchs nuls", #8b93b0, 10)
label(t, 24, 348, convertir_texte(nuls), #ffffff, 20)
label(t, 24, 376, "Coups : " + convertir_texte(nbCoups), #8b93b0, 10)
rectangle_arrondi(t, 580, 296, 108, 96, 14, rgba(255, 255, 255, 0.04))
label(t, 592, 318, "BUT DU JEU", #ffd43b, 10)
label(t, 592, 340, "Aligne 4 jetons", #cbd5e1, 9)
label(t, 592, 356, "en ligne, colonne", #cbd5e1, 9)
label(t, 592, 372, "ou diagonale.", #cbd5e1, 9)
@ LA GRILLE
rectangle_arrondi(t, X0 - 4, Y0 - 2, 7 * TCASE + 16, 6 * TCASE + 16, 18, rgba(0, 0, 0, 0.35))
contour(t, #60a5fa, 2)
rectangle_arrondi(t, X0 - 8, Y0 - 8, 7 * TCASE + 16, 6 * TCASE + 16, 18, #2563eb)
appelle sansContour(t)
xd est un nombre
xd vaut X0 + 7 * TCASE + 8
polygone(t, [X0 - 8, 432, X0 + 20, 432, X0 + 6, 450, X0 - 22, 450], #1e40af)
polygone(t, [xd - 28, 432, xd, 432, xd + 14, 450, xd - 14, 450], #1e40af)
ligne(t, 40, 450, LARG - 40, 450, rgba(255, 255, 255, 0.1), 2)
gr est un nombre
pour gr de 0 a 5
gc est un nombre
pour gc de 0 a 6
cx est un nombre
cx vaut X0 + gc * TCASE + 27
cy est un nombre
cy vaut Y0 + gr * TCASE + 27
idx est un nombre
idx vaut gr * 7 + gc
si plateau[idx] = 0 alors
contour(t, rgba(0, 0, 0, 0.4), 2)
cercle(t, cx, cy, RJ, #0f1422)
appelle sansContour(t)
sinon
@ halo blanc dessine SOUS le jeton gagnant
si etat = 1 et gagnant > 0 alors
si estGagnante(idx) = 1 alors
cercle(t, cx, cy, RJ + 4, #ffffff)
fin si
fin si
appelle jeton(t, cx, cy, plateau[idx])
si idx = dernCoup et etat = 0 alors
cercle(t, cx, cy, 4, rgba(255, 255, 255, 0.8))
fin si
fin si
fin pour
fin pour
@ FLECHES AU-DESSUS DES COLONNES JOUABLES
si etat = 0 et tourDe = 1 et volJ = 0 alors
fc est un nombre
pour fc de 0 a 6
si ligneLibre(fc) >= 0 alors
fx est un nombre
fx vaut X0 + fc * TCASE + 27
polygone(t, [fx - 8, 62, fx + 8, 62, fx, 74], rgba(255, 212, 59, 0.35))
fin si
fin pour
fin si
@ JETON QUI TOMBE
si volJ > 0 alors
vx est un nombre
vx vaut X0 + volC * TCASE + 27
vy est un nombre
vy vaut Y0 - 34
si volR >= 0 alors
vy vaut Y0 + volR * TCASE + 27
fin si
appelle jeton(t, vx, vy, volJ)
fin si
@ BANDEROLE DE FIN DE MANCHE
si etat = 1 alors
si gagnant = 1 alors
rectangle_arrondi(t, X0, 52, 7 * TCASE, 36, 12, #ffd43b)
label(t, X0 + 20, 76, "BRAVO, TU GAGNES LA MANCHE !", #1d2233, 14)
sinon si gagnant = 2 alors
rectangle_arrondi(t, X0, 52, 7 * TCASE, 36, 12, #e63946)
label(t, X0 + 20, 76, "L'IA GAGNE LA MANCHE...", #ffffff, 14)
sinon
rectangle_arrondi(t, X0, 52, 7 * TCASE, 36, 12, #64748b)
label(t, X0 + 20, 76, "MATCH NUL : LA GRILLE EST PLEINE", #ffffff, 14)
fin si
fin si
@ MESSAGE
contour(t, rgba(255, 255, 255, 0.12), 1)
rectangle_arrondi(t, 12, HAUT - 40, LARG - 24, 28, 13, rgba(0, 0, 0, 0.55))
appelle sansContour(t)
cercle(t, 30, HAUT - 26, 4, #ffd43b)
label(t, 42, HAUT - 21, msg, msgTons[ton], 13)
fin procédure
procédure animerChute(j, c, rCible, msg)
ar est un nombre
pour ar de -1 a rCible
img est une toile
appelle dessinerSurToile(img, msg, 0, j, c, ar)
affiche img
fin pour
fin procédure
@ PREPARATION D'UNE MANCHE
procédure nouvelleManche()
vide plateau
ng est un nombre
pour ng de 0 a 41
plateau ajoute 0
fin pour
vide gagneCases
etat vaut 0
gagnant vaut 0
dernCoup vaut -1
nbCoups vaut 0
manche vaut manche + 1
msgTon vaut 0
@ on alterne celui qui commence
tourDe vaut quiCommence
si quiCommence = 1 alors
msgJeu vaut "Manche " + convertir_texte(manche) + " : tu commences ! Clique une colonne."
quiCommence vaut 2
sinon
msgJeu vaut "Manche " + convertir_texte(manche) + " : l'IA commence."
quiCommence vaut 1
fin si
fin procédure
@ JOUER UN COUP
procédure jouerCoup(c, j)
r est un nombre
r vaut ligneLibre(c)
si r >= 0 alors
txt est un texte
si j = 1 alors
txt vaut "Ton jeton tombe dans la colonne " + convertir_texte(c + 1) + "..."
sinon
txt vaut "L'IA joue dans la colonne " + convertir_texte(c + 1) + "."
fin si
appelle animerChute(j, c, r, txt)
plateau[r * 7 + c] vaut j
dernCoup vaut r * 7 + c
nbCoups vaut nbCoups + 1
si gagneEn(r, c, j) = 1 alors
appelle marquerLigne(r, c, j)
etat vaut 1
gagnant vaut j
si j = 1 alors
victJ vaut victJ + 1
msgJeu vaut "GAGNE ! 4 jetons alignes. Clique pour la manche suivante."
msgTon vaut 1
sinon
victI vaut victI + 1
msgJeu vaut "PERDU ! L'IA a aligne 4 jetons. Clique pour ta revanche."
msgTon vaut 2
fin si
sinon si grillePleine() = 1 alors
etat vaut 1
gagnant vaut 0
nuls vaut nuls + 1
msgJeu vaut "Match nul : la grille est pleine. Clique pour rejouer."
msgTon vaut 0
fin si
fin si
fin procédure
@ LE CERVEAU DE L'IA : elle note chaque colonne et garde la meilleure
fonction choixIA()
meilleur est un nombre
meilleur vaut -1
meilleurScore est un nombre
meilleurScore vaut -100000
@ reglages selon le niveau (valeurs en pourcentage pour les chances)
@ chanceVict : chance de voir qu'elle peut gagner
@ chanceBloc : chance de voir que tu vas gagner
chanceVict est un nombre
chanceBloc est un nombre
poidsVoisins est un nombre
poidsCentre est un nombre
bruit est un nombre
si niveau = 1 alors
chanceVict vaut 40
chanceBloc vaut 0
poidsVoisins vaut 0
poidsCentre vaut 0
bruit vaut 10
sinon si niveau = 2 alors
chanceVict vaut 60
chanceBloc vaut 20
poidsVoisins vaut 0
poidsCentre vaut 1
bruit vaut 20
sinon
chanceVict vaut 100
chanceBloc vaut 100
poidsVoisins vaut 3
poidsCentre vaut 4
bruit vaut 3
fin si
voitVictoire est un nombre
voitVictoire vaut 0
si hasard(1, 100) <= chanceVict alors
voitVictoire vaut 1
fin si
voitDanger est un nombre
voitDanger vaut 0
si hasard(1, 100) <= chanceBloc alors
voitDanger vaut 1
fin si
ic est un nombre
pour ic de 0 a 6
ir est un nombre
ir vaut ligneLibre(ic)
si ir >= 0 alors
sc est un nombre
sc vaut 0
@ 1) gagner tout de suite
si voitVictoire = 1 et gagneEn(ir, ic, 2) = 1 alors
sc vaut sc + 10000
fin si
@ 2) t'empecher de gagner
si voitDanger = 1 et gagneEn(ir, ic, 1) = 1 alors
sc vaut sc + 5000
fin si
@ 3) le centre donne plus de possibilites
dist est un nombre
dist vaut ic - 3
si dist < 0 alors
dist vaut 0 - dist
fin si
sc vaut sc + (3 - dist) * poidsCentre
@ 4) se coller a ses jetons (et en expert, gener les tiens)
id est un nombre
pour id de 0 a 3
na est un nombre
na vaut compteDir(ir, ic, dirR[id], dirC[id], 2) + compteDir(ir, ic, 0 - dirR[id], 0 - dirC[id], 2)
sc vaut sc + na * na * poidsVoisins
si niveau = 3 alors
nj est un nombre
nj vaut compteDir(ir, ic, dirR[id], dirC[id], 1) + compteDir(ir, ic, 0 - dirR[id], 0 - dirC[id], 1)
sc vaut sc + nj * 2
fin si
fin pour
@ 5) en expert : ne pas te preparer la case du dessus
si niveau = 3 et ir > 0 alors
si gagneEn(ir - 1, ic, 1) = 1 alors
sc vaut sc - 3000
fin si
si gagneEn(ir - 1, ic, 2) = 1 alors
sc vaut sc - 200
fin si
fin si
@ du hasard (beaucoup moins en expert)
sc vaut sc + hasard(0, bruit)
si sc > meilleurScore alors
meilleurScore vaut sc
meilleur vaut ic
fin si
fin si
fin pour
retourne meilleur
fin fonction
procédure tourIA()
gRef est une toile
appelle dessinerSurToile(gRef, "L'IA reflechit...", 2, 0, 0, 0)
affiche gRef
colIA est un nombre
colIA vaut choixIA()
si colIA >= 0 alors
appelle jouerCoup(colIA, 2)
fin si
tourDe vaut 1
si etat = 0 alors
msgJeu vaut "A toi : clique une colonne."
msgTon vaut 0
fin si
fin procédure
@ BOUCLE PRINCIPALE
appelle nouvelleManche()
quitter est un booléen
quitter vaut faux
clicX est un nombre
clicY est un nombre
tant que non quitter
si tourDe = 2 et etat = 0 alors
appelle tourIA()
fin si
gJeu est une toile
appelle dessinerSurToile(gJeu, msgJeu, msgTon, 0, 0, 0)
affiche gJeu
cliquer gJeu dans clicX, clicY
si clicX >= LARG - 96 et clicX < LARG - 16 et clicY >= 10 et clicY < 36 alors
quitter vaut vrai
sinon si clicX >= LARG - 192 et clicX < LARG - 112 et clicY >= 10 et clicY < 36 alors
appelle nouvelleManche()
sinon si clicX >= LARG - 300 et clicX < LARG - 204 et clicY >= 10 et clicY < 36 alors
si niveau = 1 alors
niveau vaut 2
msgJeu vaut "Niveau Normal : l'IA est distraite, elle fait des erreurs."
sinon si niveau = 2 alors
niveau vaut 3
msgJeu vaut "Niveau Expert : l'IA regarde un coup plus loin."
sinon
niveau vaut 1
msgJeu vaut "Niveau Facile : l'IA joue presque au hasard."
fin si
msgTon vaut 3
sinon si etat = 1 alors
appelle nouvelleManche()
sinon si tourDe = 1 alors
colJ est un nombre
colJ vaut -1
hc est un nombre
pour hc de 0 a 6
si clicX >= X0 + hc * TCASE et clicX < X0 + (hc + 1) * TCASE et clicY >= 46 et clicY < Y0 + 6 * TCASE alors
colJ vaut hc
fin si
fin pour
si colJ >= 0 alors
si ligneLibre(colJ) < 0 alors
msgJeu vaut "Cette colonne est pleine : choisis-en une autre."
msgTon vaut 2
sinon
appelle jouerCoup(colJ, 1)
si etat = 0 alors
tourDe vaut 2
fin si
fin si
sinon
msgJeu vaut "Clique dans une colonne de la grille pour lacher ton jeton."
msgTon vaut 0
fin si
fin si
fin tant que
@ ECRAN DE FIN ANIME
bilan est un texte
si victJ > victI alors
bilan vaut "Tu remportes la session !"
sinon si victI > victJ alors
bilan vaut "L'IA remporte la session..."
sinon
bilan vaut "Egalite parfaite !"
fin si
detail est un texte
detail vaut "Toi " + convertir_texte(victJ) + " - " + convertir_texte(victI) + " IA | " + convertir_texte(nuls) + " match(s) nul(s)"
ff est un nombre
pour ff de 0 a 15
gFin est une toile
appelle dessinerSurToile(gFin, "", 0, 0, 0, 0)
opac est un nombre
opac vaut limiter(ff / 10.0, 0.0, 0.7)
rectangle(gFin, 0, 0, LARG, HAUT, rgba(8, 10, 18, opac))
yBox est un nombre
yBox vaut 160 + (15 - ff) * 2
contour(gFin, rgba(255, 255, 255, 0.16), 1)
rectangle_arrondi(gFin, 130, yBox, 440, 170, 18, #1c2033)
appelle sansContour(gFin)
rectangle_arrondi(gFin, 130, yBox, 440, 8, 4, #2563eb)
appelle etoile(gFin, 350, yBox + 40)
label(gFin, 160, yBox + 96, bilan, #ffffff, 18)
label(gFin, 160, yBox + 124, detail, #a7f3d0, 12)
label(gFin, 160, yBox + 150, "Merci d'avoir joue !", #8b93b0, 11)
affiche gFin
fin pour