-
Notifications
You must be signed in to change notification settings - Fork 0
/
util.lsp
146 lines (104 loc) · 4.08 KB
/
util.lsp
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
; ==============================================================================
;
; El mundo de Wumpus
; Versión: 1.0.0b
;
; Javier Honorio Casado Fernández
;
; José Ángel Montelongo Reyes
;
; Universidad de las Palmas de Gran Canaria
;
; ==============================================================================
; util.lsp
(defconstant NORTE '(0 1))
(defconstant SUR '(0 -1))
(defconstant ESTE '(1 0))
(defconstant OESTE '(-1 0))
(defconstant MAXRANDOM 10000)
(defconstant RETROCEDER '(GirarDerecha GirarDerecha Avanzar))
(defconstant ESQUIVAR-DER '(GirarDerecha Avanzar))
(defconstant ESQUIVAR-IZQ '(GirarIzquierda Avanzar))
; ------------------------------------------------------------------------------------------------------------------
; Funciones para gestionar el manejo de listas
; ------------------------------------------------------------------------------------------------------------------
(defun Copiar-Lista (lista)
; copia una lista
(let ((salida nil))
(dolist (elto lista salida)
(setf salida (cons elto salida)))
(reverse salida)))
(defun Añadir-Elemento (lista elto)
; añade "elto" a la "lista"
(cond ((listp elto) (append elto lista))
(t (cons elto lista))))
(defun Extraer-Elemento (lista pos)
; elimina el elemento situado en pos de "lista"
(let (resultado '())
(dotimes (contador (length lista) resultado)
(cond ((not (= contador pos))
(setf resultado (append resultado (list (nth contador lista)))))))))
(defun Eliminar-Elemento (lista dato)
; elimina dato de lista
(let (resultado '())
(dolist (elto lista resultado)
(if (not (equal elto dato))
(setf resultado (cons elto resultado))))
(reverse resultado)))
(defun Esta (lista elto)
; devuelve t si elto esta en "lista"
(let ((resultado nil))
(dolist (dato lista resultado)
(if (equal dato elto) (setf resultado t)))))
; ------------------------------------------------------------------------------------------------------------------
; Funciones para gestionar los movimientos de los agentes
; ------------------------------------------------------------------------------------------------------------------
(defun Avanzar (posicion direccion)
; devuelve posicion
(list (+ (first posicion) (first direccion))
(+ (second posicion) (second direccion))))
(defun Girar-Derecha (direccion)
; devuelve el resultado de girar direccion a la derecha
(cond ((equal direccion norte) ESTE)
((equal direccion este) SUR)
((equal direccion sur) OESTE)
((equal direccion oeste) NORTE)))
(defun Girar-Izquierda (direccion)
; devuelve el resultado de girar direccion a la izquierda
(cond ((equal direccion norte) OESTE)
((equal direccion este) NORTE)
((equal direccion sur) ESTE)
((equal direccion oeste) SUR)))
(defun NumAleatorio ()
; genera un número aleatorio entre 0.0 y 1.0
(float (/ (random MAXRANDOM) maxRandom)))
(defun Esquivar ()
; devuel la lista de tareas para esquivar un muro
(if (equal (random 2) 1) ESQUIVAR-DER
ESQUIVAR-IZQ))
(defun Distancia (origen destino)
; calcula la distancia entro dos ptos
(sqrt (+ (expt (- (first destino) (first origen)) 2)
(expt (- (second destino) (second origen)) 2))))
(defun Distancia-Entero (origen destino)
; calcula la distancia entro dos ptos usando arimética entera
(isqrt (+ (expt (- (first destino) (first origen)) 2)
(expt (- (second destino) (second origen)) 2))))
(defun Mapa-Casilla (mapa posicion)
; devuelve la casilla de "mapa" que esta en "posición"
; si no salimos de las dim devolvemo M = un muro
(if (and (>= (first posicion) 0)
(>= (second posicion) 0)
(< (second posicion) (length mapa))
(< (first posicion) (length (first mapa))))
(nth (first posicion) (nth (- (length mapa) (second posicion) 1) mapa))
'M))
(defun Modificar-Casilla (mapa posicion valor)
; modifica una posicion de "mapa" con "valor"
(if (and (>= (first posicion) 0)
(>= (second posicion) 0)
(< (second posicion) (length mapa))
(< (first posicion) (length (first mapa))))
(setf (nth (first posicion) (nth (- (length mapa) (second posicion) 1) mapa)) valor)
nil))
; util.lsp