Console
Clique sur « Exécuter » pour lancer le programme.
Aucune exécutionCtrl+Entrée : exécuter · Échap : arrêter
Code CoddyRun
@ Réglages
SOL est un nombre
SOL vaut 360
X_JOUEUR est un nombre
X_JOUEUR vaut 116
X_ENNEMI est un nombre
X_ENNEMI vaut 356
CADENCE_J est un nombre
CADENCE_J vaut 20
CADENCE_E est un nombre
CADENCE_E vaut 30
COUT_REP est un nombre
COUT_REP vaut 130
COUT_BOUCLIER est un nombre
COUT_BOUCLIER vaut 150
@ État
ecran est une toile
dimension(ecran, 480, 500)
pvJ, pvJMax, pvE, pvEMax est un nombre
bouclierJ est un nombre
degatJ, degatE, niveau, niveauE, pieces, vague, gainTir est un nombre
tirJ, tirE, entree, etat, tics est un nombre
obusJX, obusJAct, obusEX, obusEAct est un nombre
xEnnemi, secousseJ, secousseE est un nombre
amelTraite, repTraite, bouclierTraite, resetTraite est un nombre
proI, proC est un nombre
amelDemande, repDemande, bouclierDemande, resetDemande est un nombre
enJeu est un booleen
action, ptX, ptY est un nombre
exploEAct, exploEX, exploEY, exploRayon est un nombre
cBandana, cKnot est un texte
amelDemande vaut 0
repDemande vaut 0
bouclierDemande vaut 0
resetDemande vaut 0
amelTraite vaut 0
repTraite vaut 0
bouclierTraite vaut 0
resetTraite vaut 0
enJeu vaut vrai
@ Coûts et forces
fonction coutAmelioration()
retourne 140 + 70 * niveau * niveau
fin fonction
fonction pvEnnemiVague(v)
retourne 48 + 18 * v
fin fonction
fonction degatEnnemiVague(v)
retourne 4 + 12 * v / 10
fin fonction
@ Partie
procédure nouvelEnnemi()
niveauE vaut vague - 1
pvEMax vaut pvEnnemiVague(vague)
pvE vaut pvEMax
degatE vaut degatEnnemiVague(vague)
xEnnemi vaut 560
entree vaut 1
tirE vaut 0
obusEAct vaut 0
fin procédure
procédure nouvellePartie()
niveau vaut 0
degatJ vaut 12
pvJMax vaut 100
pvJ vaut 100
bouclierJ vaut 0
pieces vaut 0
vague vaut 1
tirJ vaut 0
obusJAct vaut 0
secousseJ vaut 0
secousseE vaut 0
etat vaut 0
exploEAct vaut 0
appelle nouvelEnnemi()
fin procédure
@ Dessin
procédure dessinerTank(g, tx, sens, teinte, teinteClaire, teinteSombre, casque)
contour(g, #1A1A1A, 4)
rectangle_arrondi(g, tx - 58, SOL - 34, 116, 34, 17, teinteSombre)
contour(g, #0)
cercle(g, tx - 34, SOL - 17, 11, teinteClaire)
cercle(g, tx, SOL - 17, 11, teinteClaire)
cercle(g, tx + 34, SOL - 17, 11, teinteClaire)
cercle(g, tx - 34, SOL - 17, 5, #1A1A1A)
cercle(g, tx, SOL - 17, 5, #1A1A1A)
cercle(g, tx + 34, SOL - 17, 5, #1A1A1A)
contour(g, #1A1A1A, 4)
rectangle_arrondi(g, tx - 50, SOL - 58, 100, 26, 8, teinte)
rectangle_arrondi(g, tx - 26, SOL - 82, 54, 26, 8, teinteClaire)
si sens = 1 alors
rectangle_arrondi(g, tx + 24, SOL - 76, 62, 12, 5, teinte)
sinon
rectangle_arrondi(g, tx - 86, SOL - 76, 62, 12, 5, teinte)
fin si
// Tête du pilote
cercle(g, tx, SOL - 90, 15, #F2C8A0)
contour(g, #0)
// Yeux orientés vers l'adversaire
rectangle(g, tx + sens * 4 - 2, SOL - 95, 4, 8, #2A2A2A)
rectangle(g, tx + sens * 10 - 2, SOL - 95, 4, 8, #2A2A2A)
// Définition de la couleur du bandana
cBandana vaut "#3A7ACC"
cKnot vaut "#1E4D8C"
si casque = 2 alors
cBandana vaut "#E53935"
cKnot vaut "#B71C1C"
fin si
si casque = 1 ou casque = 2 alors
contour(g, #1A1A1A, 3)
// Bande principale
rectangle_arrondi(g, tx - 14, SOL - 102, 28, 7, 3, cBandana)
// Nœud à l'arrière
rectangle_arrondi(g, sialors(sens = 1, tx - 22, tx + 12), SOL - 100, 10, 8, 2, cKnot)
// Ruban pendant à l'arrière
rectangle_arrondi(g, sialors(sens = 1, tx - 24, tx + 14), SOL - 94, 8, 12, 2, cBandana)
contour(g, #0)
fin si
fin procédure
procédure barreDeVie(g, bx, val, maxi, teinte)
contour(g, #1A1A1A, 4)
rectangle_arrondi(g, bx, 220, 180, 22, 11, #2A2A2A)
contour(g, #0)
si val > 0 alors
rectangle_arrondi(g, bx + 3, 223, limiter(174 * val / maxi, 4, 174), 16, 8, teinte)
fin si
fin procédure
procédure bouton(g, bx, titre, prix, teinte, possible)
contour(g, #1A1A1A, 4)
si possible = 1 alors
rectangle_arrondi(g, bx, 418, 145, 68, 14, teinte)
sinon
rectangle_arrondi(g, bx, 418, 145, 68, 14, #8A8A8A)
fin si
contour(g, #0)
label(g, bx + 16, 448, titre, #FFFFFF, 16)
cercle(g, bx + 42, 468, 11, #F2B01E)
cercle(g, bx + 42, 468, 7, #FFD96B)
label(g, bx + 60, 476, convertir_texte(prix), #FFFFFF, 18)
fin procédure
procédure dessinerTout()
effacer(ecran)
// ----- ciel -----
pour proI de 0 à 6
rectangle(ecran, 0, proI * 44, 480, 44, rgb(110 + proI * 5, 184 + proI * 4, 232 + proI * 2))
fin pour
cercle(ecran, 396, 80, 40, #FFE066)
cercle(ecran, 396, 80, 33, #FFD11A)
cercle(ecran, 72, 86, 26, #FFFFFF)
cercle(ecran, 106, 78, 32, #FFFFFF)
cercle(ecran, 140, 88, 22, #FFFFFF)
rectangle(ecran, 70, 86, 70, 22, #FFFFFF)
cercle(ecran, 250, 150, 20, #FFFFFF)
cercle(ecran, 278, 144, 26, #FFFFFF)
cercle(ecran, 306, 152, 17, #FFFFFF)
rectangle(ecran, 248, 150, 58, 18, #FFFFFF)
// ----- collines et sol -----
rectangle(ecran, 0, 286, 480, 36, #8FBF6A)
cercle(ecran, 56, 344, 102, #8FBF6A)
cercle(ecran, 204, 350, 120, #8FBF6A)
cercle(ecran, 372, 342, 106, #8FBF6A)
rectangle(ecran, 0, 312, 480, 188, #D9B879)
rectangle(ecran, 0, 312, 480, 6, #C2A066)
rectangle(ecran, 0, 386, 480, 6, #C2A066)
pour proI de 0 à 6
cercle(ecran, 32 + proI * 76, 402, 13, #7FAF57)
cercle(ecran, 48 + proI * 76, 405, 10, #7FAF57)
fin pour
// ----- barres de vie -----
appelle barreDeVie(ecran, 24, pvJ, pvJMax, #57C94A)
appelle barreDeVie(ecran, 276, pvE, pvEMax, #E85555)
// ----- explosion mort ennemie -----
si exploEAct = 1 alors
cercle(ecran, exploEX, exploEY, exploRayon, rgba(255, 100, 0, 0.7))
cercle(ecran, exploEX, exploEY, exploRayon * 0.6, rgba(255, 200, 0, 0.8))
fin si
// ----- les deux tanks -----
appelle dessinerTank(ecran, X_JOUEUR + secousseJ, 1, #B8B061, #DED89A, #8A8347, 1)
appelle dessinerTank(ecran, xEnnemi + secousseE, -1, #D14545, #E87878, #A22F2F, 2)
// ----- bouclier joueur -----
si bouclierJ > 0 alors
cercle(ecran, X_JOUEUR + secousseJ, SOL - 50, 80, rgba(155, 89, 182, 0.3))
contour(ecran, #9B59B6, 4)
cercle(ecran, X_JOUEUR + secousseJ, SOL - 50, 80, rgba(155, 89, 182, 0))
contour(ecran, #0)
label(ecran, X_JOUEUR + secousseJ - 12, SOL - 145, convertir_texte(bouclierJ), #9B59B6, 20)
fin si
// ----- les obus -----
si obusJAct = 1 alors
cercle(ecran, obusJX, SOL - 70, 6, #4A4A4A)
cercle(ecran, obusJX - 10, SOL - 70, 4, #C8C8C8)
fin si
si obusEAct = 1 alors
cercle(ecran, obusEX, SOL - 70, 6, #4A4A4A)
cercle(ecran, obusEX + 10, SOL - 70, 4, #C8C8C8)
fin si
// ----- bandeau du haut -----
contour(ecran, #1A1A1A, 4)
rectangle_arrondi(ecran, 150, 12, 180, 42, 14, #FFFFFF)
contour(ecran, #0)
cercle(ecran, 186, 33, 13, #F2B01E)
cercle(ecran, 186, 33, 8, #FFD96B)
label(ecran, 208, 42, convertir_texte(pieces), #3A3A3A, 24)
label(ecran, 24, 186, "VAGUE " + convertir_texte(vague), #2A4A6A, 20)
// Niveau d'amélioration et dégâts du joueur (à gauche)
label(ecran, 24, 208, "Niveau " + convertir_texte(niveau) + " Dégât " + convertir_texte(degatJ), #3A6A8A, 13)
// Niveau d'amélioration et dégâts de l'ennemi (à droite)
label(ecran, 290, 208, "Niveau " + convertir_texte(niveauE) + " Dégât " + convertir_texte(degatE), #8A3A3A, 13)
// ----- les trois boutons -----
appelle bouton(ecran, 10, "AMÉLIORER", coutAmelioration(), #6A6A6A, sialors(pieces >= coutAmelioration(), 1, 0))
appelle bouton(ecran, 165, "RÉPARER", COUT_REP, #3A7ACC, sialors(pieces >= COUT_REP et pvJ < pvJMax, 1, 0))
appelle bouton(ecran, 320, "BOUCLIER", COUT_BOUCLIER, #9B59B6, sialors(pieces >= COUT_BOUCLIER, 1, 0))
si etat = 1 alors
contour(ecran, #1A1A1A, 4)
rectangle_arrondi(ecran, 60, 232, 360, 116, 16, #FFFFFF)
contour(ecran, #0)
label(ecran, 138, 275.8, "TANK DÉTRUIT", #D14545, 28)
label(ecran, 150.88, 308.37, "Vague " + convertir_texte(vague) + " - Niveau " + convertir_texte(niveau), #3A3A3A, 18)
label(ecran, 172.56, 332.72, "'n' pour recommencer", #7A7A7A, 14)
fin si
affiche ecran
fin procédure
@ Moteur (processus parallèle)
processus MoteurJeu()
tant que enJeu
tics vaut tics + 1
si secousseJ <> 0 alors
secousseJ vaut 0
fin si
si secousseE <> 0 alors
secousseE vaut 0
fin si
// ---------- animation explosion ----------
si exploEAct = 1 alors
exploRayon vaut exploRayon + 6
si exploRayon > 70 alors
exploEAct vaut 0
fin si
fin si
// ---------- demandes du joueur ----------
si resetTraite < resetDemande alors
resetTraite vaut resetTraite + 1
appelle nouvellePartie()
fin si
si amelTraite < amelDemande alors
amelTraite vaut amelTraite + 1
si etat = 0 et pieces >= coutAmelioration() alors
pieces vaut pieces - coutAmelioration()
niveau vaut niveau + 1
degatJ vaut 12 + 9 * niveau
pvJMax vaut 100 + 26 * niveau
pvJ vaut limiter(pvJ + 26, 0, pvJMax)
fin si
fin si
si repTraite < repDemande alors
repTraite vaut repTraite + 1
si etat = 0 et pieces >= COUT_REP et pvJ < pvJMax alors
pieces vaut pieces - COUT_REP
pvJ vaut limiter(pvJ + 55, 0, pvJMax)
fin si
fin si
si bouclierTraite < bouclierDemande alors
bouclierTraite vaut bouclierTraite + 1
si etat = 0 et pieces >= COUT_BOUCLIER alors
pieces vaut pieces - COUT_BOUCLIER
bouclierJ vaut bouclierJ + 80
fin si
fin si
si etat = 0 alors
// ---------- arrivée de l'ennemi ----------
si entree = 1 alors
xEnnemi vaut xEnnemi - 8
si xEnnemi <= X_ENNEMI alors
xEnnemi vaut X_ENNEMI
entree vaut 0
fin si
sinon
// ---------- tirs ----------
tirJ vaut tirJ + 1
si tirJ >= CADENCE_J et obusJAct = 0 alors
tirJ vaut 0
obusJAct vaut 1
obusJX vaut X_JOUEUR + 90
secousseJ vaut - 5
fin si
tirE vaut tirE + 1
si tirE >= CADENCE_E et obusEAct = 0 alors
tirE vaut 0
obusEAct vaut 1
obusEX vaut xEnnemi - 90
secousseE vaut 5
fin si
fin si
// ---------- vol des obus ----------
si obusJAct = 1 alors
obusJX vaut obusJX + 22
si obusJX >= xEnnemi - 40 alors
obusJAct vaut 0
pvE vaut pvE - degatJ
// Gain immédiat de pièces à chaque impact
gainTir vaut 15 + 5 * vague
pieces vaut pieces + gainTir
secousseE vaut 7
si pvE <= 0 alors
pvE vaut 0
// Prime bonus à la destruction
pieces vaut pieces + 50 + 20 * vague
vague vaut vague + 1
exploEAct vaut 1
exploEX vaut xEnnemi
exploEY vaut SOL - 40
exploRayon vaut 10
appelle nouvelEnnemi()
fin si
fin si
fin si
si obusEAct = 1 alors
obusEX vaut obusEX - 22
si obusEX <= X_JOUEUR + 40 alors
obusEAct vaut 0
si bouclierJ > 0 alors
si bouclierJ >= degatE alors
bouclierJ vaut bouclierJ - degatE
sinon
pvJ vaut pvJ - (degatE - bouclierJ)
bouclierJ vaut 0
fin si
sinon
pvJ vaut pvJ - degatE
fin si
secousseJ vaut - 7
si pvJ <= 0 alors
pvJ vaut 0
etat vaut 1
fin si
fin si
fin si
fin si
appelle dessinerTout()
pause 60
fin tant que
fin processus
@ Programme principal
appelle nouvellePartie()
appelle dessinerTout()
MoteurJeu()
tant que enJeu
interagir ecran, ["u", "r", "b", "n", "p"] dans action, ptX, ptY
si non enJeu alors
arrête
fin si
si action = 0 alors
si clique(ptX, ptY, 10, 418, 145, 68) alors
amelDemande vaut amelDemande + 1
sinon si clique(ptX, ptY, 165, 418, 145, 68) alors
repDemande vaut repDemande + 1
sinon si clique(ptX, ptY, 320, 418, 145, 68) alors
bouclierDemande vaut bouclierDemande + 1
fin si
sinon si action = 1 alors
amelDemande vaut amelDemande + 1
sinon si action = 2 alors
repDemande vaut repDemande + 1
sinon si action = 3 alors
bouclierDemande vaut bouclierDemande + 1
sinon si action = 4 alors
resetDemande vaut resetDemande + 1
sinon si action = 5 alors
enJeu vaut faux
arrête
fin si
fin tant que
affiche "Partie terminée - vague " + convertir_texte(vague) + " - niveau " + convertir_texte(niveau)