Vous pouvez vous souvenir ou non de Xeyes, un programme de démonstration fourni avec (et, autant que je sache, toujours livré avec) le système de fenêtre X. Son but était de dessiner une paire d'yeux qui suivaient le curseur de votre souris:
Votre défi est de recréer Xeyes avec de l'art ASCII. Ecrivez un programme ou une fonction qui dessine deux yeux de dessin ASCII (spécifiés ci-dessous) lorsque l'utilisateur clique dessus, puis déplace leurs élèves vers la direction du curseur.
Le fichier GIF ci-dessus est un enregistrement de cette implémentation de Ruby sans jeu , qui peut être exécutée avec n’importe quelle version récente de Ruby. Vous pouvez également le trouver utile comme référence pour les séquences de contrôle Xterm.
Caractéristiques
C'est du code-golf , donc la solution avec le moins d'octets gagne.
Ceci est un ascii-art défi, de sorte que votre programme doit dessiner en utilisant ASCII des caractères spécifiquement, les personnages -
, .
, |
, '
, 0
, l' espace, et retour à la ligne. 1 2
Il s’agit d’un défi interactif , votre programme doit donc accepter les entrées et en tirer les sorties en temps réel. 3
Avant que votre programme ne commence à accepter les entrées, il doit initialiser un canevas vierge d'au moins 20 lignes et 20 colonnes. Il ne faut rien dessiner tant que l'utilisateur n'a pas cliqué sur la toile.
Chaque fois que l'utilisateur clique sur 4 sur le canevas, le programme doit effacer toute sortie précédente, puis dessiner ces yeux ASCII sur le canevas, centrés sur le caractère le plus proche de l'emplacement du curseur de la souris. 5 6 (Ci-dessous, ✧
représente le curseur de la souris et ne doit pas être tracé.)
.---. .---.
| | | |
| 0|✧|0 |
| | | |
'---' '---'
Notez comment les élèves "pointent" vers le curseur.
Chaque fois que le curseur de la souris se déplace sur le canevas, le programme doit redessiner les pupilles pour qu’elles continuent de pointer vers le curseur, 7 par exemple:
✧
.---. .---.
| 0| | 0|
| | | |
| | | |
'---' '---'
Élève pointant
Supposons que nous énumérions les positions des neuf caractères internes de chaque œil comme ceci:
.---.
|678|
|591|
|432|
'---'
L'élève sera tiré à l'un des emplacements 1
- 9
. Pour décider lequel, supposez que les caractères sont carrés et que le canevas est une grille cartésienne, avec le centre du 9
caractère à (0, 0), le centre de 1
à (1, 0), etc. Lorsque le programme reçoit une entrée (un clic ou un mouvement), il doit mapper l'emplacement de l'entrée sur la coordonnée de grille la plus proche. Si 𝑀 est égal à (0, 0), l'élève doit être tracé à (0, 0), c'est-à-dire l'emplacement de ce qui 9
précède. Sinon, dessinez comme décrit ci-dessous.
Imaginons un plan cartésien superposé sur la grille et divisée en octants numérotée une - huit :
Si 𝑀 se situe dans l’octant 1 , la pupille doit être dessinée à l’emplacement 1
ci-dessus, c’est-à-dire à (1, 0). Si 𝑀 est en octant 2, il devrait être tracé à 2
- et ainsi de suite. Pour illustrer, l'image ci-dessous montre une partie de la grille codée par couleur en fonction du lieu où la pupille doit être dessinée lorsque le curseur de la souris se trouve à un emplacement particulier. Lorsque, par exemple, le curseur se trouve sur l’une des coordonnées vertes (en gardant à l’esprit que les coordonnées de la grille se situent au centre des carrés, et non à leurs angles), l’élève doit être tracé à 4
.
Les pupilles des deux yeux se déplacent indépendamment. Pour chaque œil, répétez le processus avec par rapport au centre de cet œil.
Remarques
Ce n'est pas un défi de sortie graphique . La sortie doit être une grille de caractères. Vous pouvez bien sûr utiliser des routines graphiques pour dessiner une grille de caractères.
Les espaces peuvent être dessinés (ou plutôt non dessinés) mais cela convient. Une place vide dans la grille ressemble à un caractère d'espacement et sera considérée comme équivalente.
"Temps réel" est défini ici comme moins de 200 ms entre l'entrée et la sortie correspondante en cours d'affichage.
Il est à votre discrétion de savoir quel (s) bouton (s) de souris sont observés pour la saisie et si appuyer ou relâcher constitue un "clic".
La toile doit être nettoyée ou l’équivalent visuel doit être atteint. Avec une solution basée sur un terminal, par exemple, imprimer une nouvelle toile en dessous de la toile précédente n'est pas considéré comme équivalent.
Lorsque l'utilisateur clique près du bord de la toile de sorte que certains des caractères oculaires soient dessinés au-delà de son bord, le comportement n'est pas défini. Toutefois, le programme doit continuer à s'exécuter normalement lors de clics ultérieurs.
Lorsque le curseur de la souris quitte le "canevas", le comportement n'est pas défini, mais le programme doit continuer à s'exécuter normalement lorsque le curseur entre à nouveau dans le canevas.
Un curseur de texte peut apparaître sur la toile tant qu'il n'obscurcit pas la sortie.
Les failles standard sont interdites.
<pre>
ou font-family:monospace
).