Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;; Integrantes: Oriana Reschini R-4087/8
- ;; Lisandro Maselli M-6500/5
- (require "extras.rkt")
- ;; Definiciones principales:
- ;; ========================
- (define LABERINTO (bitmap "laberinto.png"))
- (define FANTASMA (bitmap "fantasma.png"))
- (define ALTO (image-height LABERINTO))
- (define ANCHO (image-width LABERINTO))
- (define CENTRO (make-posn (/ ANCHO 2) (/ ALTO 2)))
- (define POS-INICIAL (make-posn 16 40))
- (define POS-OBJETIVO (make-posn 930 460))
- ; Definimos una constante JUGADOR que representa el jugador.
- (define JUGADOR (circle 15 "solid" "blue"))
- ; Definimos una constante OBJETIVO que representa el objetivo al que debe llegar el jugador.
- (define OBJETIVO (star 16 "solid" "black"))
- ; Definimos una constante DELTA que representa la cantidad de píxeles que se mueve FANTASMA y JUGADOR.
- (define DELTA 7)
- ; Definimos POS-TIMER-X y POS-TIMER-Y para ayudarnos a ubicar el timer en la posición pedida.
- (define POS-TIMER-X 30)
- (define POS-TIMER-Y 7)
- ; Definimos una constante DELTIEMPO que representa la cantidad de ???????????????????????????????
- (define DELTIEMPO 0.01)
- ; Definimos una constante TIEMPO que representa la cantidad de ??????????????????????????? que durará el juego.
- (define TIEMPO 15)
- ; Definimos una constante POS-FANTASMA que representa la posición del fantasma.
- ; La coordenada x toma un valor pseudo-aleatorio dentro del ANCHO y la coordenada y, la mitad del
- ; alto de FANTASMA pero negativo para que no aparezca en LABERINTO.
- (define POS-FANTASMA (make-posn (random ANCHO) (- (/ (image-height FANTASMA) 2))))
- ; Definimos una constante VIDAS que representa la cantidad de vidas inicial.
- (define VIDAS 5)
- ; Definimos POS-VIDAS-X y POS-VIDAS-Y para ayudarnos a ubicar las vidas restantes en la posición pedida.
- (define POS-VIDAS-X 950)
- (define POS-VIDAS-Y 7)
- ; Definimos una constante TAMAÑO-TEXT que representa el tamaño del texto que indica la cantidad de vidas y tiempo restantes.
- (define TAMAÑO-TEXT 18)
- ; Definimos una constante COLOR-TEXT que representa el color del texto que indica la cantidad de vidas y tiempo restantes.
- (define COLOR-TEXT "blue")
- ;; Estado global del programa:
- ;; ==========================
- (define-struct estado [jugador timer fantasma vidas])
- ; estado es (make-estado [posn Number posn Number]
- ; jugador representa la posición de JUGADOR.
- ; timer representa la cantidad de ???????????????????????????? restantes.
- ; fantasma representa la posición de FANTASMA.
- ; vidas representa la cantidad de vidas restantes.
- ; Definimos una constante estado-inicial que representa el estado inicial del sistema.
- (define estado-inicial (make-estado POS-INICIAL TIEMPO POS-FANTASMA VIDAS))
- ;; actualizar-timer : Number Estado -> Estado
- ;; Recibe un número y un estado, y devuelve el mismo estado cambiando timer por el número dado.
- (check-expect (actualizar-timer 5 (make-estado (make-posn 2 4) 10 (make-posn 6 12) 4)) (make-estado (make-posn 2 4) 5 (make-posn 6 12) 4))
- (check-expect (actualizar-timer 2.2 (make-estado (make-posn 15 40) 30 (make-posn 8 5) 1)) (make-estado (make-posn 15 40) 2.2 (make-posn 8 5) 1))
- (check-expect (actualizar-timer 120 (make-estado (make-posn 10 50) 100 (make-posn 80 60) 2)) (make-estado (make-posn 10 50) 120 (make-posn 80 60) 2))
- (define (actualizar-timer val e) (make-estado (estado-jugador e) val (estado-fantasma e) (estado-vidas e)))
- ;; actualizar-vidas : Number Estado -> Estado
- ;; Recibe un número y un estado, y devuelve el mismo estado cambiando vidas por el número dado.
- (check-expect (actualizar-vidas 4 (make-estado (make-posn 5 10) 15 (make-posn 20 40) 5)) (make-estado (make-posn 5 10) 15 (make-posn 20 40) 4))
- (check-expect (actualizar-vidas 0 (make-estado (make-posn 100 120) 3 (make-posn 150 180) 2)) (make-estado (make-posn 100 120) 3 (make-posn 150 180) 0))
- (check-expect (actualizar-vidas 2 (make-estado (make-posn 7 7) 50 (make-posn 1 1) 3)) (make-estado (make-posn 7 7) 50 (make-posn 1 1) 2))
- (define (actualizar-vidas n e) (make-estado (estado-jugador e) (estado-timer e) (estado-fantasma e) n))
- ;; actualizar-fantasma : Posn Estado -> Estado
- ;; Recibe un posn y un estado, y devuelve el mismo estado cambiando fantasma por el posn dado.
- (check-expect (actualizar-fantasma (make-posn 0 0) (make-estado (make-posn 1 2) 40 (make-posn 5 5) 5)) (make-estado (make-posn 1 2) 40 (make-posn 0 0) 5))
- (check-expect (actualizar-fantasma (make-posn 10 6) (make-estado (make-posn 3 8) 2 (make-posn 20 20) 1)) (make-estado (make-posn 3 8) 2 (make-posn 10 6) 1))
- (check-expect (actualizar-fantasma (make-posn 15 2) (make-estado (make-posn 50 3) 80 (make-posn 1 1) 3)) (make-estado (make-posn 50 3) 80 (make-posn 15 2) 3))
- (define (actualizar-fantasma posn e) (make-estado (estado-jugador e) (estado-timer e) posn (estado-vidas e)))
- ;; actualizar-jugador : Posn Estado -> Estado
- ;; Recibe un posn y un estado, y devuelve el mismo estado cambiando jugador por el posn dado.
- (check-expect (actualizar-jugador (make-posn 50 50) (make-estado (make-posn 25 25) 1 (make-posn 60 60) 5)) (make-estado (make-posn 50 50) 1 (make-posn 60 60) 5))
- (check-expect (actualizar-jugador (make-posn 120 10) (make-estado (make-posn 5 2) 10 (make-posn 5 15) 2)) (make-estado (make-posn 120 10) 10 (make-posn 5 15) 2))
- (check-expect (actualizar-jugador (make-posn 15 180) (make-estado (make-posn 0 0) 50 (make-posn 2 2) 4)) (make-estado (make-posn 15 180) 50 (make-posn 2 2) 4))
- (define (actualizar-jugador posn e) (make-estado posn (estado-timer e) (estado-fantasma e) (estado-vidas e)))
- ;; Imprimir en la pantalla:
- ;; =======================
- ;; dibujar-imagen : Image Posn Image -> Image
- ;; Recibe una imagen, una posición y una base, y devuelve una imagen.
- ;; Coloca la imagen en la posición dada en la base.
- (check-expect (dibujar-imagen (circle 5 "solid" "magenta") (make-posn 2 8) (empty-scene 50 50)) (place-image (circle 5 "solid" "magenta") 2 8 (empty-scene 50 50)))
- (check-expect (dibujar-imagen (rectangle 8 8 "solid" "red") (make-posn 0 7) (circle 30 "solid" "blue")) (place-image (rectangle 8 8 "solid" "red") 0 7 (circle 30 "solid" "blue")))
- (check-expect (dibujar-imagen (ellipse 50 20 "outline" "yellow") (make-posn 15 4) (empty-scene 70 50)) (place-image (ellipse 50 20 "outline" "yellow") 15 4 (empty-scene 70 50)))
- (define (dibujar-imagen imagen e base) (place-image imagen (posn-x e) (posn-y e) base))
- ;; dibujar-laberinto : Image -> Image
- ;; Recibe una imagen y coloca LABERINTO centrado en ella.
- (check-expect (dibujar-laberinto (circle 20 "solid" "blue")) (dibujar-imagen LABERINTO CENTRO (circle 20 "solid" "blue")))
- (check-expect (dibujar-laberinto (rectangle 2 4 "outline" "red")) (dibujar-imagen LABERINTO CENTRO (rectangle 2 4 "outline" "red")))
- (check-expect (dibujar-laberinto (ellipse 100 80 "solid" "orange")) (dibujar-imagen LABERINTO CENTRO (ellipse 100 80 "solid" "orange")))
- (define (dibujar-laberinto x) (dibujar-imagen LABERINTO CENTRO x))
- ;; dibujar-jugador : Estado Image -> Image
- ;; Recibe un estado y la base y coloca el jugador en la posición dada por el estado.
- (check-expect (dibujar-jugador (make-estado (make-posn 8 5) 5 (make-posn 1 1) 2) (rectangle 10 15 "outline" "blue")) (dibujar-imagen JUGADOR (make-posn 8 5) (rectangle 10 15 "outline" "blue")))
- (check-expect (dibujar-jugador (make-estado (make-posn 100 25) 2 (make-posn 3 5) 1) (circle 75 "solid" "red")) (dibujar-imagen JUGADOR (make-posn 100 25) (circle 75 "solid" "red")))
- (check-expect (dibujar-jugador (make-estado (make-posn 75 150) 3 (make-posn 50 50) 2) (empty-scene 100 100)) (dibujar-imagen JUGADOR (make-posn 75 150) (empty-scene 100 100)))
- (define (dibujar-jugador e x) (dibujar-imagen JUGADOR (estado-jugador e) x))
- ;; dibujar-objetivo : Image -> Image
- ;; Recibe una imagen y coloca el OBJETIVO en la posición dada por POS-OBJETIVO en ella.
- (check-expect (dibujar-objetivo (empty-scene 100 100)) (dibujar-imagen OBJETIVO POS-OBJETIVO (empty-scene 100 100)))
- (check-expect (dibujar-objetivo (circle 25 "outline" "green")) (dibujar-imagen OBJETIVO POS-OBJETIVO (circle 25 "outline" "green")))
- (check-expect (dibujar-objetivo (rectangle 50 80 "solid" "indigo")) (dibujar-imagen OBJETIVO POS-OBJETIVO (rectangle 50 80 "solid" "indigo")))
- (define (dibujar-objetivo x) (dibujar-imagen OBJETIVO POS-OBJETIVO x))
- ;; dibujar-timer : Estado Image -> Image
- ;; Recibe un estado y una imagen y coloca el timer en la posición pedida.
- ;(check-expect (dibujar-timer (make-estado (make-posn 5 3) 8 (make-posn 10 15) 1) (empty-scene 140 100))
- ; (dibujar-imagen (text (make-estado (make-posn 5 3) 8 (make-posn 10 15) 1) TAMAÑO-TEXT COLOR-TEXT) (make-posn (- ANCHO POS-TIMER-X) (- ALTO POS-TIMER-Y)) (empty-scene 140 100)))
- ; .............................................
- (define (dibujar-timer x image) (dibujar-imagen (text x TAMAÑO-TEXT COLOR-TEXT) (make-posn (- ANCHO POS-TIMER-X) (- ALTO POS-TIMER-Y)) image))
- ;; dibujar-vidas : Estado Image -> Image
- ;; Recibe un estado y una imagen y coloca el número de vidas restantes en la posición pedida.
- (check-expect (dibujar-vidas (make-estado (make-posn 10 10) 15 (make-posn 20 30) 5) (empty-scene 150 200))
- (dibujar-imagen (text (number->string 5) TAMAÑO-TEXT COLOR-TEXT) (make-posn (- ANCHO POS-VIDAS-X) (- ALTO POS-VIDAS-Y)) (empty-scene 150 200)))
- (check-expect (dibujar-vidas (make-estado (make-posn 80 50) 30 (make-posn 0 0) 2) (circle 25 "solid" "black"))
- (dibujar-imagen (text (number->string 2) TAMAÑO-TEXT COLOR-TEXT) (make-posn (- ANCHO POS-VIDAS-X) (- ALTO POS-VIDAS-Y)) (circle 25 "solid" "black")))
- (check-expect (dibujar-vidas (make-estado (make-posn 35 47) 180 (make-posn 1 15) 30) (rectangle 50 75 "outline" "yellow"))
- (dibujar-imagen (text (number->string 30) TAMAÑO-TEXT COLOR-TEXT) (make-posn (- ANCHO POS-VIDAS-X) (- ALTO POS-VIDAS-Y)) (rectangle 50 75 "outline" "yellow")))
- (define (dibujar-vidas x image) (dibujar-imagen (text (number->string (estado-vidas x)) TAMAÑO-TEXT COLOR-TEXT) (make-posn (- ANCHO POS-VIDAS-X) (- ALTO POS-VIDAS-Y)) image))
- ;; dibujar-texto : String Image -> Image
- ;; Recibe un string y una imagen y coloca el string en el centro de la imagen.
- (check-expect (dibujar-texto "hola" (empty-scene 160 180)) (dibujar-imagen (text "hola" 100 "white") CENTRO (empty-scene 160 180)))
- (check-expect (dibujar-texto "GANASTE" (circle 80 "solid" "red")) (dibujar-imagen (text "GANASTE" 100 "white") CENTRO (circle 80 "solid" "red")))
- (check-expect (dibujar-texto "GAME OVER" (rectangle 300 250 "outline" "green")) (dibujar-imagen (text "GAME OVER" 100 "white") CENTRO (rectangle 300 250 "outline" "green")))
- (define (dibujar-texto string image) (dibujar-imagen (text string 100 "white") CENTRO image))
- ;; dibujar-fantasma : Estado Image -> Image
- ;; Recibe un estado y una imagen y coloca FANTASMA en la posición dada por el campo fantasma del estado en la imagen.
- (check-expect (dibujar-fantasma (make-estado (make-posn 35 40) 5 (make-posn 0 0) 2) (empty-scene 150 220)) (dibujar-imagen FANTASMA (make-posn 0 0) (empty-scene 150 220)))
- (check-expect (dibujar-fantasma (make-estado (make-posn 8 4) 7 (make-posn 40 60) 1) (circle 80 "outline" "red")) (dibujar-imagen FANTASMA (make-posn 40 60) (circle 80 "outline" "red")))
- (check-expect (dibujar-fantasma (make-estado (make-posn 9 9) 2 (make-posn 8 6) 6) (rectangle 20 8 "solid" "blue")) (dibujar-imagen FANTASMA (make-posn 8 6) (rectangle 20 8 "solid" "blue")))
- (define (dibujar-fantasma e x) (dibujar-imagen FANTASMA (estado-fantasma e) x))
- ;; fondo : Color -> Image
- ;; Recibe un color y devuelve una escena de ANCHO por ALTO cantidad de píxeles del color dado.
- (check-expect (fondo "magenta") (rectangle ANCHO ALTO "solid" "magenta"))
- (check-expect (fondo "purple") (rectangle ANCHO ALTO "solid" "purple"))
- (check-expect (fondo "gray") (rectangle ANCHO ALTO "solid" "gray"))
- (define (fondo color) (rectangle ANCHO ALTO "solid" color))
- ;; imprimir : Estado Color -> Image
- ;; Recibe un estado y un color y dibuja LABERINTO, OBJETIVO, JUGADOR, FANTASMA, TIMER y VIDAS en el fondo.
- (check-expect (imprimir (make-estado (make-posn 2 2) 5 (make-posn 8 2) 1) "green")
- (dibujar-vidas (make-estado (make-posn 2 2) 5 (make-posn 8 2) 1) (dibujar-timer (number->string (exact->inexact 5))
- (dibujar-fantasma (make-estado (make-posn 2 2) 5 (make-posn 8 2) 1)
- (dibujar-jugador (make-estado (make-posn 2 2) 5 (make-posn 8 2) 1)
- (dibujar-objetivo
- (dibujar-laberinto
- (fondo "green"))))))))
- (check-expect (imprimir (make-estado (make-posn 15 40) 9 (make-posn 70 50) 6) "gold")
- (dibujar-vidas (make-estado (make-posn 15 40) 9 (make-posn 70 50) 6) (dibujar-timer (number->string (exact->inexact 9))
- (dibujar-fantasma (make-estado (make-posn 15 40) 9 (make-posn 70 50) 6)
- (dibujar-jugador (make-estado (make-posn 15 40) 9 (make-posn 70 50) 6)
- (dibujar-objetivo
- (dibujar-laberinto
- (fondo "gold"))))))))
- (check-expect (imprimir (make-estado (make-posn 110 80) 12 (make-posn 60 80) 10) "silver")
- (dibujar-vidas (make-estado (make-posn 110 80) 12 (make-posn 60 80) 10) (dibujar-timer (number->string (exact->inexact 12))
- (dibujar-fantasma (make-estado (make-posn 110 80) 12 (make-posn 60 80) 10)
- (dibujar-jugador (make-estado (make-posn 110 80) 12 (make-posn 60 80) 10)
- (dibujar-objetivo
- (dibujar-laberinto
- (fondo "silver"))))))))
- (define (imprimir e color) (dibujar-vidas e (dibujar-timer
- (number->string (exact->inexact (estado-timer e)))
- (dibujar-fantasma e
- (dibujar-jugador e
- (dibujar-objetivo
- (dibujar-laberinto
- (fondo color))))))))
- ;; grafica : Estado -> Image
- ;; grafica es es el handler dedicado a la cláusula to-draw de la función big-bang.
- ;; Recibe un estado y devuelve una imagen.
- ;; Si el timer del estado es mayor a ??????????????????????, llama a la función imprimir con el estado y el color blanco.
- ;; Si no, llama a la función imprimir con el estado y el color rojo.
- (check-expect (grafica (make-estado (make-posn 5 15) 8 (make-posn 10 12) 2)) (imprimir (make-estado (make-posn 5 15) 8 (make-posn 10 12) 2) "white"))
- (check-expect (grafica (make-estado (make-posn 0 0) 2 (make-posn 110 60) 7)) (imprimir (make-estado (make-posn 0 0) 2 (make-posn 110 60) 7) "red"))
- (check-expect (grafica (make-estado (make-posn 100 80) 3 (make-posn 7 6) 4)) (imprimir (make-estado (make-posn 100 80) 3 (make-posn 7 6) 4) "red"))
- (define (grafica e) (if (> (estado-timer e) 3) (imprimir e "white") (imprimir e "red")))
- ;; grafica_final : Estado -> Image
- ;; Recibe un estado y devuelve una imagen.
- ;; Si objetivo? devuelve #true, imprime "GANASTE!" en la pantalla en dorado, si no, "GAME OVER!" en púrpura, y termina el programa.
- (check-expect (grafica_final (make-estado (make-posn 10 15) 9 (make-posn 20 25) 3)) (dibujar-texto "GAME OVER!" (imprimir (make-estado (make-posn 10 15) 9 (make-posn 20 25) 3) "purple")))
- (check-expect (grafica_final (make-estado (make-posn 930 460) 15 (make-posn 150 320) 2)) (dibujar-texto "GANASTE!" (imprimir (make-estado (make-posn 930 460) 15 (make-posn 150 320) 2) "gold")))
- (check-expect (grafica_final (make-estado (make-posn 932 465) 1 (make-posn 80 135) 8)) (dibujar-texto "GANASTE!" (imprimir (make-estado (make-posn 932 465) 1 (make-posn 80 135) 8) "gold")))
- (define (grafica_final e) (if (objetivo? e) (dibujar-texto "GANASTE!" (imprimir e "gold")) (dibujar-texto "GAME OVER!" (imprimir e "purple"))))
- ;; Mover objetos:
- ;; =============
- ;; move-x : Posn Number Function -> Posn
- ;; Recibe un posn, un delta y una función y devuelve un posn cuyo y no cambia y su x es f(x,delta).
- (check-expect (move-x (make-posn 2 5) 4 +) (make-posn (+ 2 4) 5))
- (check-expect (move-x (make-posn 3 15) 10 *) (make-posn (* 3 10) 15))
- (check-expect (move-x (make-posn 40 25) 15 -) (make-posn (- 40 15) 25))
- (define (move-x pos delta fn) (make-posn (fn (posn-x pos) delta) (posn-y pos)))
- ;; move-y : Posn Number Function -> Posn
- ;; Recibe un posn, un delta y una función y devuelve un posn cuyo x no cambia y su y es f(y,delta).
- (check-expect (move-y (make-posn 4 8) 2 +) (make-posn 4 (+ 8 2)))
- (check-expect (move-y (make-posn 30 10) 20 *) (make-posn 30 (* 10 20)))
- (check-expect (move-y (make-posn 50 60) 25 -) (make-posn 50 (- 60 25)))
- (define (move-y pos delta fn) (make-posn (posn-x pos) (fn (posn-y pos) delta)))
- ;; mover-fantasma : Posn -> Posn
- ;; Recibe un posn y devuelve otro posn.
- ;; Si la coordenada y es mayor a ALTO, devuelve un posn cuyo x es un valor pseudo-aleatorio de ANCHO y su y es la mitad del alto de FANTASMA.
- ;; Si no, devuelve un posn cuyo x no cambia y su y aumenta DELTA.
- (check-expect (mover-fantasma (make-posn 30 50)) (make-posn 30 (+ 50 DELTA)))
- ;(check-expect (mover-fantasma (make-posn 150 505)) (make-posn (random ANCHO) (/ (image-height FANTASMA) 2)))
- (check-expect (mover-fantasma (make-posn 350 501)) (make-posn 350 (+ 501 DELTA)))
- (define (mover-fantasma posn) (if (> (posn-y posn) ALTO)
- (make-posn (random ANCHO) (/ (image-height FANTASMA) 2))
- (make-posn (posn-x posn) (+ (posn-y posn) DELTA))))
- ;; Posiciones:
- ;; ==========
- ;; dentro-escena? : Posn Image -> Boolean
- ;; Recibe una posición y una imagen y devuelve #true si está dentro de la escena.
- ;; ?????????????
- (check-expect (dentro-escena? (make-posn 12 5) (empty-scene 50 50)) #false)
- (check-expect (dentro-escena? (make-posn 40 25) (circle 15 "outline" "orange")) #true)
- (check-expect (dentro-escena? (make-posn 100 75) (rectangle 20 40 "solid" "red")) #true)
- (define (dentro-escena? pos image) (let ([x (/ (image-width image) 2)] [y (/ (image-height image) 2)])
- (and (>= (posn-x pos) x) (>= (- ANCHO x) (posn-x pos)) (>= (posn-y pos) y) (>= (- ALTO y) (posn-y pos)))))
- ;; posible-pos? : Posn Image -> Boolean
- ;; Recibe una posición y una imagen y verifica si está dentro de la escena y si interseca LABERINTO.
- (check-expect (posible-pos? (make-posn 30 50) (empty-scene 100 80)) #false)
- (check-expect (posible-pos? (make-posn 1 1) (circle 25 "outline" "yellow")) #false)
- (check-expect (posible-pos? (make-posn 60 60) (rectangle 300 400 "solid" "blue")) #false)
- (define (posible-pos? pos image) (and (dentro-escena? pos image) (not (interseca? pos image CENTRO LABERINTO))))
- ;; Eventos del teclado:
- ;; ===================
- ;; manejador-tecla : Estado Key-Event -> Estado
- ;; manejador-tecla es el handler dedicado a la cláusula on-key de la función big-bang.
- ;; Si la tecla presionada es:
- ;; - la flecha derecha, actualiza la posición de JUGADOR moviéndolo DELTA píxeles a la derecha (si esta es una posición posible).
- ;; - la flecha izquierda, actualiza la posición de JUGADOR moviéndolo DELTA píxeles a la izquierda (si esta es una posición posible).
- ;; - la flecha hacia arriba, actualiza la posición de JUGADOR moviéndolo DELTA píxeles hacia arriba (si esta es una posición posible).
- ;; - la flecha hacia abajo, actualiza la posición de JUGADOR moviéndolo DELTA píxeles hacia abajo (si esta es una posición posible).
- ;; Ignora otros eventos del teclado.
- (check-expect (manejador-tecla (make-estado (make-posn 15 35) 8 (make-posn 50 50) 2) "right")
- (actualizar-jugador (move-x (make-posn 15 35) DELTA +) (make-estado (make-posn 15 35) 8 (make-posn 50 50) 2)))
- (check-expect (manejador-tecla (make-estado (make-posn 15 35) 12 (make-posn 80 45) 5) "down")
- (actualizar-jugador (move-y (make-posn 15 35) DELTA +) (make-estado (make-posn 15 35) 12 (make-posn 80 45) 5)))
- (check-expect (manejador-tecla (make-estado (make-posn 75 80) 25 (make-posn 120 75) 10) "left")
- (make-estado (make-posn 75 80) 25 (make-posn 120 75) 10))
- (define (manejador-tecla e key) (let ([posn (estado-jugador e)])
- (cond
- [(and (key=? key "right") (posible-pos? (move-x posn DELTA +) JUGADOR)) (actualizar-jugador (move-x posn DELTA +) e)]
- [(and (key=? key "left") (posible-pos? (move-x posn DELTA -) JUGADOR)) (actualizar-jugador (move-x posn DELTA -) e)]
- [(and (key=? key "up") (posible-pos? (move-y posn DELTA -) JUGADOR)) (actualizar-jugador (move-y posn DELTA -) e)]
- [(and (key=? key "down") (posible-pos? (move-y posn DELTA +) JUGADOR)) (actualizar-jugador (move-y posn DELTA +) e)]
- [else e])))
- ;; Otros handlers:
- ;; ==============
- ;; manejador-tick : Estado -> Estado
- ;; manejador-tick es el handler dedicado a la cláusula on-tick de la función big-bang.
- ;; Si interseca fantasma, devuelve un estado cuya posición de JUGADOR es la inicial, el timer disminuye DELTIEMPO, se llama a la función mover-fantasma para
- ;; mover o no FANTASMA y la cantidad de VIDAS disminuye 1.
- ;; Caso contrario, actualiza FANTASMA y timer.
- (check-expect (manejador-tick (make-estado (make-posn 15 25) 10 (make-posn 30 100) 2))
- (actualizar-fantasma (mover-fantasma (make-posn 30 100)) (actualizar-timer (- 10 DELTIEMPO) (make-estado (make-posn 15 25) 10 (make-posn 30 100) 2))))
- (check-expect (manejador-tick (make-estado (make-posn 50 60) 20 (make-posn 50 55) 4))
- (make-estado POS-INICIAL (- 20 DELTIEMPO) (mover-fantasma (make-posn 50 55)) (- 4 1)))
- (check-expect (manejador-tick (make-estado (make-posn 200 180) 6 (make-posn 190 190) 5))
- (make-estado POS-INICIAL (- 6 DELTIEMPO) (mover-fantasma (make-posn 190 190)) (- 5 1)))
- (define (manejador-tick e) (if (interseca-fantasma? e)
- (make-estado POS-INICIAL (- (estado-timer e) DELTIEMPO) (mover-fantasma (estado-fantasma e)) (- (estado-vidas e) 1))
- (actualizar-fantasma (mover-fantasma (estado-fantasma e)) (actualizar-timer (- (estado-timer e) DELTIEMPO) e))))
- ;; Condiciones de Terminación:
- ;; ==========================
- ;; interseca-fantasma? : Estado -> Boolean
- ;; Recibe un estado y devuelve #true si la posición de JUGADOR interseca con la de FANTASMA, y si no, devuelve #false.
- (check-expect (interseca-fantasma? (make-estado (make-posn 200 180) 6 (make-posn 190 190) 5)) #true)
- (check-expect (interseca-fantasma? (make-estado (make-posn 80 25) 3 (make-posn 30 110) 7)) #false)
- (check-expect (interseca-fantasma? (make-estado (make-posn 45 70) 11 (make-posn 45 75) 3)) #true)
- (define (interseca-fantasma? e) (interseca? (estado-jugador e) JUGADOR (estado-fantasma e) FANTASMA))
- ;; objetivo? : Estado -> Boolean
- ;; Recibe un estado y devuelve #true si la posición de JUGADOR interseca con la de OBJETIVO, y si no, #false.
- (check-expect (objetivo? (make-estado (make-posn 10 20) 5 (make-posn 100 35) 3)) #false)
- (check-expect (objetivo? (make-estado (make-posn 930 460) 15 (make-posn 350 220) 4)) #true)
- (check-expect (objetivo? (make-estado (make-posn 932 465) 2 (make-posn 200 400) 1)) #true)
- (define (objetivo? x) (interseca? (estado-jugador x) JUGADOR POS-OBJETIVO OBJETIVO))
- ;; fin? : Estado -> Boolean
- ;; fin? es el handler dedicado a la cláusula stop-when de la función big-bang.
- ;; Termina el programa si se alcanza el OBJETIVO, o si el timer es menor o igual a 0, o si la cantidad de vidas es igual a 0.
- (check-expect (fin? (make-estado (make-posn 100 350) 5 (make-posn 400 250) 0)) #true)
- (check-expect (fin? (make-estado (make-posn 530 120) 8 (make-posn 640 800) 1)) #false)
- (check-expect (fin? (make-estado (make-posn 750 20) -1 (make-posn 220 320) 4)) #true)
- (define (fin? x) (or (objetivo? x) (<= (estado-timer x) 0) (= (estado-vidas x) 0)))
- ;; La función big-bang incorpora tres manejadores de eventos.
- (big-bang estado-inicial
- [to-draw grafica]
- [on-key manejador-tecla]
- [on-tick manejador-tick]
- [stop-when fin? grafica_final]
- )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement