Portail d'enseignement

E Suong
E Suong

Explorer les ressources

Accueil

Documentation technique

Labyrinthe spirale

Fiche de référence du code : fonctionnement, formats et limites. La disponibilité publique dépend de la version publiée.

Sommaire de la fiche

Fiche comparée aux sources, à l’interface et au catalogue le 26 octobre 2026. Voir l’audit commun des neuf activités (../JEUX.md#validation-documentaire). Les comptes de tests et recettes navigateur datés plus bas sont des vérifications historiques, pas un état de validation global actuel.

Accès et objectif

Page publique /rubriques/jeux-labyrinthe-spirale, Défis algorithmiques. Identifiant conservé, placeholder retiré. Adaptation de l’énoncé illustré fourni par le propriétaire : faire sortir un robot initialement au centre d’une spirale de taille inconnue, en six lignes de programme. Aucun programme solution préchargé.

La grille initiale fait 5 × 5 cases, avec le robot orienté vers la droite ; Nouveau labyrinthe choisit une autre taille parmi 5, 7, 9 et une autre orientation parmi quatre. Le programme ne reçoit pas les dimensions. Le corridor unique parcourt toutes les cases jusqu’à une seule ouverture extérieure. Les sens de rotation restent les mêmes après rotation de la grille. Une réussite porte seulement sur le labyrinthe testé ; le message encourage à tester d’autres configurations.

Commandes et interface

avancer() avance d’une case, droite()/gauche() tournent sur place d’un quart de tour. mur_devant() et est_libre() renvoient des booléens LN. Le second devient vrai seulement lorsque le robot franchit l’ouverture extérieure. Toutes ces fonctions sont sans argument ni import. Mur, mouvement après sortie, import ou argument inattendu : erreur localisée. Un test de mur à l’extérieur renvoie FAUX.

SpiralPlayground.svelte fournit éditeur coloré, ligne active, capitalisation des mots-clés au lancement, AFFICHER dans la console et ENTRER intégré. Animation SVG des déplacements et rotations, rayon rouge/vert pour mur_devant, valeurs des capteurs affichées, trace activée par défaut et désactivable. Commandes manuelles pour explorer. Exécuter replace toujours le robot au centre. Pause fige l’animation ; Pas à pas termine un appel (commande OU capteur), puis attend. Arrêter annule l’action inachevée et conserve le dernier état validé. Replacer le robot arrête aussi l’exécution. Nouveau labyrinthe est désactivé pendant une exécution.

Compteur de six lignes : hors lignes vides et commentaires commençant par #, mais avec FIN SI et FIN TANT QUE. Les programmes plus longs restent exécutables ; sortie et respect des six lignes sont distingués dans le message final. Ctrl+Entrée lance/arrête. Code seul sauvegardé sous localStorage labyrinthe-spirale-ln-v1, indépendant des caisses et de l’interpréteur ordinaire. Aucun envoi du programme au serveur. Scène et vitesse non persistantes.

Architecture et limites

src/lib/challenges/spiral.mjs : createSpiralMaze(radius,rotation), initialSpiral, wallAhead, spiralCommand, spiralFrame, restSpiralFrame, countProgramLines, createSpiralExtension. Modèle pur indépendant du DOM ; transitions immuables. Générateur validé pour rayons 1 à 5 (tailles 3 à 11) et rotations 0 à 3. Route ordonnée, ensemble des passages et segments de murs ; état {radius,rotation,x,y,direction,free,moves,commands}. Direction 0 droite, 1 bas, 2 gauche, 3 haut.

startProgram(source,hooks,{kind:‘spiral’,radius,rotation}) réutilise le véritable parseur, runtime et Worker LN. Contexte explicitement autorisé par le Worker ; aucune évaluation JavaScript du programme. Imports désactivés dans ce contexte, fonctions stylo ordinaires inchangées ailleurs. Commande graphique {kind:‘spiral’,name,line,before,after,value} ; le Worker attend graphics-done avant de poursuivre, y compris pour les capteurs. Limite de 2 000 appels par exécution, calcul LN limité à dix secondes hors attentes de rendu/saisie. Les capteurs comptent dans la limite pour éviter une boucle infinie animée.

Durées à vitesse ×1 : déplacement 480 ms, rotation 350 ms, capteur 220 ms ; vitesses proposées ×0,25, ×0,5, ×1 (par défaut), ×2, ×3, ×5 et ×10, modifiables pendant l’exécution. Interpolation pure testable, rotation courte même au passage de 0°. Le renderer ne valide le modèle qu’au dernier frame. Identifiant de session, annulation RAF, résolution des attentes et terminaison Worker empêchent les anciens callbacks de modifier une nouvelle exécution.

Pour d’autres labyrinthes : séparer génération des murs, état du robot et objectif ; conserver le contrat des capteurs et l’acquittement des animations. Ne pas exposer des chemins de modules ou du code hôte arbitraire au LN.

Validation

tests/spiral.test.mjs : géométrie, unicité de sortie, murs/passages, immutabilité, collisions, rotations, compte de lignes, interpolation, extension isolée et erreurs localisées, limite des capteurs, attente hors budget et arrêt. Une solution LN de six lignes est exécutée sur les vingt couples taille/orientation du moteur (sans être proposée aux élèves). Relancer également les suites LN et caisses. Contrôles navigateur : sortie animée, capteurs, pause/pas à pas, arrêt et changement de labyrinthe. Pas de test tactile sur appareil physique.

← Retour à la documentation