Archives de
Author: Pierre Jourlin

Je suis enseignant-chercheur en informatique. Ma discipline principale de recherche est le traitement automatique des langues, un sous-domaine de "l'intelligence" artificielle. Ma thèse de doctorat a porté sur la reconnaissance automatique de la parole et du locuteur à partir de la voix et du mouvement des lèvres, dans le cadre d'un contrat d'allocataire-moniteur à l'Université d'Avignon de 1994 à 1997. En 1996, j'ai travaillé en collaboration avec l'IDIAP (Suisse), dans le cadre du projet européen M2VTS et sur le sujet de la vérification automatique d'identité. J'ai ensuite été recruté comme chercheur à l'Université de Cambridge (Angleterre) de 1997 à 2000, sur un projet de recherche documentaire multimédia. Depuis 2000, je suis maître de conférences en informatique à l'Université d'Avignon et des Pays de Vaucluse. Ma recherche actuelle porte sur le développement de méthodes de fouille de texte pour l'analyse de grandes bases de données textuelles en langage naturel. J'ai travaillé sur des collections d'articles scientifiques, des documents issus d'une exploration du web, des réseaux sociaux, des microblogs. J'enseigne les fondements de l'informatique, la structure des ordinateurs, les bases de la programmation, l'assembleur, la compilation, les bases de données, la programmation web, l'analyse du web, les usages et évaluation des modèles prédictifs , l'éthique, explicabilité et interprétabilité en intelligence artificielle à des étudiants de licence et master informatique, de B.U.T. "Statistiques et Traitement Informatique des Données", de licence humanités, de master "gouvernance des données".
Mieux vaut un coupable en liberté ? L’éthique derrière le paramètre Beta

Mieux vaut un coupable en liberté ? L’éthique derrière le paramètre Beta

Imaginez ce scénario : vous participez à une course de 10 km.

  • Vous parcourez les 5 premiers kilomètres à une allure de 12 km/h.
  • Épuisé, vous traînez sur les 5 derniers kilomètres à seulement 8 km/h.

Quelle a été votre vitesse moyenne sur l’ensemble de la course ? L’instinct nous souffle immédiatement 10 km/h ((12+8)/2). Et pourtant… c’est faux.

Le piège de la moyenne classique

Si l’on calcule le temps réellement passé sur le bitume :

  1. Les 5 premiers km prennent 25 minutes.
  2. Les 5 derniers km prennent 37,5 minutes.
  3. Temps total = 62,5 minutes.

Votre vitesse réelle est de 9,6 km/h. Pourquoi ? Parce que vous avez passé beaucoup plus de temps à subir vos 8 km/h qu’à profiter de vos 12 km/h. La moyenne arithmétique classique ignore cette réalité temporelle. Pour obtenir le vrai résultat, il faut utiliser la moyenne harmonique.


L’héritage de van Rijsbergen : Quand le F1 entre en scène

En science des données, nous utilisons cette même logique pour évaluer nos modèles via le Score F1. Cette métrique a été popularisée par Cornelis Joost « Keith » van Rijsbergen, un pionnier de la recherche d’information, dans les années 70.

La précision répond à la question : « Parmi tous ceux que le modèle a déclarés positifs, combien le sont réellement ? » et le rappel à la question « Parmi tous ceux qui sont réellement positifs, combien le modèle a-t-il réussi à en capturer ? ». Les deux mesures sont des ratios, des pourcentages.

Keith cherchait une « fonction d’efficacité » capable de combiner la Précision (P) et le Rappel (R). C’est ainsi qu’est née la famille des mesures F, où le chiffre « 1 » signifie que l’on accorde une importance strictement égale aux deux piliers.

F1=2×P×RP+RF_1 = 2 \times \frac{P \times R}{P + R}

Tout comme pour votre course à pied, le Score F1 est « pessimiste » : il est tiré vers le bas par la valeur la plus faible. Si votre modèle a une excellente précision mais un rappel catastrophique, le F1 s’effondrera pour vous avertir que quelque chose ne va pas.


Au-delà du F1 : La puissance du paramètre Beta (β)

Le score F1 est un excellent compromis, mais dans la vraie vie, toutes les erreurs n’ont pas le même poids. C’est là que la formule de van Rijsbergen révèle tout son génie grâce au paramètre β :

Fβ=(1+β2)×P×R(β2×P)+RF_\beta = (1 + \beta²) \times \frac{P \times R}{(\beta² \times P) + R}

Le β est un curseur qui permet de pondérer l’importance du Rappel par rapport à la Précision.

Le dilemme de la Cour d’Assises : L’exemple du F0.5​

Prenons un jugement en Cour d’Assises. Deux erreurs sont possibles :

  1. Le Faux Négatif : On acquitte un coupable. Résultat : 1 coupable est en liberté.
  2. Le Faux Positif : On condamne un innocent. Résultat : 1 innocent est en prison ET le vrai coupable est toujours en liberté.

Dans notre système judiciaire, on considère qu’il vaut mieux libérer plusieurs coupables que de condamner un seul innocent. L’erreur « Faux Positif » est jugée bien plus grave.

Pour traduire cette éthique, on utilise un β=0,5. En injectant 0,5 dans la formule, on obtient le F0,5​. Le poids de la Précision devient alors prédominant : on veut être absolument certain que celui qu’on condamne est coupable, quitte à ce que le Rappel (la capacité à attraper tous les coupables) diminue.

À l’inverse, en diagnostic médical, on utilisera souvent un F2​ (β=2) : on préfère déclencher une fausse alerte (privilégier le Rappel) plutôt que de passer à côté d’une maladie grave.


Conclusion : Choisir son curseur, c’est choisir ses valeurs

Le score F1 n’est pas qu’une simple formule mathématique ; c’est le reflet de nos priorités. En abandonnant la moyenne arithmétique pour la moyenne harmonique, nous acceptons une vérité fondamentale : la performance globale d’un système est limitée par son maillon le plus faible.

Mais n’oubliez jamais : le « 1 » du F1 est un choix, pas une obligation. Que vous soyez coureur, médecin ou juge, c’est à vous de régler le paramètre Beta pour aligner votre technologie sur vos valeurs et sur les risques réels de votre mission.

Faux négatif, faux positif et effet Dunning-Kruger

Faux négatif, faux positif et effet Dunning-Kruger

Au risque de contrarier les « futurologues » qui vous conseillent de ne plus faire d’études, parce qu’il faut vivre avec son temps et avec les chatbots proposés par les giga-entreprises de l’IA générative, je pense au contraire qu’il est plus que jamais nécessaire de permettre à une plus grande proportion de la population de poursuivre des études plus longues. C’est même précisément à quoi devraient servir les gains de productivité rendus possible par des IA conçues pour servir l’humanité et non pour l’asservir.

Pourquoi avons nous plus que jamais besoin d’experts humains ?

Utiliser une intelligence artificielle comme conseiller ou comme prof est le pire usage qui soit : l’effet Dunning-Kruger, bien connu des psychologues, explique que moins on connaît un sujet, plus on a tendance à se croire compétent. Et les chatbots amplifient ce travers : leurs phrases bien tournées donnent confiance, même quand elles racontent des absurdités. Il est tellement fréquent de confondre fluidité du discours et justesse du savoir.

Les chatbots ne se contentent pas de commettre des erreurs que l’on peut corriger soi-même ou demander à de véritables experts de corriger. Toute la connaissance humaine qu’ils ont ingurgité durant leur phase d’entraînement, aussi impressionnante soit-elle, n’est pas toute la connaissance humaine. Et il est faux de dire que le RAG ou l’utilisation d’agents répondent complètement à ce problème : on peut bien sûr inclure dans un prompt des connaissances qui n’étaient pas présentes dans le jeu de données d’entraînement, mais cela n’a aucun effet sur les paramètres du modèle, c’est-à-dire sur cette pâle imitation de notre système cognitif qui catégorise, généralise, spécifie et prédit.

Nous avons tous des angles morts dans notre connaissance et dans nos aptitudes. Mais ce n’est pas en soi un problème, car nous avons cette capacité de nous associer pour combler nos lacunes. Par contre, si nous déléguons nos capacités intellectuelles à une poignée de chatbots IA qui partagent tous les mêmes angles morts, l’accident devient inévitable.

L’avenir n’appartiendra pas à ceux qui croient tout savoir grâce à l’IA, mais à ceux qui savent encore apprendre, douter, penser par eux-mêmes et avec les autres.

100% du code exécuté par vos ordinateurs est produit par une « IA »… depuis 1952 !

100% du code exécuté par vos ordinateurs est produit par une « IA »… depuis 1952 !

Depuis les années 50 (par exemple : Autocode) les conceptrices et concepteurs de langages informatiques inventent et définissent ces langages artificiels, formels, non ambigus, issus des mathématiques et d’une de ses branches : la théorie des langages. Décennies après décennies, ces langages ont évolué pour simplifier, condenser de plus en plus la description des « algorithmes », ces procédés pour traiter efficacement de l’information numérique ou symbolique. Ces progrès techniques ont permis d’augmenter considérablement la productivité de celles et ceux qui écrivent les logiciels que vous utilisez quotidiennement, y compris sur vos téléphones, vos véhicules, etc.

Ces langages sont aussi conçus pour être automatiquement « interprétables » par une machine. Par exemple, en écrivant un programme, appelé « compilateur » qui se charge de traduire automatiquement le langage « source » en langage « machine ». Le langage « machine » est en effet le seul que le processeur peut directement « exécuter », c’est à dire transformer en des séquences de divers signaux électriques envoyés aux différents circuits électroniques qui composent une unité centrale de calcul (CPU). Et ce n’est pas une « bonne vieille » méthode, qui serait aujourd’hui obsolète. Quand votre copilote, fondé sur un modèle de langue auto régressif (on dit aussi prédictif ou génératif) produit automatiquement du code source à partir de votre demande exprimée dans votre langue naturelle, c’est bien toujours du langage machine qui est décodé et exécuté en définitive par votre CPU, votre FPU, votre GPU, votre NPU1.

Or, on doit à Larry Tesler (1945-2020), le célèbre inventeur du « copier-coller », cette définition de l’intelligence artificielle citée par (Hofstadter, 2008, p. 6742) : l’IA c’est « Tout ce que les machines n’ont pas encore fait » . Suivant cette définition, le premier compilateur écrit en 1952, pouvait être à cette époque considéré comme une IA, non ?

Reste que jusqu’en 2022, avec l’arrivée du fameux Alphacode de l’entreprise DeepMind3, on n’envisageait pas vraiment de traduire automatiquement une langue naturelle en langage informatique. Car même lorsque l’on est très expérimenté, il arrive encore que l’on soit surpris par l’exécution d’un programme que l’on a écrit soit même, car le CPU fait exactement, strictement ce qu’on lui a demandé. Mais ce qu’on lui a demandé n’est pas forcément ce qu’on avait l’intention de lui demander. On s’est mal exprimé et l’on remarque un bug. Cela fait bien longtemps que les insectes ne provoquent plus de court-circuits dans les transistors qui composent nos unités centrales et on est bien obligé d’admettre que ce n’est pas la machine qui a buggé, comme on le dit abusivement, mais nous mêmes.

Le fait est que nous traduisons nos pensées dans une langue naturelle qui est complexe, riche, ambigüe, contextuelle, culturelle, implicite, etc. Même en faisant en sorte que nos énoncés soient le moins ambigus possible, il y a toujours des personnes ou des situations dans lesquelles nos propos sont « mal interprétés ». Alors s’il s’agit de s’adresser dans cette langue à un réseau de circuits électroniques…

Et pourtant, oui : il est aujourd’hui possible de passer automatiquement d’une demande exprimée en langue naturelle à un code source informatique. Et oui: dans certaines conditions, cela peut permettre de faciliter et d’accélérer encore la production de logiciels. Mais cela n’est pas sans risque4

  1. C: Central ; F: Floating Point ; G: Graphical ; N : Neural ; PU : Processing Unit ↩︎
  2. Hofstadter D.R., Gödel, Escher, Bach : les brins d’une guirlande éternelle, Paris, Dunod, 2008 (édition originale, New York, 1979). ↩︎
  3. https://arxiv.org/pdf/2203.07814 ↩︎
  4. https://cmi-2i2a.univ-avignon.fr/index.php/2024/12/12/copilot-est-il-un-bon-copilote/ ↩︎
Leurs enfants après eux

Leurs enfants après eux

Je suis allé voir cette adaptation cinématographique d’un roman à succès. Après l’échec d’une lutte collective pour maintenir une activité économique dans une région et un minimum de dignité, les individus victimes dès le départ de rapports de domination défavorables, subissent un niveau d’humiliation, de violences symboliques et physiques qui explose. Tout le monde cherche à se faire respecter, mais le plus souvent au détriment des autres et tout le monde se retrouve coincé dans ce piège mortel , suicidaire.

Beaucoup de parents comprennent que si c’est probablement trop tard pour eux, leurs enfants ont encore une chance d’y échapper. Par exemple, par les études. Il n’accumuleront probablement jamais le capital financier requis pour faire vraiment parti des dominants, mais ils pourront peut être accumuler suffisamment de capital culturel et symbolique pour être simplement respectés et pouvoir jouir d’un peu de liberté dans le futur.

Ça devrait être une raison suffisante pour soutenir, même dans des situations économiques difficiles, un accès au savoir qui soit vraiment démocratique et égalitaire. Et pourtant, les gouvernements de ce pays, depuis près de 40 ans, ont laissé l’éducation publique, de la maternelle à l’université, s’enfoncer dans le sous-financement. Avec parfois, en prime, un terrible mépris pour celles et ceux qui ont fait de la transmission du savoir, leur vocation. L’indifférence de notre société au sort de l’éducation nationale finira par coûter très cher.

Mais pour en revenir au film, très bien vu le choix de cette chanson de Bruce Springsteen au générique de fin :

Baby this town rips the bones from your back

It’s a death trap, i’ts a suicide rap

We gotta get out while you’re young

‘Cause tramps like us, baby we were born to run

« Copilot » est-il un bon copilote ?

« Copilot » est-il un bon copilote ?

Aujourd’hui, la meilleure IA pisseuse de code produit en quelques secondes des lignes qu’un étudiant moyen de niveau bac+1 ou +2 aurait produit en plusieurs heures. Avec le même niveau de « qualité ». C’est à dire que ça ne marche pas. Dans le meilleur des cas, ça marche au début, mais toute modification entraînera son lot de bugs à corriger. Par exemple, des constantes sont hardcodées un peu partout. Des variables qui auraient du être liées ne le sont pas, etc. Bref : le vers est dans le fruit, lowcost => shortlife !

Désolé petit padawan : pour chevalier Jedi devenir, sabre laser il te faudra , mais pour toi-même apprendre à ne pas blesser, beaucoup de temps et force tu auras besoin.

Un code de bien meilleure qualité peut être produit par un bon étudiant bac+3 ou +4, mais toujours en plusieurs heures. Au prix d’un travail bien moins agréable, ce bon étudiant peut décider de faire produire un 1er jet par une IA, prendre le temps de corriger soigneusement le code « prédit ». Il aura économisé quelques heures de travail, essentiellement sur la recherche des modules pertinents et sur la documentation du code.

Voilà où l’on en est.

Par ailleurs, connaissant le paradigme sur lequel est fondé le Machine Learning, il est bien plus probable que la qualité du code produit par les IA ait une tendance à se dégrader plutôt qu’à s’améliorer.

Le paradigme est le suivant : plus gros le dataset d’apprentissage, meilleure la prédiction. Cependant, Copilot, GPT ou Claude ne cherchent pas à prédire le meilleur code, mais à produire le code le plus banal. La meilleure prédiction de code est donc la prédiction du code de qualité la plus moyenne. Donc de niveau bac <+2.

Comme le % de code produit par des IA prédictives sur Github augmente de jour en jour, ces dernières vont prédire de mieux en mieux du code de qualité de plus en plus moyenne.

Conclusion : oui, l’IA prédictive et générative peut augmenter la productivité des développeuses et développeurs de bon niveau. Mais je ne suis vraiment pas convaincu qu’elle augmente aujourd’hui ou dans le futur la productivité des débutantes et débutants.

Je voudrais, sans la nommer, vous parler d’elle

Je voudrais, sans la nommer, vous parler d’elle

Les anciens égyptiens l’appelaient aha, Diophante d’Alexandrie la nommait arithmós (le nombre), Al-Khawarizmi la désignait par le mot shay’ (la chose que l’on cherche). Puis, elle a été latinisée en xay et René Descartes l’a abrégé en x.

L’inconnue, par définition, provoque des émotions contradictoires : du désir, de la peur, des fantasmes. Paradoxalement, elle est très familière dans notre langue, dans ses pronoms, ses articles indéterminés, ses anaphores. On la trouve dans nos jeux, dans nos polars. Plus elle semble inaccessible, plus on a envie de la connaitre, de la définir. Néanmoins, tout le plaisir réside dans l’exploration, dans ces petites découvertes qui dévoilent très lentement son identité. D’ailleurs, quand on y parvient, elle perd brutalement son attrait. A moins d’en trouver une qui nous résiste pour la vie, il nous en faut de nouvelles.

L’inconnue est notre carburant. C’est elle qui nous donne envie de faire des études et quand on en a la chance matérielle, de passer des inconnues de nous aux inconnues de tous.

Vous savez qu’il y a des équations très simples à formuler, mais qui ne trouvent pas de solution dans un ensemble donné. Ainsi, lorsque que l’on cherche un x² négatif, on n’a pas d’autre solution que de chercher pour x, un territoire plus complexe que celui des entiers relatifs. Ainsi, même si cela peut nous paraitre irrationnel, car nos terres sont loin d’être paradisiaques, chaque année, des milliers de personnes disparaissent en mer, en essayant de nous rejoindre.

Nos peurs de ces inconnues et de ces inconnus sont parfaitement absurdes et criminelles. Nous devons en urgence retrouver la raison. Ouvrir nos esprits et nos frontières. Combattre les discriminations, les discours et les lois xénophobes ou racistes. Et tout en espérant des victoires, sauver autant de vies que possible.

La sœur est la mère de ses frères

La sœur est la mère de ses frères

Hier soir, je regardais très distraitement l’épisode de « Faites entrer l’accusé » sur Chantal Ternik, quand un avocat a retenu mon attention avec cet énoncé :

La fille ainée [de Chantal] était devenue un peu la mère de ses deux frères.

Je trouve vraiment magique qu’un cerveau humain inattentif soit capable à la fois de comprendre instantanément, sans effort et sans erreurs une phrase aussi complexe tout en ayant vaguement conscience des pièges qu’il a machinalement évités.

Dans « la fille ainée de Chantal », on comprend que Chantal est la mère de X et que X est une femme. Par défaut, on considère que la relation « mère de » fait référence à un grand nombre de sous-relations : hérédité génétique, rapports légaux (droits et devoirs), liens affectifs, éducatifs, etc.

Jusqu’ici, tout va bien.

La suite est plus déroutante car, au regard de la loi de la plupart des pays, comme au regard de l’évolution des espèces, on ne peut pas être « un peu » le parent de quelqu’un. Il y a bien une alternative, mais elle est binaire : on est parent ou on ne l’est pas. Enfin, il ne nous paraît pas possible qu’une personne puisse « devenir » la mère biologique d’enfants déjà nés, qui plus est d’une autre mère et qui se révèle, par-dessus le marché, être la sienne. Nos arbres généalogiques imploseraient dans cette stupéfiante mise en abîme.

Notre cerveau doit donc trouver très rapidement une issue à cette crise : il en déduit que la première référence à la maternité est biologique ou légale, mais que la deuxième évocation ne fait cette fois référence qu’aux seules éducatives, affectives et de protection. Et là, les pièces du puzzle s’agencent parfaitement : la fille ainée de Chantal est donc ce qu’on appelle une « mère de substitution » pour ses deux frères.

C’est magique.

Le revers de la médaille, c’est que si notre cerveau est si bien entraîné à faire ce genre de calculs, c’est parce qu’il discute en permanence avec d’autres cerveaux dotés des mêmes superpouvoirs. Donc, la plupart du temps, nous n’avons pas besoin d’être très précis et explicite pour nous faire comprendre de nos semblables. De nos semblables. Pas des machines que nous avons conçu.

En effet, si nous avons réussi à doter nos ordinateurs de superpouvoirs que nous ne possédions pas, nous peinons encore leur transmettre ceux que nous possédons.

C’est pourquoi tout au long de vos études en informatique, vous devrez déployer beaucoup d’attention, d’entraînement et de patience pour vous faire comprendre de vos machines. Bon courage et bonne rentrée 2023-2024 à toutes et tous !

« Hacker » un jeu vidéo

« Hacker » un jeu vidéo

Un atelier pour la Fête de la Science 2022

Derrière ce titre volontairement accrocheur, se cache une initiation ludique à la programmation en Python, qui s’adresse à des élèves de collège et lycée. Il s’agira de faire fonctionner et de modifier une version écrite en Python, d’un des premiers jeux vidéo dits « d’arcade » (Blockade, 1976, voir photo).

  • Date : vendredi 14 octobre 2022
  • Lieu : CERI, salle stat 9
  • Horaires : 9h15 – 16h
  • Animateurs : Pierre Jourlin & Jarod Duret

Procédure :

  • Se connecter sur l’ordinateur avec l’identifiant et mot de passe donné sur papier par vos animateurs
  • Ouvrir un « terminal » (CTRL+ALT+T)
  • tapez « python3 -m pip install -U pygame --user » et appuyez sur <entrée>
  • tapez « geany & » appuyez sur <entrée>
  • copiez le code source suivant dans la fenêtre de l’éditeur :
import pygame
import time
import random
 
pygame.init()
 
# Définition des couleurs en composante (Rouge, Vert, Bleu) 
blanc = (255, 255, 255)
jaune = (255, 255, 102)
noir = (0, 0, 0)
rouge = (213, 50, 80)
vert = (0, 255, 0)
bleu = (50, 153, 213)
 
largeur_plateau = 600
hauteur_plateau = 400
 
plateau = pygame.display.set_mode( ( largeur_plateau, hauteur_plateau ) )
pygame.display.set_caption("Le Serpent Numérique du LIA")
 
horloge = pygame.time.Clock()
 
taille_bloc = 20
vitesse_serpent = 5
 
style_caractères = pygame.font.SysFont("bahnschrift", 25)
style_scores = pygame.font.SysFont("comicsansms", 35)
 
 
def votre_score(score):
    valeur = style_scores.render("Votre Score: " + str(score), True, jaune)
    plateau.blit(valeur, [0, 0])
 
def notre_serpent(taille_bloc, corps_serpent):
    for x in corps_serpent:
        pygame.draw.rect(plateau, noir, [x[0], x[1], taille_bloc, taille_bloc])
 
def message(msg, color, décalage=0):
    mesg = style_caractères.render(msg, True, color)
    plateau.blit(mesg, [largeur_plateau / 6, hauteur_plateau / 3+décalage])
 
def boucle_jeu():
    fin_jeu = False
    ferme_jeu = False
 
    x1 = largeur_plateau / 2
    y1 = hauteur_plateau / 2
 
    x1_change = 0
    y1_change = 0
 
    corps_serpent = []
    longueur_serpent = 1
 
    repas_x = round(random.randrange(0, largeur_plateau - taille_bloc) / taille_bloc) * taille_bloc
    repas_y = round(random.randrange(0, hauteur_plateau - taille_bloc) / taille_bloc) * taille_bloc
 
    while not fin_jeu:
 
        while ferme_jeu == True:
            plateau.fill(bleu)
            message("Zut ! Vous avez perdu !", rouge)
            message("Appuyez sur J pour jouer encore", jaune, 20)
            message("ou sur Q pour quitter le jeu.", jaune, 40)
            votre_score(longueur_serpent - 1)
            pygame.display.update()
 
            for évènement in pygame.event.get():
                if évènement.type == pygame.KEYDOWN:
                    if évènement.key == pygame.K_q:
                        fin_jeu = True
                        ferme_jeu = False
                    if évènement.key == pygame.K_j:
                        boucle_jeu()
 
        for évènement in pygame.event.get():
            if évènement.type == pygame.QUIT:
                fin_jeu = True
            if évènement.type == pygame.KEYDOWN:
                if évènement.key == pygame.K_LEFT:
                    x1_change = -taille_bloc
                    y1_change = 0
                elif évènement.key == pygame.K_RIGHT:
                    x1_change = taille_bloc
                    y1_change = 0
                elif évènement.key == pygame.K_UP:
                    y1_change = -taille_bloc
                    x1_change = 0
                elif évènement.key == pygame.K_DOWN:
                    y1_change = taille_bloc
                    x1_change = 0
 
        if x1 >= largeur_plateau or x1 < 0 or y1 >= hauteur_plateau or y1 < 0:
            ferme_jeu = True
        x1 += x1_change
        y1 += y1_change
        plateau.fill(bleu)
        pygame.draw.rect(plateau, vert, [repas_x, repas_y, taille_bloc, taille_bloc])
        tête_serpent = []
        tête_serpent.append(x1)
        tête_serpent.append(y1)
        corps_serpent.append(tête_serpent)
        if len(corps_serpent) > longueur_serpent:
            del corps_serpent[0]
 
        for x in corps_serpent[:-1]:
            if x == tête_serpent:
                ferme_jeu = True
 
        notre_serpent(taille_bloc, corps_serpent)
        votre_score(longueur_serpent - 1)
 
        pygame.display.update()
 
        if x1 == repas_x and y1 == repas_y:
            repas_x = round(random.randrange(0, largeur_plateau - taille_bloc) / taille_bloc) * taille_bloc
            repas_y = round(random.randrange(0, hauteur_plateau - taille_bloc) / taille_bloc) * taille_bloc
            longueur_serpent += 1
        horloge.tick(vitesse_serpent)
    pygame.quit()
    quit()
  • Les animateurs vont vous expliquer rapidement ce code source
  • Enregistrez le fichier sous le nom « serpent.py » et revenez au terminal
  • Dans le terminal, tapez « python3 serpent.py« 
  • Jouez 2 ou 3 parties 🙂
  • Modifiez quelques paramètres élémentaires du jeu :
    • Les couleurs
    • Taille du plateau
    • Textes
    • Taille Serpent
    • Vitesse serpent
    • Style des caractères
  • Ajoutez quelques fonctions :
    • Changer longueur initale du serpent
    • Repas vert -> allongement de 1
    • Repas jaune -> allongement de 2
    • Repas rouge -> allongement de 3
    • allongement -> augmentation/réduction vitesse
    • Création d’un hall of Fame
    • 2 joueurs (difficile)
  • A tout moment, n’hésitez pas à demander de l’aide aux animateurs
  • A vous de jouer et à vous de créer !