Patrones.lsp



;==============================================================================
; RepresentaciOn matricial de figuras geometricas rectangulo y cuadrado
; Se identifica a la figura y se nos dice donde inicia
; La funciOn de inicio es (ColocaFiguras)
;==============================================================================

(setf Display (make-array '(50 50):initial-element '_))		; Espacio muestral

;_______________________________________________________
; Mostrar el contenido de la matriz de ceros y unos
;-------------------------------------------------------
(defun MuestraCuadricula () (print Display) )



;____________________________________________________________
; Coloca al triAngulo y al cuadrado en posiciones aleatorias
;------------------------------------------------------------
(defun ColocaFiguras ()
	(setf XTriangulo (ObtenValor))
	(setf YTriangulo (ObtenValor))
	(setf XCuadro (ObtenValor))
	(setf YCuadro (ObtenValor))
	(DibujaTriangulo XTriangulo YTriangulo)
	(DibujaCuadro XCuadro YCuadro)
	(MuestraCuadricula)
	(EncuentraFiguras)
)

;____________________________________________________________
; Recorre toda la matriz hasta encontrar un "1"
;------------------------------------------------------------
(defun EncuentraFiguras ()
	(dotimes (R 49)
		(dotimes (C 49)
			(if (eql (aref Display R C) 1) (SeEncontro? R C))
		)
	)
)

;__________________________________________________________________
; Controla si fue un triAngulo o un cuadro segUn el "1" encontrado
;------------------------------------------------------------------
(defun SeEncontro? (R C)
	(EsCuadro? R C)
	(EsTriangulo? R C)
)

;_____________________________________________________________________
; Se revisa si con las coordenadas del "1" es el inicio del triAngulo
;---------------------------------------------------------------------
(defun EsTriangulo? (R C)
	(if
		(and 
			(and (and (eql (aref Display R C) 1) (eql (aref Display (+ R 1) (- C 1)) 1) )  (eql (aref Display (+ R 1) (+ C 1) ) 1) )
			(and (eql (aref Display R C) 1) (eql (aref Display (+ R 2) (- C 2)) 1) )
		)
		(TrianguloOK R C)
	)
)
;_____________________________________________________________________
; Se revisa si con las coordenadas del "1" es el inicio del cuadrado
;---------------------------------------------------------------------
(defun EsCuadro? (R C)
	(if (and (and (eql (aref Display R C) 1) (eql (aref Display R (+ C 1)) 1) )  (eql (aref Display (+ R 1) C) 1) ) (CuadroOK R C) )
)

;_____________________________________________________________________
; Se indica que sI se encontrO un triAngulo en la posiciOn (R,C)
;---------------------------------------------------------------------
(defun TrianguloOK (R C)
	(setq x nil)
	(setq x (format nil "Se encontrO un triAngulo en el renglon ~d y columna ~d" R C))
	(print x)
)

;_____________________________________________________________________
; Se indica que sI se encontrO un cuadrado en la posiciOn (R,C)
;---------------------------------------------------------------------
(defun CuadroOK (R C)
	(setq x nil)
	(setq x (format nil "Se encontrO un cuadro en el renglon ~d y columna ~d" R C))
	(print x)
)

;___________________________________________________________________
; Dibuja el cuadro
;___________________________________________________________________
(defun DibujaCuadro (X Y)
	(dotimes (k 6)
		(setf (aref Display X (+ Y k)) 1)		; Parte superior
		(setf (aref Display (+ X 5) (+ Y k)) 1)		; Parte inferior
	)
	(dotimes (k 5)
		(setf (aref Display (+ X k) Y) 1)		; Parte izquierda
		(setf (aref Display (+ X k) (+ Y 5)) 1)		; Parte derecha
	)
)

;___________________________________________________________________
; Dibuja el triAngulo
;___________________________________________________________________
(defun DibujaTriangulo (X Y)
	(setf renglon 0)
	(dotimes (k 6)
		(setf (aref Display (+ X renglon) (+ Y renglon)) 1)
		(setf (aref Display (+ X renglon) (- Y renglon)) 1)
		(setf renglon (+ renglon 1))
	)
	(dotimes (k 9)		; inserta la base
		(setf (aref Display (+ X 5) (+ (- Y 4) k)) 1)
	)
)


;___________________________________________________________________
; Se genera un valor mayor que 5 y menor que 44 para garantizar que
; la figura ( de longitud 6 ) siempre va a quedar bien definida
;___________________________________________________________________
(defun ObtenValor()
	(loop
		(setq X (random 49))
		(if (and (>= X 6) (<= X 43)) (return X))
	)
)