;============================================================================== ; 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)) ) )