Console
Clique sur « Exécuter » pour lancer le programme.
Code CoddyRun
@ CONFIGURATION
ecran est une toile
LARG_E est un nombre
LARG_E vaut 720
HAUT_E est un nombre
HAUT_E vaut 520
dimension(ecran, LARG_E, HAUT_E)
// duree (en secondes) du vol de chaque donnee dans la simulation
DUREE_VOL est un nombre
DUREE_VOL vaut 2.6
NOM_DONNEE est un tableau
NOM_DONNEE vaut ["Mots de passe enregistrés", "Photos personnelles", "Carnet de contacts", "Touches tapées au clavier"]
CONSEILS est un tableau
CONSEILS vaut ["Télécharge seulement sur les sites officiels et les boutiques d'applications.", "Méfie-toi des cadeaux trop beaux : jeu payant gratuit, triche, logiciel piraté.", "Lis la fenêtre d'installation : éditeur inconnu ou accès étrange, on refuse.", "Garde ton système et ton antivirus à jour : ils reconnaissent ces pièges.", "N'ouvre pas les pièces jointes inattendues, même venant d'un ami.", "En cas de doute, demande à un adulte ou à une personne qui s'y connaît."]
TITRE_ETAPE est un tableau
TITRE_ETAPE vaut ["La légende", "1. L'appât", "2. L'installation", "3. Le déguisement", "4. Le bilan", "5. Se protéger", "Bien joué !"]
@ LA DEMONSTRATION
// etape : 0 legende, 1 appat, 2 installation, 3 deguisement, 4 bilan,
// 5 se proteger, 6 l'installation a ete refusee
etape est un nombre
etape vaut 0
appActif est un booléen
appActif vaut vrai
debutEtape, tic est un nombre
aRefuse est un booléen
// la souris
sourisXC, sourisYC est un nombre
appuye, etaitAppuye, clicSouris, vuAppuye est un booléen
@ OUTILS
procédure centrer(txt, xMil, ty, coul, tp)
label(ecran, xMil - label_largeur(txt, tp) / 2, ty, txt, coul, tp)
fin procédure
procédure bouton(x, y, lb, hb, txt, fond, coulTxt, tp)
rectangle_arrondi(ecran, x, y + 3, lb, hb, 10, rgba(0, 0, 0, 0.25))
rectangle_arrondi(ecran, x, y, lb, hb, 10, fond)
appelle centrer(txt, x + lb / 2, y + hb / 2 + tp * 0.38, coulTxt, tp)
fin procédure
procédure allerA(num)
etape vaut num
debutEtape vaut chrono()
fin procédure
// le temps passe dans l'etape, en secondes
fonction tempsEtape()
retourne (chrono() - debutEtape) / 1000
fin fonction
// un point d'exclamation dans un triangle
procédure panneauDanger(cx, cy, s)
polygone(ecran, cx, cy - s, cx + s, cy + s * 0.8, cx - s, cy + s * 0.8, #F59E0B)
rectangle(ecran, cx - s * 0.09, cy - s * 0.4, s * 0.18, s * 0.7, #1F2937)
rectangle(ecran, cx - s * 0.09, cy + s * 0.42, s * 0.18, s * 0.18, #1F2937)
fin procédure
@ LES DESSINS
// le cheval de bois de la legende ; ouvert = la trappe laisse voir les soldats
procédure dessinerCheval(x, y, ouvert)
k est un nombre
// les roues et le chariot
rectangle(ecran, x - 10, y + 150, 250, 12, #5B3A1A)
cercle(ecran, x + 30, y + 168, 18, #3F2A14)
cercle(ecran, x + 30, y + 168, 7, #A16207)
cercle(ecran, x + 200, y + 168, 18, #3F2A14)
cercle(ecran, x + 200, y + 168, 7, #A16207)
// les pattes
rectangle(ecran, x + 22, y + 90, 20, 62, #8B5A2B)
rectangle(ecran, x + 60, y + 90, 20, 62, #7A4A1E)
rectangle(ecran, x + 150, y + 90, 20, 62, #8B5A2B)
rectangle(ecran, x + 188, y + 90, 20, 62, #7A4A1E)
// le corps en planches
rectangle_arrondi(ecran, x + 10, y + 30, 210, 72, 22, #A9713A)
pour k de 1 à 6
rectangle(ecran, x + 10 + k * 30, y + 32, 2, 68, #7A4A1E)
fin pour
// le cou et la tete
polygone(ecran, x + 170, y + 40, x + 220, y + 50, x + 262, y - 40, x + 218, y - 50, #A9713A)
polygone(ecran, x + 214, y - 54, x + 268, y - 44, x + 300, y - 6, x + 282, y + 6, x + 236, y - 14, #8B5A2B)
polygone(ecran, x + 222, y - 52, x + 236, y - 80, x + 244, y - 48, #7A4A1E)
cercle(ecran, x + 258, y - 34, 4, #1F2937)
// la queue
polygone(ecran, x + 12, y + 44, x - 26, y + 96, x - 10, y + 100, x + 18, y + 62, #5B3A1A)
// la trappe
si ouvert alors
rectangle_arrondi(ecran, x + 74, y + 44, 84, 44, 6, #1F2937)
pour k de 0 à 2
cercle(ecran, x + 92 + k * 24, y + 68, 9, #F2C49B)
rectangle(ecran, x + 83 + k * 24, y + 56, 18, 7, #9CA3AF)
rectangle(ecran, x + 88 + k * 24, y + 66, 3, 3, #1F2937)
rectangle(ecran, x + 94 + k * 24, y + 66, 3, 3, #1F2937)
fin pour
sinon
rectangle_arrondi(ecran, x + 74, y + 44, 84, 44, 6, #7A4A1E)
rectangle_arrondi(ecran, x + 77, y + 47, 78, 38, 5, #A9713A)
cercle(ecran, x + 148, y + 66, 3, #3F2A14)
fin si
fin procédure
// une fenetre d'ordinateur avec sa barre de titre
procédure fenetre(x, y, lb, hb, titre, coulBarre)
rectangle_arrondi(ecran, x + 4, y + 6, lb, hb, 10, rgba(0, 0, 0, 0.25))
rectangle_arrondi(ecran, x, y, lb, hb, 10, #F8FAFC)
rectangle_arrondi(ecran, x, y, lb, 30, 10, coulBarre)
rectangle(ecran, x, y + 18, lb, 12, coulBarre)
label(ecran, x + 12, y + 20, titre, #FFFFFF, 13)
cercle(ecran, x + lb - 16, y + 15, 6, #F87171)
cercle(ecran, x + lb - 36, y + 15, 6, #FBBF24)
fin procédure
// le petit jeu de course que la victime croit avoir installe
procédure dessinerFauxJeu(x, y, lb, hb)
k, route, voiture est un nombre
rectangle(ecran, x, y, lb, hb, #16A34A)
route vaut x + lb / 2 - 70
rectangle(ecran, route, y, 140, hb, #374151)
rectangle(ecran, route, y, 5, hb, #F8FAFC)
rectangle(ecran, route + 135, y, 5, hb, #F8FAFC)
pour k de 0 à 5
rectangle(ecran, route + 67, y + (k * 44 + tic * 6) mod arrondi(hb - 20), 6, 22, #FDE047)
fin pour
voiture vaut route + 52 + 30 * sinus(tic * 0.07)
rectangle_arrondi(ecran, voiture, y + hb - 78, 36, 60, 8, #DC2626)
rectangle_arrondi(ecran, voiture + 5, y + hb - 66, 26, 16, 4, #BFDBFE)
rectangle(ecran, voiture - 4, y + hb - 70, 6, 14, #111827)
rectangle(ecran, voiture + 34, y + hb - 70, 6, 14, #111827)
rectangle(ecran, voiture - 4, y + hb - 36, 6, 14, #111827)
rectangle(ecran, voiture + 34, y + hb - 36, 6, 14, #111827)
rectangle_arrondi(ecran, x + 8, y + 8, 120, 26, 8, rgba(0, 0, 0, 0.55))
label(ecran, x + 16, y + 26, "Score : " + convertir_texte(tic * 3), #FFFFFF, 13)
fin procédure
procédure bandeau()
k, courante est un nombre
courante vaut etape
si etape = 6 alors
courante vaut 2
fin si
rectangle(ecran, 0, 0, LARG_E, 44, #0F172A)
label(ecran, 16, 28, TITRE_ETAPE[etape], #FDE68A, 18)
rectangle_arrondi(ecran, 548, 10, 160, 24, 12, #B91C1C)
appelle centrer("SIMULATION", 628, 27, #FFFFFF, 12)
// les pastilles des 5 etapes
pour k de 1 à 5
si k = courante alors
cercle(ecran, 300 + k * 30, 22, 8, #FDE68A)
sinon si k < courante alors
cercle(ecran, 300 + k * 30, 22, 6, #64748B)
sinon
cercle(ecran, 300 + k * 30, 22, 6, #334155)
fin si
fin pour
fin procédure
@ LES ETAPES
procédure ecranLegende()
remplir(ecran, #FDF6E3)
rectangle(ecran, 0, 330, LARG_E, 190, #E7D3A8)
si tic mod 120 > 60 alors
appelle dessinerCheval(60, 190, vrai)
sinon
appelle dessinerCheval(60, 190, faux)
fin si
label(ecran, 400, 96, "Il y a 3 000 ans, dit la légende,", #3F2A14, 16)
label(ecran, 400, 120, "les Grecs n'arrivaient pas à entrer", #3F2A14, 16)
label(ecran, 400, 144, "dans la ville de Troie.", #3F2A14, 16)
label(ecran, 400, 180, "Ils ont alors offert un grand", #3F2A14, 16)
label(ecran, 400, 204, "cheval de bois, comme un cadeau.", #3F2A14, 16)
label(ecran, 400, 240, "Les Troyens l'ont fait entrer", #3F2A14, 16)
label(ecran, 400, 264, "eux-mêmes dans leur ville...", #3F2A14, 16)
label(ecran, 400, 300, "Des soldats étaient cachés dedans !", #B91C1C, 16)
label(ecran, 60, 420, "En informatique, un « cheval de Troie » fonctionne pareil :", #3F2A14, 15)
label(ecran, 60, 444, "un programme qui a l'air d'un cadeau, et que l'on installe soi-même.", #3F2A14, 15)
appelle bouton(250, 462, 220, 44, "Commencer la démo", #B45309, #FFFFFF, 16)
fin procédure
procédure ecranAppat()
remplir(ecran, #CBD5E1)
appelle fenetre(40, 60, 640, 380, "Navigateur - jeux-gratuits-top.exemple", #475569)
rectangle(ecran, 40, 90, 640, 26, #E2E8F0)
rectangle_arrondi(ecran, 56, 94, 420, 18, 9, #FFFFFF)
label(ecran, 66, 108, "http://jeux-gratuits-top.exemple/mega-kart", #64748B, 11)
rectangle_arrondi(ecran, 64, 130, 200, 150, 10, #16A34A)
appelle dessinerFauxJeu(74, 138, 180, 134)
label(ecran, 284, 156, "MEGA KART TURBO", #1E293B, 24)
label(ecran, 284, 182, "Le jeu payant que tout le monde veut...", #475569, 14)
label(ecran, 284, 204, "ici 100 % GRATUIT, sans inscription !", #DC2626, 15)
label(ecran, 284, 232, "Déjà 2 000 000 de téléchargements", #475569, 12)
appelle bouton(284, 246, 250, 44, "Télécharger gratuitement", #16A34A, #FFFFFF, 15)
// les indices
appelle panneauDanger(84, 328, 12)
label(ecran, 106, 334, "Indice 1 : un jeu payant offert par un site inconnu.", #92400E, 13)
appelle panneauDanger(84, 362, 12)
label(ecran, 106, 368, "Indice 2 : l'adresse n'est pas celle du vrai éditeur du jeu.", #92400E, 13)
appelle panneauDanger(84, 396, 12)
label(ecran, 106, 402, "Indice 3 : des promesses trop belles pour être vraies.", #92400E, 13)
appelle centrer("L'appât donne envie de cliquer. Clique sur « Télécharger » pour voir la suite.", 360, 480, #1E293B, 14)
fin procédure
procédure ecranInstallation()
remplir(ecran, #CBD5E1)
appelle fenetre(130, 80, 460, 300, "Installation de mega_kart_turbo.exe", #475569)
appelle panneauDanger(176, 160, 22)
label(ecran, 214, 150, "Voulez-vous autoriser ce programme", #1E293B, 15)
label(ecran, 214, 172, "à modifier votre ordinateur ?", #1E293B, 15)
label(ecran, 160, 218, "Nom : mega_kart_turbo.exe", #475569, 13)
label(ecran, 160, 240, "Éditeur : INCONNU", #DC2626, 13)
label(ecran, 160, 262, "Origine : téléchargé sur Internet", #475569, 13)
label(ecran, 160, 284, "Demande : accès à tous vos fichiers", #DC2626, 13)
appelle bouton(160, 316, 180, 44, "Installer", #DC2626, #FFFFFF, 16)
appelle bouton(380, 316, 180, 44, "Refuser", #16A34A, #FFFFFF, 16)
appelle centrer("C'est ici que tout se joue : le cheval de Troie ne peut rien faire", 360, 430, #1E293B, 14)
appelle centrer("tant que la personne ne l'a pas installé elle-même. Que choisis-tu ?", 360, 452, #1E293B, 14)
fin procédure
procédure ecranRefus()
remplir(ecran, #DCFCE7)
cercle(ecran, 360, 130, 46, #16A34A)
ligne(ecran, 338, 132, 354, 150, #FFFFFF, 8)
ligne(ecran, 354, 150, 386, 112, #FFFFFF, 8)
appelle centrer("Tu as refusé : le cheval reste dehors !", 360, 216, #14532D, 22)
appelle centrer("Un cheval de Troie ne force pas la porte : il a besoin qu'on lui ouvre.", 360, 256, #166534, 14)
appelle centrer("En refusant un programme d'origine inconnue, tu ne lui laisses aucune chance.", 360, 280, #166534, 14)
appelle centrer("Les bons réflexes : éditeur inconnu, accès à tous les fichiers, site douteux...", 360, 304, #166534, 14)
appelle bouton(120, 370, 280, 46, "Voir ce qui se serait passé", #B45309, #FFFFFF, 15)
appelle bouton(420, 370, 180, 46, "Se protéger", #15803D, #FFFFFF, 15)
fin procédure
procédure ecranDeguisement()
k, t, part, y, fait, x est un nombre
t vaut tempsEtape()
remplir(ecran, #1E293B)
// a gauche : ce que la personne voit
appelle centrer("Ce que tu vois", 180, 70, #86EFAC, 16)
appelle fenetre(30, 82, 300, 300, "Mega Kart Turbo", #16A34A)
appelle dessinerFauxJeu(30, 112, 300, 270)
appelle centrer("Le jeu marche : aucun soupçon.", 180, 406, #CBD5E1, 13)
// a droite : ce qui se passe en cachette
appelle centrer("Ce qui se passe en cachette", 530, 70, #FCA5A5, 16)
rectangle_arrondi(ecran, 370, 82, 320, 300, 10, #020617)
label(ecran, 384, 106, "> programme caché démarré...", #4ADE80, 12)
fait vaut 0
pour k de 0 à 3
y vaut 122 + k * 50
part vaut limiter((t - 1 - k * DUREE_VOL) / DUREE_VOL, 0, 1)
si part > 0 alors
label(ecran, 384, y + 14, NOM_DONNEE[k], #E2E8F0, 13)
rectangle_arrondi(ecran, 384, y + 22, 220, 10, 5, #334155)
rectangle_arrondi(ecran, 384, y + 22, maximum(10, 220 * part), 10, 5, #EF4444)
si part >= 1 alors
label(ecran, 614, y + 32, "copié", #F87171, 12)
fait vaut fait + 1
sinon
label(ecran, 614, y + 32, convertir_texte(arrondi(part * 100)) + " %", #FCA5A5, 12)
// les paquets qui partent vers le serveur du pirate
pour x de 0 à 2
rectangle(ecran, 400 + (tic * 9 + x * 80) mod 240, 340 + 6 * sinus(tic * 0.4 + x), 10, 7, #F87171)
fin pour
fin si
fin si
fin pour
// le serveur du pirate
rectangle_arrondi(ecran, 640, 322, 40, 50, 5, #7F1D1D)
rectangle(ecran, 646, 330, 28, 5, #FCA5A5)
rectangle(ecran, 646, 340, 28, 5, #FCA5A5)
cercle(ecran, 660, 360, 4, #4ADE80)
label(ecran, 384, 366, "envoi vers le pirate", #94A3B8, 11)
si fait >= 4 alors
appelle centrer("Tout a été copié sans aucun signe visible.", 530, 406, #FCA5A5, 13)
appelle bouton(260, 446, 200, 46, "Voir le bilan", #B45309, #FFFFFF, 16)
sinon
appelle centrer("Pendant que tu joues, il fouille en silence...", 530, 406, #CBD5E1, 13)
appelle centrer("(dans cette démo, rien n'est réellement lu ni envoyé)", 360, 474, #64748B, 12)
fin si
fin procédure
procédure ecranBilan()
k est un nombre
remplir(ecran, #FEF2F2)
appelle dessinerCheval(40, 150, vrai)
label(ecran, 370, 90, "Ce que le pirate aurait obtenu :", #7F1D1D, 16)
pour k de 0 à 3
cercle(ecran, 382, 116 + k * 26, 5, #DC2626)
label(ecran, 396, 121 + k * 26, NOM_DONNEE[k], #1E293B, 14)
fin pour
label(ecran, 370, 240, "Avec ça, il peut entrer dans des", #1E293B, 14)
label(ecran, 370, 262, "comptes, se faire passer pour toi", #1E293B, 14)
label(ecran, 370, 284, "ou piéger tes contacts à leur tour.", #1E293B, 14)
rectangle_arrondi(ecran, 40, 368, 640, 78, 12, #FFFFFF)
label(ecran, 58, 394, "À retenir : un cheval de Troie n'est pas un virus qui se propage tout seul.", #7F1D1D, 14)
label(ecran, 58, 416, "Il se déguise en programme utile ou amusant, et c'est la personne qui", #1E293B, 14)
label(ecran, 58, 436, "l'installe elle-même, comme les Troyens ont fait entrer le cheval.", #1E293B, 14)
appelle bouton(250, 460, 220, 44, "Comment se protéger ?", #15803D, #FFFFFF, 15)
fin procédure
procédure ecranProtection()
k est un nombre
remplir(ecran, #ECFDF5)
// un bouclier
polygone(ecran, 80, 80, 130, 64, 180, 80, 176, 150, 130, 190, 84, 150, #15803D)
polygone(ecran, 92, 90, 130, 78, 168, 90, 165, 144, 130, 174, 95, 144, #4ADE80)
ligne(ecran, 112, 126, 126, 142, #FFFFFF, 7)
ligne(ecran, 126, 142, 152, 108, #FFFFFF, 7)
label(ecran, 210, 110, "6 réflexes pour laisser", #14532D, 22)
label(ecran, 210, 142, "le cheval dehors", #14532D, 22)
pour k de 0 à 5
cercle(ecran, 62, 228 + k * 36, 13, #15803D)
appelle centrer(convertir_texte(k + 1), 62, 233 + k * 36, #FFFFFF, 14)
label(ecran, 86, 233 + k * 36, CONSEILS[k], #1E293B, 14)
fin pour
appelle bouton(250, 452, 220, 44, "Revoir la démo", #B45309, #FFFFFF, 15)
fin procédure
procédure dessiner()
effacer(ecran)
contour(ecran, #0)
si etape = 0 alors
appelle ecranLegende()
sinon si etape = 1 alors
appelle ecranAppat()
sinon si etape = 2 alors
appelle ecranInstallation()
sinon si etape = 3 alors
appelle ecranDeguisement()
sinon si etape = 4 alors
appelle ecranBilan()
sinon si etape = 5 alors
appelle ecranProtection()
sinon
appelle ecranRefus()
fin si
appelle bandeau()
fin procédure
@ LES COMMANDES
procédure cliquerA(x, y)
si etape = 0 alors
si clique(x, y, 250, 462, 220, 44) alors
aRefuse vaut faux
appelle allerA(1)
fin si
sinon si etape = 1 alors
si clique(x, y, 284, 246, 250, 44) alors
appelle allerA(2)
fin si
sinon si etape = 2 alors
si clique(x, y, 160, 316, 180, 44) alors
appelle allerA(3)
sinon si clique(x, y, 380, 316, 180, 44) alors
aRefuse vaut vrai
appelle allerA(6)
fin si
sinon si etape = 3 alors
si tempsEtape() >= 1 + 4 * DUREE_VOL alors
si clique(x, y, 260, 446, 200, 46) alors
appelle allerA(4)
fin si
fin si
sinon si etape = 4 alors
si clique(x, y, 250, 460, 220, 44) alors
appelle allerA(5)
fin si
sinon si etape = 5 alors
si clique(x, y, 250, 452, 220, 44) alors
appelle allerA(0)
fin si
sinon
si clique(x, y, 120, 370, 280, 46) alors
appelle allerA(3)
sinon si clique(x, y, 420, 370, 180, 46) alors
appelle allerA(5)
fin si
fin si
fin procédure
procédure tourDeDemo()
debut est un booléen
tic vaut tic + 1
sourisXC vaut souris_x(ecran)
sourisYC vaut souris_y(ecran)
appuye vaut souris_appuyée(ecran)
clicSouris vaut souris_clic(ecran)
debut vaut faux
si appuye alors
vuAppuye vaut vrai
si non etaitAppuye alors
debut vaut vrai
fin si
fin si
si clicSouris et non vuAppuye alors
debut vaut vrai
fin si
etaitAppuye vaut appuye
si debut alors
appelle cliquerA(sourisXC, sourisYC)
fin si
si touche_pressée('x') ou touche_pressée('échap') alors
appActif vaut faux
fin si
fin procédure
@ DEMARRAGE
debutEtape vaut chrono()
tant que appActif
appelle tourDeDemo()
appelle dessiner()
affiche ecran
pause 40
fin tant que
effacer(ecran)
remplir(ecran, #0F172A)
appelle centrer("Un doute sur un programme ? On ne l'installe pas.", LARG_E / 2, HAUT_E / 2, #FDE68A, 20)
affiche ecran