Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (define ANCHO 600) ; ancho de la escena donde se encuentra la mosca
- (define ALTO 600) ; alto de la escena donde se encuentra la mosca
- (define DELTA 60) ; cantidad de movimiento de la mosca en cada paso
- ; El estado del sistema será un par de numeros que representan la coordenada x e y de una mosca, respectivamente
- ; Estado inicial del sistema:
- (define Inicio (make-posn (/ ANCHO 2) (/ ALTO 2)))
- (define radiomosca 20) ; radio del circulo que representa a la mosca
- (define GAMMA radiomosca) ; distancia aceptada para atrpar a la mosca
- (define mosca (circle radiomosca "solid" "black")) ; gráfico de la mosca
- (define ESTADO-FINAL (make-posn -100 -100)) ; estado imposible de llegar normalmente donde consideraremos terminado el juego
- ; pantalla : make-posn -> Image
- ; transforma el estado del sistema en una imagen a mostrar a través de la cláusula to-draw
- ; la imagen se muestra dado el par, o muestra un texto si llegamos a ESTADO-FINAL
- (define (pantalla p) (if (end? p) (text "MOSCA ATRAPADA" 56 "Green") (place-image mosca (posn-x p) (posn-y p) (empty-scene ANCHO ALTO)) ) )
- ; elegir-random : A B -> A or B
- ; tomando dos valores cualesquiera, la función devuelve alguno de esos dos valores, aleatoriamente
- (define (elegir-random a b) (if (= (random 2) 0) a b))
- ; tecla : make-posn Key -> make-posn
- ; transforma el estado del sistema en otro donde la mosca se ha movido DELTA unidades
- ; la dirección del movimiento está dada por la dirección de Key
- ; el movimiento sólo se efectúa si realizándolo la mosca no se escapa de la pantalla visible
- (define (tecla I k) (cond ((key=? k "left") (if (>= (- (posn-x I) DELTA) radiomosca) (make-posn (- (posn-x I) DELTA) (posn-y I)) I))
- ((key=? k "right") (if (<= (+ (posn-x I) DELTA) (- ANCHO radiomosca)) (make-posn (+ (posn-x I) DELTA) (posn-y I)) I) )
- ((key=? k "up") (if (>= (- (posn-y I) DELTA) radiomosca) (make-posn (posn-x I) (- (posn-y I) DELTA)) I))
- ((key=? k "down") (if (<= (+ (posn-y I) DELTA) (- ALTO radiomosca)) (make-posn (posn-x I) (+ (posn-y I) DELTA)) I))
- (else I)
- ))
- ; mousehandler : make-posn Number Number -> make-posn
- ; transforma el estado del sistema en ESTADO-FINAL si clickeamos dentro del rango aceptable para ganar el juego dada la constante GAMMA
- ; de otro modo el estado del sistema se mantiene
- (define (mousehandler I x y event) (cond ((string=? event "button-down") (if (or (<= (abs (- (posn-x I) x)) GAMMA) (<= (abs (- (posn-y I) y)) GAMMA)) ESTADO-FINAL I ))
- (else I)
- ))
- ; randmov : make-posn -> make-posn
- ; transforma el estado del sistema en otro donde la mosca se mueva en dirección elegida aleatoriamente
- (define (randmov I) (if (elegir-random #t #f) I ;#t -> quedarse, #f -> moverse
- (if (elegir-random #t #f) ;#t -> moverse vertical, #f -> moverse horizontal
- (if (elegir-random #t #f) ;#t -> moverse arriba, #f -> moverse abajo
- (tecla I "up") (tecla I "down"))
- (if (elegir-random #t #f) ;#t -> moverse izquierda, #f -> moverse derecha
- (tecla I "left") (tecla I "right")))))
- ; randmov : make-posn -> Boolean
- ; comprueba si el juego ha termiado cuando el estado del sistema equivale a ESTADO-FINAL
- (define (end? I) (if (= (posn-x I) (posn-x ESTADO-FINAL)) #t #f))
- ; Expresión big-bang que responde al mouse, incorporando además una condición para terminar la ejecución del programa
- ; Inicialmente, se invoca a la función pantalla con el estado inicial.
- ; Luego, por cada tick del reloj, la mosca se mueve aleatoriamente
- ; El controlador de eventos del mouse chequea si hemos clickeado a la mosca dentro del rango aceptable GAMMA
- ; Finalmente paramos cuando nuestra función end? retorna verdadero
- (big-bang Inicio
- (to-draw pantalla)
- (on-tick randmov)
- (on-mouse mousehandler)
- (stop-when end?)
- )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement