~herlock_sholmes/PensamientoComputacional

ref: 922d1612a606be140d83a2d6742d0608e793203d PensamientoComputacional/EjemplosLisp/CommonLisp/la-casa-del-mago.lisp -rw-r--r-- 3.3 KiB
922d1612Herlock Sholmes 00014: 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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
;;; 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*)))

;; Definir una función para caminar

(defun caminar (direccion)
  (let ((siguiente (find direccion
                         (cdr (assoc *ubicacion* *nodos*))
                         :key #'cadr)))
    (if siguiente
        (progn (setf *ubicacion* (car siguiente))
               (mirar))
        '(no puedes ir en esa dirección.))))

;; Definir una función que permite recoger los objetos

(defun recoger (objeto)
  (cond ((member objeto
                 (objeto-en *ubicacion* *objetos* *ubicacion-objetos*))
         (push (list objeto 'cuerpo) *ubicacion-objetos*)
         `(ahora llevas contigo la ,objeto))
        (t '(no puedes recoger eso.))))

;; Definir una función para revisar el inventario

(defun inventario ()
  (cons 'items- (objeto-en 'cuerpo *objetos* *ubicacion-objetos*)))