; .EnTete "Le-Lisp (c) version 15.2" " " "V D T"
; .EnPied " " "%" " "
; .Chapitre 11 "V D T"
;
; .Centre "*****************************************************************"
; .Centre " Ce fichier est en lecture seule hors du projet ALE de l'INRIA. "
; .Centre " Il est maintenu par ILOG SA, 2 Avenue Gallie'ni, 94250 Gentilly "
; .Centre " (c) Le-Lisp est une marque de'pose'e de l'INRIA "
; .Centre "*****************************************************************"
; .Centre "$Header: vdt.ll,v 4.1 88/01/13 12:24:57 kuczynsk Rel $"
(unless (>= (version) 15.2)
(error 'load 'erricf 'vdt))
; Petite de'monstration de l'utilisation des fonctions
; du terminal virtuel, de l'art de
; l'animation vide'o et de sa proble'matique en Lisp :
; - utilisation de la fonction TYS
; - e'viter les "garbage-collections"
; - avec une vitesse inde'pendante de la taille des objets
(de vdt ()
(let ((dir 'd) ; la direction du ver (en symbolique).
(lobst) ; la liste des obstacles
(chemin) ; le chemin du ver.
(ochemin) ; le chemin du coup pre'ce'dent.
(taille) ; la taille du ver.
(x (div (tyxmax) 2)) ; la position actuelle de la
(y (div (tyymax) 2)) ; te↑te du lombric.
(xy) ; la position packe'e.
(cou) ; la position du cou de la be↑te.
(score 0) ; comme son nom l'indique.
(mscore 0)) ; les milliers (du score)
;
; 1) dessine le cadre
;
(typrologue)
(tycls)
(tyattrib ())
(tyco 10 0 '#"*** V . D . T . *** Score :")
(tycursor 0 1)
(repeat (tyxmax) (tyo #/.))
(tycursor 0 (tyymax))
(repeat (tyxmax) (tyo #/.))
(let ((y 1))
(repeat (1- (tyymax))
(tyco 0 y #/.)
(tyco (tyxmax) y #/.)
(incr y)))
;
; 2) fabrique le 1er lombric et la liste des obstacles.
;
(repeat (setq taille 5)
(newl chemin (+ (* y 128) (incr x))))
(mapc (lambda (x y)
(newl lobst (+ (* y 128) x))
(tyco x y #/*))
(list 10 10 (- (tyxmax) 10)
(- (tyxmax) 10) (div (tyxmax) 2))
(list 5 (- (tyymax) 5) 5 (- (tyymax) 5)
(div (tyymax) 2))
)
;
; 3) la boucle principale
;
; une petite attente ... pour se preparer
(tyflush)
(repeat 2 (gc))
(untilexit vdt
; de'codage de la commande
(selectq (tys)
((#/s #/h #:tty:left) (if (neq dir 'd) (setq dir 'g)))
((#/f #/l #:tty:right) (if (neq dir 'g) (setq dir 'd)))
((#/c #/j #:tty:down) (if (neq dir 'h) (setq dir 'b)))
((#/e #/k #:tty:up) (if (neq dir 'b) (setq dir 'h)))
(#↑C (exit vdt))
(())
(t (tybeep)))
; on efface la queue
(setq ochemin chemin)
(tyco (rem (car chemin) 128)
(div (nextl chemin) 128)
#/ )
; a-t-il fait ou` on lui disait de faire ?
(when (= (rem score 100) 99)
(newl lobst (car ochemin))
(tyco (rem (car ochemin) 128)
(div (car ochemin) 128)
#/* ))
; on calcule la nouvelle position
(selectq dir
(g (decr x) (when (<= x 0) (exit vdt)))
(d (incr x) (when (>= x (tyxmax)) (exit vdt)))
(h (decr y) (when (<= y 1) (exit vdt)))
(b (incr y) (when (>= y (tyymax)) (exit vdt)))
(t ()))
; grandit-il ?
(when (= (rem score 20) 10)
(newl chemin (car ochemin))
(tycursor 60 0)
(tyod (incr taille) 3))
; test si le lombric se coupe ou se cogne
(setq xy (+ (* y 128) x))
(when (or (memq xy chemin) (memq xy lobst))
(exit vdt))
; on l'ajoute au chemin sans vraiment "conser"
(setq cou (last chemin))
(rplacd cou (rplac ochemin xy ()))
; et on affiche le cou et la tete
(tyco (rem (car cou) 128) (div (car cou) 128) #/o)
(tyco x y #/@)
; affiche le score la aussi sans "conser"
(when (>= (incr score) 1000)
(setq score 0)
(tycursor 50 0)
(tyod (incr mscore) 3))
(tycursor 53 0)
(tyod score 3)
; l'attente programme'e
(when (< taille 150)
(repeat 500)
(when (< taille 100)
(repeat 100)
(when (< taille 50)
(repeat 2000)
(when (< taille 20)
(repeat 500)
(when (< taille 10)
(repeat 5000))))))
)
; pour ne pas effacer le score.
(tyco 0 (1- (tyymax)) '#"Vous vous etes tamponne."))
(tyflush)
'vdt)))))
(de vdtend ()
(mapc 'remfn '(vdt vdtend))
(libautoload vdt vdt))