Du carré au jeu vidéo
Un parcours pas à pas : tu commences par un trait, tu finis par ton propre jeu
Ce parcours est fait pour être suivi dans l'ordre, du début à la fin. Chaque étape débloque un nouveau pouvoir et se termine par un petit défi « à toi de jouer ». Tu n'as besoin de rien connaître au départ. À l'arrivée, tu auras programmé un vrai petit jeu, un casse-brique, en assemblant tout ce que tu auras appris en chemin.
ED), valide avec
Ctrl+S (sur Mac : ⌘+S), puis lance
la commande depuis l'invite ?. Change les nombres, observe : c'est
en bricolant qu'on comprend.
Les étapes : 1. Le premier trait · 2. La paresse intelligente · 3. Inventer ses mots · 4. Assembler des briques · 5. Ta première erreur · 6. Décider · 7. Se souvenir · 8. L'effet waouh · 9. Ça bouge · 10. Dessine tes formes · 11. La balle qui rebondit · 12. Ton jeu
Étape 1. Le premier trait
Au lancement, tape MT (Montre Tortue) pour faire apparaître la zone
graphique. La tortue est là, au centre, pointée vers le haut. Donne-lui un ordre :
? AVANCE 100
? TD 90
? AVANCE 100
Elle avance, tourne à droite, avance encore. AVANCE (ou AV)
déplace, TD tourne à droite, TG tourne à gauche. Avec ça
seul, tu peux déjà tracer un carré, côté par côté.
À toi de jouer : termine le carré à la main (quatre
AV et quatre TD 90).
Étape 2. La paresse intelligente
Quatre fois la même chose, c'est pénible à taper. Un bon programmeur est
paresseux : il fait répéter la machine. C'est le rôle de REPETE :
? REPETE 4 [ AV 100 TD 90 ]
Le carré en une ligne. Change le 4 et l'angle pour d'autres
polygones : l'angle vaut toujours 360 divisé par le nombre de côtés.
? REPETE 3 [ AV 120 TD 120 ] ; triangle
? REPETE 6 [ AV 80 TD 60 ] ; hexagone
À toi de jouer : fais un cercle. Indice : beaucoup de
petits pas et de tout petits virages, par exemple REPETE 360 [ AV 5 TD 1 ].
Étape 3. Inventer ses mots
Tu vas vouloir réutiliser ton carré sans le retaper. Alors apprends ce mot
nouveau à la tortue, avec POUR … FIN :
POUR CARRE
REPETE 4 [ AV 100 TD 90 ]
FIN
GoLogo répond VOUS VENEZ DE DEFINIR CARRE. Désormais
CARRE est une commande comme les autres. Et pour choisir la taille,
ajoute un paramètre :
POUR CARRE :COTE
REPETE 4 [ AV :COTE TD 90 ]
FIN
? CARRE 50
? CARRE 150
À toi de jouer : écris POLYGONE :N :COTE qui
trace un polygone à :N côtés. (Rappel : l'angle est
360 / :N.)
Douze appels à CARRE en tournant un peu à chaque fois : une rosace.
Étape 4. Assembler des briques
Un gros programme, c'est juste des petits programmes mis bout à bout. Définis un mur et un toit, puis une maison qui s'en sert :
POUR MUR
REPETE 4 [ AV 100 TD 90 ]
FIN
POUR TOIT
REPETE 3 [ AV 100 TD 120 ]
FIN
POUR MAISON
VE MUR AV 100 TD 30 TOIT
FIN
Voilà l'idée la plus importante de la programmation : découper un gros problème en petits morceaux qu'on sait résoudre.
À toi de jouer : ajoute une PORTE à la maison.
Pense à lever le crayon (LC) pour déplacer la tortue sans tracer, et à
le baisser (BC) avant de dessiner.
MAISON : un mur carré surmonté d'un toit triangulaire.
Étape 5. Ta première erreur
C'est ici que tu apprends quelque chose que les blocs colorés ne t'apprendront jamais : lire une erreur et la corriger. Tape exprès une bêtise :
? AVANCE BONJOUR
GoLogo proteste : AVANCE N'AIME PAS BONJOUR. Il ne te dit pas
« non » bêtement : il t'explique. AVANCE attend un nombre, pas un
mot. Autre classique :
? CARRR 50
COMMENT FAIRE CARRR ?
Une faute de frappe : GoLogo ne connaît pas CARRR. Tu corriges,
tu réessaies. C'est ça, programmer pour de vrai : on se trompe,
on lit le message, on corrige. Ce réflexe te servira dans tous les langages, plus
tard.
Étape 6. Décider
Un programme intéressant ne fait pas toujours la même chose : il
décide. La commande SI exécute des instructions seulement si
une condition est vraie :
? SI 3 > 2 [ ECRIS "PLUS_GRAND ]
Une condition, c'est une question à laquelle on répond par oui ou par non (en
Logo : VRAI ou FAUX). Ces questions finissent toujours
par un ? : EGAL? (est égal ?), PLG?
(plus grand ?), PLP? (plus petit ?). On peut aussi écrire les
comparaisons avec les signes =, >, <,
comme en maths. Avec une deuxième liste, SI fait « sinon » :
POUR SIGNE :N
SI :N > 0 [ ECRIS "POSITIF ] [ ECRIS "NEGATIF_OU_NUL ]
FIN
À toi de jouer : écris une procédure qui dit
PAIR ou IMPAIR selon le nombre. Indice :
RESTE :N 2 vaut 0 quand :N est pair.
Étape 7. Se souvenir
Pour compter des points, retenir une position, la tortue a besoin de
mémoire. Une variable est un nom qui retient une valeur.
On la crée avec DONNE et on la relit avec deux-points :
? DONNE "SCORE 0
? DONNE "SCORE :SCORE + 1
? ECRIS :SCORE ; affiche 1
« Prends le score, ajoute 1, range-le dans le score. » C'est exactement ainsi
qu'on tient un compteur de points dans un jeu. Garde ce mot SCORE en
tête : tu vas t'en resservir à la fin.
Étape 8. L'effet waouh
Voici une idée surprenante : une procédure a le droit de s'appeler elle-même. C'est comme une poupée russe qui contient une poupée plus petite, qui en contient une encore plus petite… On appelle ça la récursion, et c'est parfait pour les dessins qui se répètent en plus petit. Un arbre, par exemple : un tronc, puis deux branches plus petites, et chaque branche est elle aussi un petit arbre ! Il faut juste une règle pour s'arrêter, sinon ça continue à l'infini : ici, on arrête quand la branche devient minuscule.
POUR ARBRE :T
SI :T < 10 [ STOP ] ; branche trop petite : on arrête
AV :T
TG 30 ARBRE :T * 0.7
TD 60 ARBRE :T * 0.7
TG 30
RE :T
FIN
POUR DESSINE_ARBRE
VE FEN FCAP 0 RE 150 ARBRE 120
FIN
Lance DESSINE_ARBRE. Quelques lignes, et un arbre entier apparaît.
C'est souvent le moment où on attrape le virus.
Chaque branche se divise en deux branches plus petites.
Étape 9. Ça bouge
Jusqu'ici la tortue dessinait. Maintenant elle va bouger dans le temps.
Deux ingrédients : ATTENDS fait une petite pause (en soixantièmes
de seconde), et une boucle répète le mouvement. Voici un sprite qu'on déplace avec
les flèches du clavier (la MANETTE 0 est émulée par les flèches) :
POUR PROMENADE
VE FEN
SPRITE 2
TANTQUE [ NON BOUTON? 0 ] [
DONNE "D MANETTE 0
SI :D = 1 [ FCAP 0 AV 10 ] ; haut
SI :D = 5 [ FCAP 180 AV 10 ] ; bas
SI :D = 3 [ FCAP 90 AV 10 ] ; droite
SI :D = 7 [ FCAP 270 AV 10 ] ; gauche
ATTENDS 2
]
FIN
Lance PROMENADE et pilote la voiture aux flèches. Appuie sur la barre
d'espace (le bouton de tir) pour t'arrêter. TANTQUE répète le bloc
tant que sa condition est vraie : ici, tant que le bouton n'est pas
pressé.
FEN (fenêtre) laisse la tortue se promener sans buter sur les
bords. C'est le mode qu'on utilise pour les jeux.
Étape 10. Dessine tes propres formes
Jusqu'ici la tortue avait une forme toute faite. Mais tu peux lui en dessiner une
toi-même ! La commande DEFSPRITE te laisse créer une forme sur une
petite grille de 16 cases sur 16, un peu comme du pixel art. Chaque ligne est une
suite de caractères : un point . pour une case vide, une lettre
(par exemple X) pour une case pleine. Dessinons une balle ronde et une
brique :
DEFSPRITE 3 [
..XXXX..
.XXXXXX.
XXXXXXXX
XXXXXXXX
XXXXXXXX
XXXXXXXX
.XXXXXX.
..XXXX..
]
DEFSPRITE 4 [
XXXXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXXXXXXXXXXXX
]
Regarde bien la première : si tu plisses les yeux, les X
dessinent un rond. La forme numéro 3 est maintenant ta balle ronde, la numéro 4 ta
brique. Tu les choisis avec SPRITE, comme les formes toutes faites :
VE MT
SPRITE 3 ; la tortue devient une balle ronde
FCC 1 ; en rouge (la forme prend la couleur du crayon)
Deux choses à retenir : les numéros de tes formes commencent à 3
(0, 1 et 2 sont les formes intégrées, triangle, tortue et voiture), et ta forme prend
la couleur du crayon (FCC) et tourne avec la tortue.
À toi de jouer : dessine ta propre forme, un vaisseau, un
cœur, un bonhomme. Tu pourras t'en servir dans le jeu, à la fin : une vraie balle
ronde (SPRITE 3) et de vraies briques (SPRITE 4), c'est tout
de suite plus joli que des triangles.
Étape 11. La balle qui rebondit
Avant de faire un jeu, il manque une brique essentielle : une balle qui rebondit sur les bords. Ça a l'air compliqué, mais l'idée est toute simple.
Imagine que la balle avance par petits pas, image après image. À chaque pas, elle
se décale : un peu vers la droite, un peu vers le haut. On range ces deux
décalages dans deux variables : :DX (de combien on va vers la
droite en x) et :DY (de combien on
monte en y). Tant qu'on ne touche rien, on répète : avance de
:DX et de :DY, encore et encore.
Maintenant, le rebond. Pense à une vraie balle que tu lances contre le mur de
droite : elle repart vers la gauche. Son déplacement vertical ne change pas,
c'est seulement son déplacement horizontal qui s'inverse. En Logo,
inverser un nombre, c'est faire 0 - :DX (si :DX valait 9,
ça donne −9 ; la balle ira maintenant vers la gauche). Pareil en haut et en
bas, mais c'est :DY qui s'inverse. Voilà :
POUR INITBALLE
VE FEN
DEFSPRITE 3 [
..XXXX..
.XXXXXX.
XXXXXXXX
XXXXXXXX
XXXXXXXX
XXXXXXXX
.XXXXXX.
..XXXX..
]
FIXETORTUE 0 SPRITE 3 FCC 7 MT LC FXY 0 0 ; on reprend la balle ronde (forme 3) de l'étape 10, en blanc
DONNE "DX 9 DONNE "DY 6
FIN
POUR REBOND
SI XCOR + :DX > 780 [ DONNE "DX 0 - :DX ]
SI XCOR + :DX < -780 [ DONNE "DX 0 - :DX ]
SI YCOR + :DY > 480 [ DONNE "DY 0 - :DY ]
SI YCOR + :DY < -480 [ DONNE "DY 0 - :DY ]
FXY XCOR + :DX YCOR + :DY
FIN
POUR ANIMEBALLE
INITBALLE
REPETE 300 [ REBOND ATTENDS 1 ]
FIN
Lance ANIMEBALLE : la balle file en diagonale et rebondit dans
tous les coins. Décortiquons REBOND, ligne par ligne :
XCORte donne la position gauche-droite de la balle,YCORsa position bas-haut. Le bord droit de l'écran est à800, le gauche à-800, le haut à500, le bas à-500.XCOR + :DX, c'est l'endroit où la balle serait au prochain pas. La 1re ligne dit : « si au prochain pas la balle dépasse780(presque le bord droit), alors inverse:DX». Elle repartira vers la gauche au lieu de sortir.- Les trois lignes suivantes font pareil pour le bord gauche, le haut et le bas.
FXY XCOR + :DX YCOR + :DYdéplace enfin la balle de son pas (avec la vitesse éventuellement inversée).
On vérifie le bord avant de bouger, comme ça la balle ne dépasse jamais. C'est exactement le truc qu'on réutilisera dans le jeu.
À toi de jouer : change :DX et :DY
pour une balle plus rapide ou plus lente. Mets FIXETAILLECRAYON 6 avant
et baisse le crayon (BC) pour qu'elle laisse une trace.
Étape 12. Ton jeu : le casse-brique
Tu as tout ce qu'il faut. Un casse-brique, ce n'est qu'un assemblage de choses que
tu connais déjà : des carrés (les briques), une boucle, des SI, un
score, et la balle qui rebondit.
La nouveauté, c'est qu'on va avoir plusieurs tortues à l'écran en même
temps, une par objet du jeu. Chaque tortue porte un numéro : la
tortue 0 sera la balle, la tortue 1 la raquette, et
les tortues 2 à 15 les quatorze briques. Pour donner des ordres à
une tortue précise, on tape FIXETORTUE suivi de son numéro : ensuite,
les commandes (avancer, se placer, se cacher…) s'adressent à celle-là.
Dessiner les formes du jeu
On a appris à dessiner ses propres sprites à l'étape 10. Servons-nous-en pour donner de vraies formes à nos objets : une balle ronde (forme 3), une raquette toute en largeur (forme 4) et une brique (forme 5).
POUR FORMES
DEFSPRITE 3 [
..XXXX..
.XXXXXX.
XXXXXXXX
XXXXXXXX
XXXXXXXX
XXXXXXXX
.XXXXXX.
..XXXX..
]
DEFSPRITE 4 [
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
]
DEFSPRITE 5 [
XXXXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXXXXXXXXXXXX
]
FIN
On choisit ensuite ces formes avec SPRITE 3, SPRITE 4,
SPRITE 5, et chaque forme prend la couleur du crayon de sa tortue
(FCC) : on fera la balle blanche, la raquette grise et les briques
rouges, juste après.
Poser les briques
FIXETORTUE :B choisit la tortue numéro :B (et la crée si
elle n'existe pas encore). On veut ranger les 14 briques en grille : 7 colonnes,
2 rangées. La boucle REPETEPOUR [ B 2 15 ] fait passer :B
par tous les numéros de 2 à 15, une brique à chaque tour :
POUR POSEBRIQUES
REPETEPOUR [ B 2 15 ] [
DONNE "I :B - 2
DONNE "COL RESTE :I 7
DONNE "LIG QUOT :I 7
DONNE "BX 100 * :COL - 300
DONNE "BY 70 * :LIG + 250
FIXETORTUE :B SPRITE 5 FCC 1 MT LC FXY :BX :BY
]
FIN
Chaque brique prend la forme 5 (SPRITE 5) en rouge (FCC 1).
Le calcul du milieu peut sembler mystérieux, mais c'est juste de l'arithmétique de
grille. On range d'abord la brique à partir de 0 (:I vaut 0 pour la
première, 1 pour la deuxième…). Ensuite :
RESTE :I 7donne la colonne (0 à 6) : c'est le reste quand on divise par 7. Pour la 8e brique (:I= 7), le reste est 0 : on repart à la colonne de gauche.QUOT :I 7donne la rangée (0 ou 1) : c'est le nombre de fois que 7 rentre dans:I. Les 7 premières briques sont rangée 0, les suivantes rangée 1.:BXet:BYtransforment colonne et rangée en vraie position à l'écran : on écarte les colonnes de 100 pas et on monte les rangées de 70 pas.
Pas besoin de tout retenir : l'important, c'est de voir qu'avec une boucle et un petit calcul, on place 14 briques sans écrire 14 fois la même chose.
Préparer la partie
On dessine les formes (FORMES), on prépare l'écran, puis on place la
balle blanche au centre-bas et la raquette grise tout en bas :
POUR INITJEU
FORMES
VE FEN CT
DONNE "SCORE 0
FIXETORTUE 0 SPRITE 3 FCC 7 MT LC FXY 0 -100 ; la balle, blanche
DONNE "DX 8 DONNE "DY 8
FIXETORTUE 1 SPRITE 4 FCC 8 MT LC FXY 0 -400 ; la raquette, grise
POSEBRIQUES
FIN
Casser les briques
On passe en revue les 14 briques et, pour chacune, on demande à GoLogo :
« est-ce que la balle la touche ? » C'est le rôle de
COLLISION? : COLLISION? LISTE 0 :B rend
VRAI si la tortue 0 (la balle) et la tortue :B (la brique)
se chevauchent à l'écran. (LISTE 0 :B fabrique juste la petite liste des
deux numéros, par exemple [ 0 5 ].)
Quand ça touche, on fait trois choses :
DEMANDE :B [ CT ]: on s'adresse à la brique:Ble temps d'un ordre et on lui ditCT(Cache Tortue). La brique disparaît. Et comme une tortue cachée ne peut plus toucher personne, cette brique ne sera plus jamais comptée : elle est « cassée » pour de bon.DONNE "DY 0 - :DY: la balle rebondit (on inverse son déplacement vertical, comme contre un mur).DONNE "SCORE :SCORE + 1: un point de plus.
POUR TESTEBRIQUES
REPETEPOUR [ B 2 15 ] [
SI COLLISION? LISTE 0 :B [
DEMANDE :B [ CT ]
DONNE "DY 0 - :DY
DONNE "SCORE :SCORE + 1
]
]
FIN
Une image du jeu
Une « image », c'est tout ce qui se passe en un instant du jeu. Cette fois, on ne rebondit que sur trois murs : gauche, droite et haut. Le bas n'est plus un mur ! On déplace la balle, puis :
SI COLLISION? LISTE 0 1 [ … ]: si la balle touche la raquette, elle repart vers le haut.VALABS :DYrend le déplacement vertical toujours positif (vers le haut), pour qu'elle remonte à coup sûr.SI YCOR < -480 [ BALLEPERDUE ]: si la balle est passée tout en bas sans être rattrapée par la raquette, elle est perdue (on voitBALLEPERDUEjuste après).TESTEBRIQUES: on casse les briques touchées.
Un jeu, au fond, ce n'est que ça : une image, répétée très vite, encore et encore.
POUR FRAME
FIXETORTUE 0
SI XCOR + :DX > 780 [ DONNE "DX 0 - :DX ]
SI XCOR + :DX < -780 [ DONNE "DX 0 - :DX ]
SI YCOR + :DY > 480 [ DONNE "DY 0 - :DY ]
FXY XCOR + :DX YCOR + :DY
SI COLLISION? LISTE 0 1 [ DONNE "DY VALABS :DY ]
SI YCOR < -480 [ BALLEPERDUE ]
TESTEBRIQUES
FIN
Quand la balle est perdue
Si la balle file en bas sans que la raquette la rattrape, elle est perdue. On joue un petit son pour le signaler, puis on la relance de sa position de départ, prête à repartir :
POUR BALLEPERDUE
JOUE "DO ; petit « bip » de balle perdue
FIXETORTUE 0 FXY 0 -100 ; on remet la balle au départ
DONNE "DX 8 DONNE "DY 8 ; et elle repart vers le haut
FIN
Regarde-le jouer tout seul
Avant même d'ajouter les commandes, lance ça : la balle rebondit partout et casse les briques toute seule. Si tu vois les briques disparaître une à une, ton moteur de jeu fonctionne.
POUR DEMO
INITJEU
REPETE 500 [ FRAME ATTENDS 1 ]
FIN
À toi de jouer, pour de vrai
Il ne reste qu'à prendre les commandes. Ajoute la raquette pilotée aux flèches :
POUR BOUGERAQUETTE
FIXETORTUE 1
DONNE "D MANETTE 0
SI :D = 7 [ SI XCOR > -700 [ FXY XCOR - 20 YCOR ] ]
SI :D = 3 [ SI XCOR < 700 [ FXY XCOR + 20 YCOR ] ]
FIN
POUR PARTIE
INITJEU
TANTQUE [ :SCORE < 14 ] [
BOUGERAQUETTE
FRAME
ATTENDS 1
]
FIXETORTUE 0 CT ETIQUETTE [ GAGNE ]
FIN
On appelle la procédure PARTIE. Lance donc
PARTIE et déplace la raquette aux flèches. Quand les 14 briques sont
cassées, tu as gagné. Bravo : tu viens de programmer un jeu vidéo.
- compter les vies : chaque balle perdue en coûte une, et
après 3 balles perdues la partie est finie (affiche
PERDU). Tu as déjàBALLEPERDUE: il ne reste qu'à compter avec une variable ; - afficher le score avec
ETIQUETTE :SCORE; - accélérer la balle à chaque brique cassée ;
- plus de briques, plusieurs rangées de couleurs (
FCC).
Le programme complet
Voici le jeu entier, d'un seul tenant. Recopie tout ça dans l'éditeur
(ED), valide avec Ctrl+S, puis tape
PARTIE pour jouer :
; --- Dessiner les formes : balle (3), raquette (4), brique (5) ---
POUR FORMES
DEFSPRITE 3 [
..XXXX..
.XXXXXX.
XXXXXXXX
XXXXXXXX
XXXXXXXX
XXXXXXXX
.XXXXXX.
..XXXX..
]
DEFSPRITE 4 [
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
]
DEFSPRITE 5 [
XXXXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXXXXXXXXXXXX
]
FIN
; --- Poser les 14 briques rouges en grille (tortues 2 a 15) ---
POUR POSEBRIQUES
REPETEPOUR [ B 2 15 ] [
DONNE "I :B - 2
DONNE "COL RESTE :I 7
DONNE "LIG QUOT :I 7
DONNE "BX 100 * :COL - 300
DONNE "BY 70 * :LIG + 250
FIXETORTUE :B SPRITE 5 FCC 1 MT LC FXY :BX :BY
]
FIN
; --- Preparer la partie : balle blanche (0), raquette grise (1), briques ---
POUR INITJEU
FORMES
VE FEN CT
DONNE "SCORE 0
FIXETORTUE 0 SPRITE 3 FCC 7 MT LC FXY 0 -100
DONNE "DX 8 DONNE "DY 8
FIXETORTUE 1 SPRITE 4 FCC 8 MT LC FXY 0 -400
POSEBRIQUES
FIN
; --- Deplacer la raquette avec les fleches ---
POUR BOUGERAQUETTE
FIXETORTUE 1
DONNE "D MANETTE 0
SI :D = 7 [ SI XCOR > -700 [ FXY XCOR - 20 YCOR ] ]
SI :D = 3 [ SI XCOR < 700 [ FXY XCOR + 20 YCOR ] ]
FIN
; --- Casser les briques touchees par la balle ---
POUR TESTEBRIQUES
REPETEPOUR [ B 2 15 ] [
SI COLLISION? LISTE 0 :B [
DEMANDE :B [ CT ]
DONNE "DY 0 - :DY
DONNE "SCORE :SCORE + 1
]
]
FIN
; --- Balle perdue (passee en bas) : son + relance au depart ---
POUR BALLEPERDUE
JOUE "DO
FIXETORTUE 0 FXY 0 -100
DONNE "DX 8 DONNE "DY 8
FIN
; --- Une image : bouger la balle, rebonds, raquette, briques ---
POUR FRAME
FIXETORTUE 0
SI XCOR + :DX > 780 [ DONNE "DX 0 - :DX ]
SI XCOR + :DX < -780 [ DONNE "DX 0 - :DX ]
SI YCOR + :DY > 480 [ DONNE "DY 0 - :DY ]
FXY XCOR + :DX YCOR + :DY
SI COLLISION? LISTE 0 1 [ DONNE "DY VALABS :DY ]
SI YCOR < -480 [ BALLEPERDUE ]
TESTEBRIQUES
FIN
; --- Lancer une partie (tape PARTIE) ---
POUR PARTIE
INITJEU
TANTQUE [ :SCORE < 14 ] [
BOUGERAQUETTE
FRAME
ATTENDS 1
]
FIXETORTUE 0 CT ETIQUETTE [ GAGNE ]
FIN
Et maintenant ? Explore les programmes exemples, feuillette la référence des commandes, et continue à bricoler. Tu n'es plus en train d'apprendre à programmer : tu programmes.