~herlock_sholmes/PensamientoComputacional

ref: b911fbf88147a773456c0cfdd657c832bb780e00 PensamientoComputacional/EjemplosLisp/CommonLisp/la-casa-del-mago.lisp -rw-r--r-- 2.5 KiB
b911fbf8Herlock Sholmes 00013: se actualiza archivo la-casa-del-mago.lisp 1 year, 5 months ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
;;; Pruebas de condicionales en clisp
;;; Recordar que para correr el programa primero se debe compilar
;;; en sbcl eso es (load (compile-file "nombre-archivo.lisp"))


;; Definiendo los nodos del grafo terreno de juego.

(defparameter *nodos* '((living (estás en el living.
                                 un hechicero está durmiendo en el sillón.))
                        (jardín (estás en el jardín.
                                 hay un pozo frente a ti.))
                        (segundo-piso (estás en el segundo piso.
                                       hay un gran caldero en el centro de la habitación.))))

;; Definiendo la función que permite trabajar con el alist.

(defun describir-lugar (lugar nodos)
  (cadr (assoc lugar nodos)))

;; Definiendo las aristas del grafo terreno de juego.

(defparameter *arista* '((living (jardín derecha puerta)
                           (segundo-piso arriba escalera))
                          (jardín (living izquierda puerta))
                          (segundo-piso (living abajo escalera))))

;; Definiendo la función que permite conocer los caminos.

(defun describir-camino (arista)
  `(hay una ,(caddr arista) que te conduce ,(cadr arista) de aquí.))

;; Definiendo una función que es capaz de describir más de un camino

(defun describir-caminos (lugar arista)
  (apply #'append (mapcar #'describir-camino (cdr (assoc lugar arista)))))

;; Definiendo los objetos para el puzzle

(defparameter *objetos* '(cerveza rana escoba cadena))

;; Definiendo la ubicación de los objetos

(defparameter *ubicacion-objetos* '((cerveza segundo-piso)
                                    (rana living)
                                    (escoba living)
                                    (cadena jardín)))

;; Definiendo una función que permita ubicar los objetos en su lugar

(defun objeto-en (lug objs lug-objs)
  (labels ((en-lug-p (obj)
             (eq (cadr (assoc obj lug-objs)) lug)))
    (remove-if-not #'en-lug-p objs)))

;; Describiendo los objetos visibles

(defun describir-objetos (lug objs lug-objs)
  (labels ((describir-obj (obj)
             `(puedes ver una ,obj en el piso.)))
    (apply #'append (mapcar #'describir-obj (objeto-en lug objs lug-objs)))))

;; Determinar el lugar inicial de la jugadora

(defparameter *ubicacion* 'living)

;; Definir una función para mirar en la ubicación

(defun mirar ()
  (append (describir-lugar *ubicacion* *nodos*)
          (describir-caminos *ubicacion* *arista*)
          (describir-objetos *ubicacion* *objetos* *ubicacion-objetos*)))