Console
Clique sur « Exécuter » pour lancer le programme.
Code CoddyRun
@ Dimensions de la table
HAUT_JEU est un nombre
HAUT_JEU vaut 50
BAS_JEU est un nombre
BAS_JEU vaut 470
RAQ_H est un nombre
RAQ_H vaut 80
RAQ_L est un nombre
RAQ_L vaut 14
RAYON est un nombre
RAYON vaut 9
X_JOUEUR est un nombre
X_JOUEUR vaut 24
X_ORDI est un nombre
X_ORDI vaut 602
BUT est un nombre
BUT vaut 7
@ État du jeu et Variables globales
ecran est une toile
dimension(ecran, 640, 480)
balleX, balleY, balleVX, balleVY est un nombre
ancienX, ancienY est un nombre
vitesseBalle, echanges est un nombre
raqJoueurY, raqOrdiY, cibleJoueur est un nombre
vitesseOrdi, erreurOrdi, niveauDifficulte est un nombre
scoreJoueur, scoreOrdi, gel est un nombre
meilleurScore est un nombre
enJeu, pretAJouer est un booleen
verdict est un texte
verdictX est un nombre
traceX est un tableau
traceY est un tableau
k, frac, yCroise, plan est un nombre
action, clicX, clicY est un nombre
// Chargement du meilleur score enregistré
essayer
meilleurScore vaut paramètre("pong", "meilleur_score")
attraper
meilleurScore vaut 0
paramètre("pong", "meilleur_score", meilleurScore)
fin essayer
procédure initialiserPartie()
raqJoueurY vaut 210
raqOrdiY vaut 210
cibleJoueur vaut 210
vitesseBalle vaut 12
echanges vaut 0
si niveauDifficulte = 1 alors
vitesseOrdi vaut 7
sinon si niveauDifficulte = 2 alors
vitesseOrdi vaut 9
sinon
vitesseOrdi vaut 12
fin si
erreurOrdi vaut 0
scoreJoueur vaut 0
scoreOrdi vaut 0
gel vaut 16
enJeu vaut vrai
verdict vaut ""
verdictX vaut 244
balleX vaut 320
balleY vaut 260
balleVX vaut 12
balleVY vaut 0
vide traceX
vide traceY
pour k de 0 à 5
traceX ajoute 320
traceY ajoute 260
fin pour
fin procédure
@ Service
procédure servir(versOrdi)
balleX vaut 320
balleY vaut 200 + hasard(120)
vitesseBalle vaut 12
echanges vaut 0
si versOrdi alors
balleVX vaut vitesseBalle
sinon
balleVX vaut 0 - vitesseBalle
fin si
balleVY vaut hasard(8) - 4
si niveauDifficulte = 1 alors
erreurOrdi vaut hasard(120) - 60
sinon si niveauDifficulte = 2 alors
erreurOrdi vaut hasard(80) - 40
sinon
erreurOrdi vaut hasard(40) - 20
fin si
gel vaut 16
fin procédure
@ Renvoi
procédure renvoyer(yImpact, centreRaquette, versDroite)
ecartLoc est un nombre
echanges vaut echanges + 1
vitesseBalle vaut limiter(12 + echanges, 12, 22)
ecartLoc vaut limiter((yImpact - centreRaquette) / (RAQ_H / 2), -1, 1)
balleVY vaut arrondi(ecartLoc * vitesseBalle * 3 / 4)
si versDroite alors
balleVX vaut arrondi(racine(vitesseBalle * vitesseBalle - balleVY * balleVY))
sinon
balleVX vaut 0 - arrondi(racine(vitesseBalle * vitesseBalle - balleVY * balleVY))
fin si
fin procédure
@ Dessin
procédure dessinerRaquette(g, rx, ry, teinte, halo)
rectangle_arrondi(g, rx - 3, ry - 3, RAQ_L + 6, RAQ_H + 6, 10, halo)
rectangle_arrondi(g, rx, ry, RAQ_L, RAQ_H, 7, teinte)
rectangle_arrondi(g, rx + 3, ry + 8, 4, RAQ_H - 16, 2, #FFFFFF)
fin procédure
procédure dessinerTable(g)
tk est un nombre
rectangle(g, 0, 0, 640, 480, #0B0E14)
cercle(g, 320, 260, 60, #141A26)
rectangle(g, 0, HAUT_JEU - 3, 640, 3, #232A38)
rectangle(g, 0, BAS_JEU, 640, 3, #232A38)
pour tk de 0 à 13
rectangle(g, 318, HAUT_JEU + 6 + tk * 30, 4, 16, #2C3446)
fin pour
fin procédure
procédure dessinerScore(g)
txtJoueur est un texte
txtOrdi est un texte
wJ, wO est un nombre
txtJoueur vaut "Toi " + convertir_texte(scoreJoueur)
txtOrdi vaut convertir_texte(scoreOrdi) + " Ordinateur"
wJ vaut label_largeur(txtJoueur, 22)
wO vaut label_largeur(txtOrdi, 22)
label(g, 200 - wJ / 2, 22, txtJoueur, #3B82F6, 22)
label(g, 314, 22, "-", #6B7280, 22)
label(g, 440 - wO / 2, 22, txtOrdi, #EF4444, 22)
fin procédure
procédure afficherEcranTitre()
effacer(ecran)
rectangle(ecran, 0, 0, 640, 480, #0B0E14)
pour k de 0 à 13
rectangle(ecran, 318, 56 + k * 30, 4, 16, #2C3446)
fin pour
appelle dessinerRaquette(ecran, X_JOUEUR, 210, #3B82F6, #1D3A6B)
appelle dessinerRaquette(ecran, X_ORDI, 210, #EF4444, #6B1D1D)
cercle(ecran, 320, 260, 9, #FFFFFF)
rectangle_arrondi(ecran, 90, 90, 460, 300, 16, #151A24)
label(ecran, 255, 135, "PONG", #FFFFFF, 46)
label(ecran, 140, 185, "Contrôles : Z / S (Clavier) ou Clic Souris", #9CA3AF, 15)
label(ecran, 175, 215, "Meilleur score enregistré : " + convertir_texte(meilleurScore), #10B981, 16)
// Boutons de difficulté
rectangle_arrondi(ecran, 120, 250, 110, 40, 8, sialors(niveauDifficulte = 1, #3B82F6, #232A38))
label(ecran, 143, 275, "1. Facile", #FFFFFF, 15)
rectangle_arrondi(ecran, 265, 250, 110, 40, 8, sialors(niveauDifficulte = 2, #3B82F6, #232A38))
label(ecran, 285, 275, "2. Moyen", #FFFFFF, 15)
rectangle_arrondi(ecran, 410, 250, 110, 40, 8, sialors(niveauDifficulte = 3, #3B82F6, #232A38))
label(ecran, 423, 275, "3. Difficile", #FFFFFF, 15)
label(ecran, 165, 320, "Choisis le mode avec 1, 2, 3 ou au Clic", #3B82F6, 14)
label(ecran, 210, 345, "Appuie sur Z, S ou Clic pour Lancer", #9CA3AF, 14)
label(ecran, 280, 368, "P = Quitter", #6B7280, 13)
affiche ecran
fin procédure
@ Moteur du jeu
processus MoteurJeu()
tant que enJeu
// 1. Déplacement lissé de la raquette joueur
si raqJoueurY < cibleJoueur - 18 alors
raqJoueurY vaut raqJoueurY + 18
sinon si raqJoueurY > cibleJoueur + 18 alors
raqJoueurY vaut raqJoueurY - 18
sinon
raqJoueurY vaut cibleJoueur
fin si
raqJoueurY vaut limiter(raqJoueurY, HAUT_JEU, BAS_JEU - RAQ_H)
// 2. Raquette de l'ordinateur
si balleVX > 0 alors
k vaut balleY + erreurOrdi - RAQ_H / 2
sinon
k vaut 260 - RAQ_H / 2
fin si
si raqOrdiY < k - 5 alors
raqOrdiY vaut raqOrdiY + vitesseOrdi
sinon si raqOrdiY > k + 5 alors
raqOrdiY vaut raqOrdiY - vitesseOrdi
fin si
raqOrdiY vaut limiter(raqOrdiY, HAUT_JEU, BAS_JEU - RAQ_H)
// 3. Balle
si gel > 0 alors
gel vaut gel - 1
sinon
ancienX vaut balleX
ancienY vaut balleY
balleX vaut balleX + balleVX
balleY vaut balleY + balleVY
si balleY - RAYON < HAUT_JEU alors
balleY vaut HAUT_JEU + RAYON
balleVY vaut absolue(balleVY)
fin si
si balleY + RAYON > BAS_JEU alors
balleY vaut BAS_JEU - RAYON
balleVY vaut 0 - absolue(balleVY)
fin si
plan vaut X_JOUEUR + RAQ_L + RAYON
si balleVX < 0 et ancienX >= plan et balleX < plan alors
frac vaut (ancienX - plan) / (ancienX - balleX)
yCroise vaut ancienY + (balleY - ancienY) * frac
si yCroise > raqJoueurY - RAYON et yCroise < raqJoueurY + RAQ_H + RAYON alors
balleX vaut plan
balleY vaut yCroise
appelle renvoyer(yCroise, raqJoueurY + RAQ_H / 2, vrai)
fin si
fin si
plan vaut X_ORDI - RAYON
si balleVX > 0 et ancienX <= plan et balleX > plan alors
frac vaut (plan - ancienX) / (balleX - ancienX)
yCroise vaut ancienY + (balleY - ancienY) * frac
si yCroise > raqOrdiY - RAYON et yCroise < raqOrdiY + RAQ_H + RAYON alors
balleX vaut plan
balleY vaut yCroise
appelle renvoyer(yCroise, raqOrdiY + RAQ_H / 2, faux)
si niveauDifficulte = 1 alors
erreurOrdi vaut hasard(120) - 60
sinon si niveauDifficulte = 2 alors
erreurOrdi vaut hasard(80) - 40
sinon
erreurOrdi vaut hasard(40) - 20
fin si
fin si
fin si
si balleX < -20 alors
scoreOrdi vaut scoreOrdi + 1
appelle servir(faux)
sinon si balleX > 660 alors
scoreJoueur vaut scoreJoueur + 1
appelle servir(vrai)
fin si
si scoreJoueur >= BUT alors
verdict vaut "GAGNÉ !"
verdictX vaut 245
enJeu vaut faux
si scoreJoueur > meilleurScore alors
meilleurScore vaut scoreJoueur
paramètre("pong", "meilleur_score", meilleurScore)
fin si
sinon si scoreOrdi >= BUT alors
verdict vaut "PERDU"
verdictX vaut 259
enJeu vaut faux
fin si
fin si
// Mise à jour de la traîne
pour k de 5 à 1 pas - 1
traceX[k] vaut traceX[k - 1]
traceY[k] vaut traceY[k - 1]
fin pour
traceX[0] vaut balleX
traceY[0] vaut balleY
// 4. Rendu
effacer(ecran)
appelle dessinerTable(ecran)
appelle dessinerRaquette(ecran, X_JOUEUR, raqJoueurY, #3B82F6, #1D3A6B)
appelle dessinerRaquette(ecran, X_ORDI, raqOrdiY, #EF4444, #6B1D1D)
pour k de 5 à 1 pas - 1
cercle(ecran, traceX[k], traceY[k], RAYON - k, #2A3142)
fin pour
cercle(ecran, balleX, balleY, RAYON + 2, #6B7280)
cercle(ecran, balleX, balleY, RAYON, #FFFFFF)
appelle dessinerScore(ecran)
si gel > 0 et enJeu alors
label(ecran, 290, 250, "PRÊT", #6B7280, 20)
fin si
si non enJeu alors
rectangle_arrondi(ecran, 160, 150, 320, 185, 16, #151A24)
label(ecran, verdictX, 195, verdict, sialors(scoreJoueur >= BUT, #3B82F6, #EF4444), 32)
label(ecran, 282, 238, convertir_texte(scoreJoueur) + " - " + convertir_texte(scoreOrdi), #9CA3AF, 22)
label(ecran, 200, 272, "Meilleur score : " + convertir_texte(meilleurScore), #10B981, 16)
label(ecran, 185, 305, "Appuie sur Z/S ou Clic pour rejouer", #3B82F6, 14)
fin si
affiche ecran
pause 60
fin tant que
fin processus
@ Programme principal
niveauDifficulte vaut 2
pretAJouer vaut faux
// --- Écran de titre ---
tant que non pretAJouer
appelle afficherEcranTitre()
interagir ecran, ["1", "2", "3", "z", "s", "p"] dans action, clicX, clicY
si action = 1 alors
niveauDifficulte vaut 1
sinon si action = 2 alors
niveauDifficulte vaut 2
sinon si action = 3 alors
niveauDifficulte vaut 3
sinon si action = 4 ou action = 5 alors
pretAJouer vaut vrai
sinon si action = 6 alors
terminer
sinon si action = 0 alors
si clique(clicX, clicY, 120, 250, 110, 40) alors
niveauDifficulte vaut 1
sinon si clique(clicX, clicY, 265, 250, 110, 40) alors
niveauDifficulte vaut 2
sinon si clique(clicX, clicY, 410, 250, 110, 40) alors
niveauDifficulte vaut 3
sinon
pretAJouer vaut vrai
fin si
fin si
fin tant que
// --- Boucle de jeu ---
tant que vrai
appelle initialiserPartie()
MoteurJeu()
// Contrôles en cours de partie
tant que enJeu
interagir ecran, ["z", "s", "p"] dans action, clicX, clicY
si non enJeu alors
si action = 3 alors
terminer
fin si
arrête
fin si
si action = 1 alors
cibleJoueur vaut limiter(cibleJoueur - 35, HAUT_JEU, BAS_JEU - RAQ_H)
sinon si action = 2 alors
cibleJoueur vaut limiter(cibleJoueur + 35, HAUT_JEU, BAS_JEU - RAQ_H)
sinon si action = 3 alors
verdict vaut "ABANDON"
verdictX vaut 235
enJeu vaut faux
sinon si action = 0 alors
cibleJoueur vaut limiter(clicY - RAQ_H / 2, HAUT_JEU, BAS_JEU - RAQ_H)
fin si
fin tant que
fin tant que