Le Jeu de João
Une petite aventure de programmation avec des enfants de troisième année du premier cycle, soit avec des âges compris entre 8 et 9 ans. Le programme est construit en LogoWriter pour MS-DOS, version 1989.
Signifié des primitives portugaises utilisées dans le texte:
mt: montrer la tortueJeudi, 18 janvier 1990
Le jour de larrivée de la correspondance de lécole belge, João me demande sil peut construire un jeu - type jeu de loie - pour les correspondants. Il veut utiliser les possibilités de dessin en LogoWriter pour faire les carrés. Alors je lui propose de programmer un jeu, comme avant lui, David avait fait pour les correspondants portugais.
João commence à dessiner des carrés, mais il narrive quen mettre 8 sur une rangée verticale (figure 1).

Quelques jours plus tard
Guida, linstitutrice qui accompagne toutes les écoles de notre institution au niveau des ordinateurs, est chez nous, en classe. Jen profite pour lui demander daider João à mettre les carrés à lhorizontale. Le résultat se voit sur la figure 2,

obéit à la programmation suivante :
to jogo
comeca
quadrados
vd 90 pf 20 ve 90 pf 20 ve 90 pf 60 ve 90 pf 20 vd 90 pf 20
letras
regras2
boneco.inicio
fim
to comeca
lc vd 90 pf 120 pf 20 ve 180
lb
fim
to quadrado
repete 4[pf 20 ve 90]
fim
to quadrados
repete 14[quadrado pf 20]
fim
to letras
lc fixapos [-130 -10]
esc [A]
fixapos [-110 -10]
esc [B]
fixapos [-50 -10]
esc [C]
fixapos [-10 -10]
esc [D]
fixapos [30 -10]
esc [E]
fixapos [70 -10]
esc [F]
fixapos [110 -10]
esc [G]
fim
to regras
es [A avanca 3 casas]
es [B avanca 2 casas]
es [C avanca 1 casa]
es [D volta para casa de partida]
es [E recua 2 casas]
es [F avanca 1 casa]
es [G avanca 5 casas]
fim
to boneco.inicio
fixapos [-150 -10]
fixaforma 21
lc fixarumo 90
fim
Et, immédiatement, il y a un nouveau problème : comment pouvons-nous apprendre à la tortue quelle doit "jeter les dés" et avancer le nombre de cases indiqué ? Nous allons discuter de ce problème ensemble. Laprès-midi du même jour, nous demandons à toute la classe si nous pouvons aborder le problème avant de commencer le travail individuel, défini par chacun sur sa planification personnelle. Les enfants sont daccord et João explique ce quil veut.
Nous distinguons deux parties différentes du problème :
1. Les carrés ont un côté 20 (toutes les mesures sont en "pas de tortue" et par convention, dans la classe, non-explicitées), donc :

Donc, du centre dun carré au centre dun autre carré, nous mesurons 20ou encore : pour avancer dune case, la tortue fait 1x20, pour avancer 3 cases, elle fait 3x20, etc.. Pour avancer les 14 cases, elle fait 14x20, soit 280 pas.
2. La tortue doit apprendre ce que font les dés: faire apparaître un nombre arbitraire
Nous disons : choisit nimporte quel nombre jusquà 6 et avance autant de fois 20.
La tortue dit:
to escolhe
pf acaso 7 * 20
fim
(Remarque: Sept parce que nimporte quel nombre de 0 jusquà 6, donc 7 - que nous comptons - plusieurs fois - sur les doits).
Nous faisons lexpérience. Ça ne marche pas : la tortue avance nimporte combien, mais ne fait pas les petits sauts de 20 en 20.
Naturellement ! David et moi, nous le comprenons au même moment : la tortue avance un nombre quelconque de (0 x 20) ou 0 à (7 x 20) ou 140 !
Nous changeons la ligne de programmation en pf 20 * acaso 7 et ça marche !
Les autres vont au travail, et João, aidé de David et de Pedro achève le contrôle des conditions des cases avec une lettre. Cest plus facile, même avec le G : avancer 5 cases, au fait, cest avancer 1 case et reculer 4. Le programme "control" est écrit par eux, sans intervention de ma part.
to control
se pos = [-130 -10][pf 60]
se pos = [-10 -10][pf 140]
se pos = [-110 -10][pf 40]
se pos = [30 -10][pt 20]
se pos = [70 -10][pf 20]
se pos = [110 -10][pf 20 espera 2 pt 80]
fim
Il nous ne faut plus quintroduire la primitive anglaise "stop" ("para" - arrête en portugais - est une mauvaise traduction de langlais "stopall", qui signifie quelque chose de légèrement différent, et nous montons le jeu ) :
Nous disons :
Si la position de la tortue est égale à [150 -10], arrête; sinon, choisit de nouveau un nombre de cases, contrôle de nouveau si tu te trouves sur une lettre, exécute la condition, attends un moment, contrôle ta position, et continue à jouer.
La tortue dit :
to jogo1
sesenão pos = [150 -10][stop]
[escolhe control espera 5 jogo1]
fim
Et João, tout fier, présente son jeu en fin daprès-midi en commandant la tortue: le jogo jogo1, et cela, plusieurs fois.
Les autres commentent : "Tu pourrais faire une course entre plusieurs animaux." "Tu peux jouer contre lordinateur."
Entre instituteurs
Lidée mamuse, mais je ne sais pas trop bien comment my prendre. Je me vois une fois de plus pris dans des programmes faits par les enfants, avec des listes compliquées, ou il manque des [ ou des ], comme cest déjà arrivé... Je propose aux collègues instituteurs, impliqués dans même projet "ordinateur à lécole" de dédier notre réunion bi-mensuelle au sujet. Nous découvrirons:
1. Il faut, dès le début, activer deux tortues, et pour ne pas confondre, exclure la tortue 0, active dans jogo1.
2. La position [150 -10] doit "savoir" et "dire" laquelle des deux tortues est arrivée à la case finale.
Après avoir écrit un petit programme, jogar.a.dois, pour avoir une image dun chien, à trois collègues, nous arrivons à faire un programme qui identifie la tortue, et communique qui a gagné:
to identifica :num
se :num = 3 [repete 5 [ct es[o cao ganhou] espera 5]]
se :num = 2 [repete 5 [ct es[o gato ganhou] espera 5]]
fim
ce qui veut dire plus ou moins: "Identifie le numéro de la tortue: si cest la 3, clignote 5 fois le chien a gagné, si cest la 2, clignote 5 fois le chat a gagné".
Maintenant, pensions-nous, il suffit de construire un jogo2 qui en tortue sera écrit ainsi:
to jogo2
sesenao pos = [150 -10][identifica? quem stop]
[ta 2 escolhe control espera 5 ta 3 escolhe control espera 5 jogo 2]
fim
ce qui, selon ce que nous espérions, voulait dire: "Si la position dune des tortues est égale à [150 -10], identifie la tortue en cause, indique qui a gagné et arrête. Si aucune des deux tortues ne se trouve là, dit à la tortue 2 de jeter le dé, de contrôler, dattendre, après faire jeter le dé à la tortue 3, et ainsi alternativement, jusquau moment ou lune des deux répond à la première condition."
Nous essayons. Ça ne marche pas. Le programme ne sarrête que quand le chat gagne le jeu, jamais quand le chien (qui commence le jeu) se trouve dans la case darrivée. Il vaut mieux arrêter dy réfléchir et de rentrer dîner. Il se fait tard...
Mardi, 30 janvier 1990.
João demande si nous pouvons continuer le montage du jeu. Je lui raconte que nous avons essayé entre instituteurs de travailler un peu sur le problème posé, mais que nous ne sommes pas arrivés à le résoudre. David lentend, et demande tout de suite sil peut aider. Je leur montre ce que nous avons fait:
- pour mettre le chien et le chat en position de partie:
to boneco.inicio2
ta 0 et
ta 3 fixaforma 6 lc fixapos [-150 -10]
ta 2 fixaforma 21 lc fixapos [-150 -10]
ta [3 2] fixarumo 90 mt
fim
- pour préparer le jeu:
to jogar.a.dois
et comeca
quadrados vd 90 pf 20 ve 90 pf 20 ve 90 pf 60 ve 90 pf 20 ve 90 pf 20
letras regras2 boneco.inicio2
espera 40 repete 7 [es[]]
es [\ \ \ o cao pode comecar]
ta 2 fixapos [-150 -10]
fim
Je montre également jogo2. Nous constatons à nouveau que ça ne marche pas (quand nous faisons ce type dexpériences, nous avons toujours un petit espoir que lordinateur connaît la même fatigue que nous, et quaprès un bon repos, le problème disparaîtra...). Nous échangeons la tortue 2 et la tortue 3 de place, et maintenant, ce nest que le chien qui fait cesser le jeu.
David: - Le problème cest que celui qui commence, même quand il arrive, narrête jamais, donc les deux doivent commencer en même temps.
Moi: - Mais alors, ils se déplacent en même temps. Je pense plutôt que cest le contrôle des positions qui doit être fait en même temps.
Nous essayons jogo3, incluant dans une liste les deux tortues qui doivent être contrôlées:
to jogo3
sesenão pos = [150 10] [identifica? quem stop]
[ta 2 escolhe ta 3 escolhe espera 5 ta [2 3] control jogo3]
fim
Ça ne marche toujours pas.
João propose de mettre pos = [150 10] également dans le programme control vu que les autres ordres "se" fonctionnent. Nous faisons:
to control1
se pos = [-130 -10][pf 60]
se pos = [-10 -10][pf 140]
se pos = [-110 -10][pf 40]
se pos = [30 -10][pt 20]
se pos = [70 -10][pf 20]
se pos = [110 -10][pf 20 espera 2 pt 80]
se pos = [150 -10][identifica? quem stopall]
fim
Après cela, nous écrivons un jogo4 bien plus simple:
to jogo4
ta 2 escolhe control1 espera 5
ta 3 escolhe control1 espera 5
jogo4
fim
Merveille, ça marche! Dans notre enthousiasme, nous imaginons de nouvelles possibilités:
- Nous voulons que, après avoir terminé le jeu, et après que lordinateur a indiqué le gagnant, nous puissions choisir de continuer à jouer ou non (João)
- Nous voulons pouvoir faire des paris avec lordinateur qui sera gagnant (David).
- Nous voulons voir combien de fois gagne le chien, combien de fois le chat (moi).
Mais, tout de suite, nous montrons à la classe ce que nous avons fait cet après-midi de travail libre organisé, pendant que les autres se sont occupés comme suit:
Alvaro a fait des fiches,
Paulo un texte;
Pedro un texte libre à la machine à écrire;
lautre David un test pour passer de niveau en division;
Zélia et Inês des fiches de mathématiques;
Tiago une expérience avec des corps fluctuant, quil présente en fin daprès-midi;
les autres: scrabble, dessins, travaux manuels;
comme ils lavaient programmé.
Mais le même jour, après le goûter de 4 heures, nous retournons encore en salle, pour reprendre lidée de João. En fin de compte, le jeu est "à lui"...
Il faudra faire deux groupes dinstruction: Le premier, falar, est le plus facile: avec deux lignes de texte, nous demandons au joueur ce quil veut faire. Le deuxième, acabar.ou.nao, est plus compliqué: pour que la tortue puisse répondre au oui ou non du joueur, elle doit savoir "lire" ce que le joueur écrit à lécran. Jexplique que la primitive faz "... apprend des choses à la tortue. David se rappelle du jeu quil avait construit que prim listalida fait lire un mot écrit par le joueur.
Cest ainsi que acabar.ou.não prend forme:
to acabar.ou.nao
faz "aprende prim listalida
se :aprende = sim [le jogar.a.dois espera 6 jogo4]
se :aprende = nao [le es [acabou!] espera 20 stopall]
fim
to falar
le es[se quiseres jogar outra vez escreve sim]
le es[se não quiseres jogar mais escreve nao]
fim
Ce qui provoque des séquences comme celle-ci:


Mercredi, 1 février.
Fernando (collègue de luniversité, qui coördonne lexpérience des "ordinateurs à lécole primaire") est chez nous, en classe. Nous apprenons quelques nouvelles commandes en LegoLogo.
Jeudi, 2 février
Au lieu de travailler en travail libre organisé, nous avons un conflit à résoudre, ce qui prend toute laprès-midi. Pas dateliers.
Vendredi, 3 février
Atelier de langue. Lordinateur sert de machine à écrire; laprès-midi, conseil et atelier dexpressions pour toute lécole (106 enfants, 5 instituteurs).
Lundi, 5 février
Planification - musique - gymnastique - discussion des contrats de nouveaux projets: écrivains portugais (deuxième projet à ce sujet cette année), le renard, voitures et moteurs, comment fabrique-t-on du papier, la vie du Christ.
Mardi, 6 février
Nous discutons ensemble de quelques aspects. A cause du jeu de João, nous avons du chercher comment parler "tortue" avec la tortue. Une des situations les plus simples est le programme identifica.quem.
Je dessine des carrés par terre, Pedro joue la tortue 2 (le chat) et David C. joue la tortue 3 (le chien), Rui joue la tortue 0 qui doit identifier qui arrive à la fin: si cest la tortue 2, il devra dire "Pedro a gagné", si cest la 3, il dira "David a gagné". Il a tourné le dos aux deux "tortues".
Les autres disent aux "tortues" combien de cases elles peuvent avancer, sans que Rui sache qui des deux a commencé. Quand jannonce quune des deux est arrivée à la dernière case, Rui ne sais pas qui a gagné. Il ne peut rien annoncer. Nous arrivons ainsi a comprendre quil a besoin dune information supplémentaire: identifica :num fait laffaire. Quand je dis "3", Rui dit "David a gagné", quand je dis "2" il annonce "Pedro a gagné", comme nous lavions instruit.
Cela devient plus compliqué quand nous voulons dire des choses à la tortue en langage humain au lieu de langage tortue. Mais David G. tire la conclusion suivante: la tortue doit lire ce qui se trouve sur lécran. Lui et moi nous savons déjà que listalida et prim font le travail.
Nous essayons: jécris dans la zone de programmation:
to ler
mostrar listalida
fim
Jécris maintenant: ler (enter) dans la zone de commandes, et la tortue met:
et jécrit dans la zone de la tortue: Bonjour tortue, je suis Pascal.
Quand jai terminé, la tortue renvoie sur lécran: [Bonjour tortue, je suis Pascal.]
Maintenant, je change ler:
to ler
mostrar prim listalida
fim
ce qui fait le dialogue:
Bonjour tortue, je suis Pascal.
Bonjour.
Et encore:
to ler
mostrar ultimo listalida
fim
ce qui donne:
Bonjour tortue, je suis Pascal.
Pascal.
João explique maintenant comment la tortue peut comparer des mots: nous avons instruit la tortue avec faz "aprende prim listalida. Maintenant, elle se rappelle ce que nous lui avons dit, et nous pouvons ainsi lui apprendre de comparer deux choses et agir en conséquence.
Le programme acabar.ou.nao sers dexemple.
Ce jour-là, après midi, pendant les activités du travail libre, David écrit un nouveau programme qui passe des messages aux enfants de la classe. Ainsi, après avoir identifié "nome comme "Sara, la tortue écrit [David G veut se marier avec toi], mais à la sortie de lécole, le message est plus socialisé: [Jai entendu dire que quelques garçons de la classe taiment bien].
Pour ne pas avoir a sortir du programme, jaide David à la construction dun message universel, pour "les autres". Ça fait:
se nao membro? :nome [] []
Mercredi, 7 février
Aujourdhui, Guida nous rend visite. David lui montre son programme. Quand Guida lui demande pour lui introduire un message pour elle, il le fait sans hésiter. João en profite pour lui montrer les progrès dans la programmation du jeu quil a inventé. Cet après-midi là, pendant la réunion déquipe, je montre où jen suis avec ma tentative (évidemment sans résultat) pour monter le pari avec lordinateur.
To aposta
faz "animal prim listalida
jogar.a.dois
espera 5
jogo4
fim
to sem.aposta
jogar.a.dois
espera 5
jogo4
fim
Je navais plus eu le temps pour réfléchir à ce problème, parce quentre-temps nous avons commençé les essais pour la seconde partie de notre pièce de théâtre, et il y a une hypothèse de voyage pour aller voir les correspondants.
A partir des discussions entre adultes, nous concluons quil faut monter un programme qui répond à chaque possibilité (groupes de deux conditions), et nous écrivons:
to controla.quem.ganhou
se e (:animal = "chien) (quem = 3) [es[tu a gagné]]
se e (:animal = "chat) (quem = 2) [es[tu a gagné]]
se e (:animal = "chien) (quem = 2) [es[tu a perdu]]
se e (:animal = "chat) (quem = 3) [es[tu a perdu]]
fim
to ensina.animal
faz "animal prim listalida
fim
to aposta.mensagem (messages en traduction libre...)
es [Tu veux faire le pari qui gagne? Écrit oui ou non]
faz "resposta prim listalida
se :resposta = "oui [es [chat ou chien?] ensina.animal]
se :resposta = "non [es [tu a peur?] espera 40 es [] falar acabar.ou.nao]
fim
Au fait, nous nous rappelions dune primitive que personne dentre nous avait utilisé jusquà présent: e (and). Controla.quem.ganhou marche, mais nous le retirons après contrôle et impression. Nous pensons que cest bien difficile à passer aux élèves.
Jeudi, 8 février
Après le moment daccueil, rituel de tous les matins, nous avons un atelier de math. Je dis que Guida, Zé Carlos (autre instituteur à lécole) et moi avons pu résoudre le problème du pari, et que, qui veut, peu se joindre à moi. Arrivent Inês, Tiago, David G, David C. et João. Tout dabord, nous rappelons ce que nous voulons faire.
Tiago: Je veux pouvoir dire: "je parie sur le chat"
Inês: Et moi: "je parie sur le chien"
João: Nous allons faire le pari avec lordinateur.
David G: Lordinateur, lui il dit: tu veux parier, moi je dis que je pari sur le chien; après quoi il dit, alors moi, je choisis le chat.
David C: Cest ce que jallais dire.
Je propose apostar.mensagem
João: es [Nous allons faire un pari]
es [Choisis un animal]
Moi: Je propose ici un petit programme pour que la tortue puisse lire lanimal choisi: escolhe.animal
David G., expérimenté, donne le contenu:
to escolhe.animal
faz "animal prim listalida
fim
Nous continuons:
David C.: Sil choisit le chat, sil choisit le chien.
Inês: Nous voulons quil dise sur quel animal il pari.
Moi: Se?
João: se :animal = "chat [es [Alors, moi je choisis le chien]]
se :animal = "chien [es [Alors, moi je choisis le chat]]
Moi: Et si quelquun écrit mal le mot chat ou chien?
David G: se nao membro? :animal [chat chien] [es [tu ne peux écrire que chat ou chien]]
Moi: Nous le mettrons comme dernière phrase dans apostar.mensagem. Après la tortue fait jogar.a.dois et jogo4 (sem.aposta), et quand le jeu est terminé?
João: Nous mettrons identifica.quem et elle nous dit qui a gagné.
Moi: Alors, voyons ce quelle pourra dire.
David G: Par exemple: jai fait le pari sur le chat, et cest le chien qui gagne, alors elle dit: jai gagné.
Tiago: Jai fait le pari sur le chien e le chat a gagné, elle dit: "jai gagné et tu a perdu."
Moi: Et quand cest le joueur qui gagne?
Inês: Par exemple, le joueur a fait le pari sur le chat et le chat a gagné, elle dit: "Tu a gagné et moi jai perdu."
David G: Le joueur a fait le pari sur le chien et le chien gagne, elle dit: "La victoire est à toi!"
Je propose to resultado.da.aposta (résultat du pari), où nous pouvons déjà écrire les messages:
Moi: Maintenant nous devons y mettre les conditions.
Inês: Quand lanimal sur lequel le joueur a parié, quand lanimal est le chat et cest le chien qui arrive à la fin...
David G: La tortue sait avec identifica quem
Inês: Quem est 2 ou 3
Tiago: Le numéro du chien est 3
Moi: Donc:
1. Quand lanimal est chat et celui qui est arrivé est 3
2. Quand lanimal est chien et celui qui est arrivé est 2
3. Quand lanimal est chat et celui qui est arrivé est 2
4. Quand lanimal est chien et celui qui est arrivé est 3
ou, en langage tortue:
se e (:animal = "chat) (quem = 3)
se e (:animal = "chien) (quem = 2)
David G: se e (:animal = "chat) (quem = 2)
se e (:animal = "chien) (quem = 3)
et nous voilà prêt pour écrire tout le procès. João, David, Inês et moi nous nous en occupons pendant la récrée.
to resultado.da.aposta
se e (:animal = "chat) (quem = 3)[es [Jai gagné.] espera 40 le]
se e (:animal = "chien) (quem = 2)[es [Jai gagné et tu a perdu.] espera 40 le]
se e (:animal = "chat) (quem = 2)[es [Tu a gagné et moi jai perdu] espera 40 le]
se e (:animal = "chien) (quem = 3)[es [La victoire est à toi!] espera 40 le]
fim
Ils nous faut encore monter:
to aposta
jogar.a.dois
jogo5
aposta.mensagem
sem.aposta
fim
Nous écrivons, nous changeons, mais après jogo5, la tortue nous met une ligne verticale sur lécran, au lieu de aposta.mensagem.
Dans la zone de commandes, control2, jogor.a.dois et jogo5 fonctionnent. Quand nous les employons dans un seul programme, ils ne fonctionnent plus. Nous ne savons pas pourquoi. À la pause-midi, je découvre quen retirant aposta.mensagem et sem.aposta du programme aposta et en substituant "stop" par "executa [aposta.mensagem espera 20 sem.aposta]" tout travaille. Nous avons réussi. Mais je ne comprends pas pourquoi on y est arrivé de cette façon.

Maintenant, il ne manque plus que le programme pour faire le contage des réussites de chaque joueur (utilisateur dun côté, ordinateur de lautre).
João et moi, nous commençons cette dernière étape. Il faut donner une nouvelle information à la tortue; João veut que les deux parieurs commencent chacun avec 10 points. Nous écrivons:
to contar
faz "comp 10
faz "jogador 10
fim
Ensuite nous essayons de donner des points à lordinateur. Mais chaque fois que nous écrivons dans la zone de commandes es :comp + 1, il écrit 11. Quand nous demandons faz :comp + 1, la tortue ny comprend rien du tout. Nous laissons tomber.
Laprès-midi, nous essayons encore, avec David G, Inês, David C et Tiago (qui disparaît assez vite...).
Nous devons apprendre à la tortue a donner dix points pour commencer. João lexplique aux autres.
David G: Alors, ça se fait avec faz.
João et moi, on le savait déjà. Le programme reçoit un autre nom:
to dez.pontos
faz "comp 10
faz "pessoa 10
fim
Après, il y a plusieurs possibilités que nous examinons ensemble et qui sont du genre: "Si le joueur gagne, on met un point pour le joueur, et on retire un point à lordinateur." Donc, nous avons besoin de quatre nouveaux programmes.
Inês: Un pour mettre des points à lordinateur.
João: Un pour tirer des points à lordinateur.
David G.: Et un pour donner des points au joueur.
Moi: Et un pour tirer des points au joueur.
Nous écrivons ensemble le premier programme:
to tirar.um.a.pessoa
faz "pessoa :pessoa - 1
fim
João et David écrivent les trois autres programmes, en expliquant la syntaxe de la tortue à une collègue en visite dobservation, qui ne sait rien de grammaire tortue, mais par contre, se révèle une bonne aide en orthographie humaine. Comme laprès-midi est réservé pour le travail libre organisé, je ne peu pas rester avec eux tout le temps. Les autres on besoin du maître. Les programmes sont près peu de temps après:
to tirar.um.a.computador
faz "comp :comp - 1
fim
to por.um.a.pessoa
faz "pessoa :pessoa + 1
fim
to por.um.a.comp
faz "comp :comp + 1
fim
Ils nont pas encore assemblés les programmes quils ont faits. Les choses en restent là, jusquau Carnaval. Finalement, le 1er mars, João et moi, nous pouvons faire le montage final:
Nous incluons les programmes finaux deux a deux dans resultado.da.aposta
Nous écrivons un petit programme final resultado pour inclure dans la zone de commandes le résultat du jeu. Là, une foi de plus, nous avons un petit problème avec la traduction portugaise.
Nous voulions:
to resultado
inserecc (frase [tu as] :pessoa [points, moi jai] :comp [points])
espera 40 le ac
fim
mais la tortue ne veut pas; il nous faut mettre (sentence [tu as] :pessoa [points, moi jai] :comp [points]) pour que apparaisse:

Nous changeons encore deux détails: nous donnons le nom partida au lieu de aposta au programme final, pour quil commence automatiquement quand la page du jeu est demandée. Nous changeons aussi stopall par indice dans acabar.ou.nao pour faire réapparaître lindice générale quand on quitte le jeu.
© Pascal Paulus
Portugal