Advertisement
OriReschini

Untitled

May 25th, 2016
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 24.57 KB | None | 0 0
  1. ;; Integrantes: Oriana Reschini R-4087/8
  2. ;; Lisandro Maselli M-6500/5
  3.  
  4. (require "extras.rkt")
  5.  
  6. ;; Definiciones principales:
  7. ;; ========================
  8. (define LABERINTO (bitmap "laberinto.png"))
  9. (define FANTASMA (bitmap "fantasma.png"))
  10. (define ALTO (image-height LABERINTO))
  11. (define ANCHO (image-width LABERINTO))
  12. (define CENTRO (make-posn (/ ANCHO 2) (/ ALTO 2)))
  13. (define POS-INICIAL (make-posn 16 40))
  14. (define POS-OBJETIVO (make-posn 930 460))
  15. ; Definimos una constante JUGADOR que representa el jugador.
  16. (define JUGADOR (circle 15 "solid" "blue"))
  17. ; Definimos una constante OBJETIVO que representa el objetivo al que debe llegar el jugador.
  18. (define OBJETIVO (star 16 "solid" "black"))
  19. ; Definimos una constante DELTA que representa la cantidad de píxeles que se mueve FANTASMA y JUGADOR.
  20. (define DELTA 7)
  21. ; Definimos POS-TIMER-X y POS-TIMER-Y para ayudarnos a ubicar el timer en la posición pedida.
  22. (define POS-TIMER-X 30)
  23. (define POS-TIMER-Y 7)
  24. ; Definimos una constante DELTIEMPO que representa la cantidad de ???????????????????????????????
  25. (define DELTIEMPO 0.01)
  26. ; Definimos una constante TIEMPO que representa la cantidad de ??????????????????????????? que durará el juego.
  27. (define TIEMPO 15)
  28. ; Definimos una constante POS-FANTASMA que representa la posición del fantasma.
  29. ; La coordenada x toma un valor pseudo-aleatorio dentro del ANCHO y la coordenada y, la mitad del
  30. ; alto de FANTASMA pero negativo para que no aparezca en LABERINTO.
  31. (define POS-FANTASMA (make-posn (random ANCHO) (- (/ (image-height FANTASMA) 2))))
  32. ; Definimos una constante VIDAS que representa la cantidad de vidas inicial.
  33. (define VIDAS 5)
  34. ; Definimos POS-VIDAS-X y POS-VIDAS-Y para ayudarnos a ubicar las vidas restantes en la posición pedida.
  35. (define POS-VIDAS-X 950)
  36. (define POS-VIDAS-Y 7)
  37. ; Definimos una constante TAMAÑO-TEXT que representa el tamaño del texto que indica la cantidad de vidas y tiempo restantes.
  38. (define TAMAÑO-TEXT 18)
  39. ; Definimos una constante COLOR-TEXT que representa el color del texto que indica la cantidad de vidas y tiempo restantes.
  40. (define COLOR-TEXT "blue")
  41.  
  42. ;; Estado global del programa:
  43. ;; ==========================
  44. (define-struct estado [jugador timer fantasma vidas])
  45. ; estado es (make-estado [posn Number posn Number]
  46. ; jugador representa la posición de JUGADOR.
  47. ; timer representa la cantidad de ???????????????????????????? restantes.
  48. ; fantasma representa la posición de FANTASMA.
  49. ; vidas representa la cantidad de vidas restantes.
  50.  
  51. ; Definimos una constante estado-inicial que representa el estado inicial del sistema.
  52. (define estado-inicial (make-estado POS-INICIAL TIEMPO POS-FANTASMA VIDAS))
  53.  
  54. ;; actualizar-timer : Number Estado -> Estado
  55. ;; Recibe un número y un estado, y devuelve el mismo estado cambiando timer por el número dado.
  56. (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))
  57. (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))
  58. (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))
  59.  
  60. (define (actualizar-timer val e) (make-estado (estado-jugador e) val (estado-fantasma e) (estado-vidas e)))
  61.  
  62.  
  63. ;; actualizar-vidas : Number Estado -> Estado
  64. ;; Recibe un número y un estado, y devuelve el mismo estado cambiando vidas por el número dado.
  65. (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))
  66. (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))
  67. (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))
  68.  
  69. (define (actualizar-vidas n e) (make-estado (estado-jugador e) (estado-timer e) (estado-fantasma e) n))
  70.  
  71.  
  72. ;; actualizar-fantasma : Posn Estado -> Estado
  73. ;; Recibe un posn y un estado, y devuelve el mismo estado cambiando fantasma por el posn dado.
  74. (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))
  75. (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))
  76. (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))
  77.  
  78. (define (actualizar-fantasma posn e) (make-estado (estado-jugador e) (estado-timer e) posn (estado-vidas e)))
  79.  
  80.  
  81. ;; actualizar-jugador : Posn Estado -> Estado
  82. ;; Recibe un posn y un estado, y devuelve el mismo estado cambiando jugador por el posn dado.
  83. (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))
  84. (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))
  85. (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))
  86.  
  87. (define (actualizar-jugador posn e) (make-estado posn (estado-timer e) (estado-fantasma e) (estado-vidas e)))
  88.  
  89.  
  90. ;; Imprimir en la pantalla:
  91. ;; =======================
  92. ;; dibujar-imagen : Image Posn Image -> Image
  93. ;; Recibe una imagen, una posición y una base, y devuelve una imagen.
  94. ;; Coloca la imagen en la posición dada en la base.
  95. (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)))
  96. (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")))
  97. (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)))
  98.  
  99. (define (dibujar-imagen imagen e base) (place-image imagen (posn-x e) (posn-y e) base))
  100.  
  101.  
  102. ;; dibujar-laberinto : Image -> Image
  103. ;; Recibe una imagen y coloca LABERINTO centrado en ella.
  104. (check-expect (dibujar-laberinto (circle 20 "solid" "blue")) (dibujar-imagen LABERINTO CENTRO (circle 20 "solid" "blue")))
  105. (check-expect (dibujar-laberinto (rectangle 2 4 "outline" "red")) (dibujar-imagen LABERINTO CENTRO (rectangle 2 4 "outline" "red")))
  106. (check-expect (dibujar-laberinto (ellipse 100 80 "solid" "orange")) (dibujar-imagen LABERINTO CENTRO (ellipse 100 80 "solid" "orange")))
  107.  
  108. (define (dibujar-laberinto x) (dibujar-imagen LABERINTO CENTRO x))
  109.  
  110.  
  111. ;; dibujar-jugador : Estado Image -> Image
  112. ;; Recibe un estado y la base y coloca el jugador en la posición dada por el estado.
  113. (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")))
  114. (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")))
  115. (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)))
  116.  
  117. (define (dibujar-jugador e x) (dibujar-imagen JUGADOR (estado-jugador e) x))
  118.  
  119.  
  120. ;; dibujar-objetivo : Image -> Image
  121. ;; Recibe una imagen y coloca el OBJETIVO en la posición dada por POS-OBJETIVO en ella.
  122. (check-expect (dibujar-objetivo (empty-scene 100 100)) (dibujar-imagen OBJETIVO POS-OBJETIVO (empty-scene 100 100)))
  123. (check-expect (dibujar-objetivo (circle 25 "outline" "green")) (dibujar-imagen OBJETIVO POS-OBJETIVO (circle 25 "outline" "green")))
  124. (check-expect (dibujar-objetivo (rectangle 50 80 "solid" "indigo")) (dibujar-imagen OBJETIVO POS-OBJETIVO (rectangle 50 80 "solid" "indigo")))
  125.  
  126. (define (dibujar-objetivo x) (dibujar-imagen OBJETIVO POS-OBJETIVO x))
  127.  
  128.  
  129. ;; dibujar-timer : Estado Image -> Image
  130. ;; Recibe un estado y una imagen y coloca el timer en la posición pedida.
  131. ;(check-expect (dibujar-timer (make-estado (make-posn 5 3) 8 (make-posn 10 15) 1) (empty-scene 140 100))
  132. ; (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)))
  133. ; .............................................
  134.  
  135. (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))
  136.  
  137.  
  138. ;; dibujar-vidas : Estado Image -> Image
  139. ;; Recibe un estado y una imagen y coloca el número de vidas restantes en la posición pedida.
  140. (check-expect (dibujar-vidas (make-estado (make-posn 10 10) 15 (make-posn 20 30) 5) (empty-scene 150 200))
  141. (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)))
  142. (check-expect (dibujar-vidas (make-estado (make-posn 80 50) 30 (make-posn 0 0) 2) (circle 25 "solid" "black"))
  143. (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")))
  144. (check-expect (dibujar-vidas (make-estado (make-posn 35 47) 180 (make-posn 1 15) 30) (rectangle 50 75 "outline" "yellow"))
  145. (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")))
  146.  
  147. (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))
  148.  
  149.  
  150. ;; dibujar-texto : String Image -> Image
  151. ;; Recibe un string y una imagen y coloca el string en el centro de la imagen.
  152. (check-expect (dibujar-texto "hola" (empty-scene 160 180)) (dibujar-imagen (text "hola" 100 "white") CENTRO (empty-scene 160 180)))
  153. (check-expect (dibujar-texto "GANASTE" (circle 80 "solid" "red")) (dibujar-imagen (text "GANASTE" 100 "white") CENTRO (circle 80 "solid" "red")))
  154. (check-expect (dibujar-texto "GAME OVER" (rectangle 300 250 "outline" "green")) (dibujar-imagen (text "GAME OVER" 100 "white") CENTRO (rectangle 300 250 "outline" "green")))
  155.  
  156. (define (dibujar-texto string image) (dibujar-imagen (text string 100 "white") CENTRO image))
  157.  
  158.  
  159. ;; dibujar-fantasma : Estado Image -> Image
  160. ;; Recibe un estado y una imagen y coloca FANTASMA en la posición dada por el campo fantasma del estado en la imagen.
  161. (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)))
  162. (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")))
  163. (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")))
  164.  
  165. (define (dibujar-fantasma e x) (dibujar-imagen FANTASMA (estado-fantasma e) x))
  166.  
  167.  
  168. ;; fondo : Color -> Image
  169. ;; Recibe un color y devuelve una escena de ANCHO por ALTO cantidad de píxeles del color dado.
  170. (check-expect (fondo "magenta") (rectangle ANCHO ALTO "solid" "magenta"))
  171. (check-expect (fondo "purple") (rectangle ANCHO ALTO "solid" "purple"))
  172. (check-expect (fondo "gray") (rectangle ANCHO ALTO "solid" "gray"))
  173.  
  174. (define (fondo color) (rectangle ANCHO ALTO "solid" color))
  175.  
  176.  
  177. ;; imprimir : Estado Color -> Image
  178. ;; Recibe un estado y un color y dibuja LABERINTO, OBJETIVO, JUGADOR, FANTASMA, TIMER y VIDAS en el fondo.
  179. (check-expect (imprimir (make-estado (make-posn 2 2) 5 (make-posn 8 2) 1) "green")
  180. (dibujar-vidas (make-estado (make-posn 2 2) 5 (make-posn 8 2) 1) (dibujar-timer (number->string (exact->inexact 5))
  181. (dibujar-fantasma (make-estado (make-posn 2 2) 5 (make-posn 8 2) 1)
  182. (dibujar-jugador (make-estado (make-posn 2 2) 5 (make-posn 8 2) 1)
  183. (dibujar-objetivo
  184. (dibujar-laberinto
  185. (fondo "green"))))))))
  186. (check-expect (imprimir (make-estado (make-posn 15 40) 9 (make-posn 70 50) 6) "gold")
  187. (dibujar-vidas (make-estado (make-posn 15 40) 9 (make-posn 70 50) 6) (dibujar-timer (number->string (exact->inexact 9))
  188. (dibujar-fantasma (make-estado (make-posn 15 40) 9 (make-posn 70 50) 6)
  189. (dibujar-jugador (make-estado (make-posn 15 40) 9 (make-posn 70 50) 6)
  190. (dibujar-objetivo
  191. (dibujar-laberinto
  192. (fondo "gold"))))))))
  193. (check-expect (imprimir (make-estado (make-posn 110 80) 12 (make-posn 60 80) 10) "silver")
  194. (dibujar-vidas (make-estado (make-posn 110 80) 12 (make-posn 60 80) 10) (dibujar-timer (number->string (exact->inexact 12))
  195. (dibujar-fantasma (make-estado (make-posn 110 80) 12 (make-posn 60 80) 10)
  196. (dibujar-jugador (make-estado (make-posn 110 80) 12 (make-posn 60 80) 10)
  197. (dibujar-objetivo
  198. (dibujar-laberinto
  199. (fondo "silver"))))))))
  200.  
  201. (define (imprimir e color) (dibujar-vidas e (dibujar-timer
  202. (number->string (exact->inexact (estado-timer e)))
  203. (dibujar-fantasma e
  204. (dibujar-jugador e
  205. (dibujar-objetivo
  206. (dibujar-laberinto
  207. (fondo color))))))))
  208.  
  209.  
  210. ;; grafica : Estado -> Image
  211. ;; grafica es es el handler dedicado a la cláusula to-draw de la función big-bang.
  212. ;; Recibe un estado y devuelve una imagen.
  213. ;; Si el timer del estado es mayor a ??????????????????????, llama a la función imprimir con el estado y el color blanco.
  214. ;; Si no, llama a la función imprimir con el estado y el color rojo.
  215. (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"))
  216. (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"))
  217. (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"))
  218.  
  219. (define (grafica e) (if (> (estado-timer e) 3) (imprimir e "white") (imprimir e "red")))
  220.  
  221.  
  222. ;; grafica_final : Estado -> Image
  223. ;; Recibe un estado y devuelve una imagen.
  224. ;; Si objetivo? devuelve #true, imprime "GANASTE!" en la pantalla en dorado, si no, "GAME OVER!" en púrpura, y termina el programa.
  225. (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")))
  226. (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")))
  227. (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")))
  228.  
  229. (define (grafica_final e) (if (objetivo? e) (dibujar-texto "GANASTE!" (imprimir e "gold")) (dibujar-texto "GAME OVER!" (imprimir e "purple"))))
  230.  
  231.  
  232. ;; Mover objetos:
  233. ;; =============
  234. ;; move-x : Posn Number Function -> Posn
  235. ;; Recibe un posn, un delta y una función y devuelve un posn cuyo y no cambia y su x es f(x,delta).
  236. (check-expect (move-x (make-posn 2 5) 4 +) (make-posn (+ 2 4) 5))
  237. (check-expect (move-x (make-posn 3 15) 10 *) (make-posn (* 3 10) 15))
  238. (check-expect (move-x (make-posn 40 25) 15 -) (make-posn (- 40 15) 25))
  239.  
  240. (define (move-x pos delta fn) (make-posn (fn (posn-x pos) delta) (posn-y pos)))
  241.  
  242.  
  243. ;; move-y : Posn Number Function -> Posn
  244. ;; Recibe un posn, un delta y una función y devuelve un posn cuyo x no cambia y su y es f(y,delta).
  245. (check-expect (move-y (make-posn 4 8) 2 +) (make-posn 4 (+ 8 2)))
  246. (check-expect (move-y (make-posn 30 10) 20 *) (make-posn 30 (* 10 20)))
  247. (check-expect (move-y (make-posn 50 60) 25 -) (make-posn 50 (- 60 25)))
  248.  
  249. (define (move-y pos delta fn) (make-posn (posn-x pos) (fn (posn-y pos) delta)))
  250.  
  251.  
  252. ;; mover-fantasma : Posn -> Posn
  253. ;; Recibe un posn y devuelve otro posn.
  254. ;; 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.
  255. ;; Si no, devuelve un posn cuyo x no cambia y su y aumenta DELTA.
  256. (check-expect (mover-fantasma (make-posn 30 50)) (make-posn 30 (+ 50 DELTA)))
  257. ;(check-expect (mover-fantasma (make-posn 150 505)) (make-posn (random ANCHO) (/ (image-height FANTASMA) 2)))
  258. (check-expect (mover-fantasma (make-posn 350 501)) (make-posn 350 (+ 501 DELTA)))
  259.  
  260. (define (mover-fantasma posn) (if (> (posn-y posn) ALTO)
  261. (make-posn (random ANCHO) (/ (image-height FANTASMA) 2))
  262. (make-posn (posn-x posn) (+ (posn-y posn) DELTA))))
  263.  
  264.  
  265. ;; Posiciones:
  266. ;; ==========
  267. ;; dentro-escena? : Posn Image -> Boolean
  268. ;; Recibe una posición y una imagen y devuelve #true si está dentro de la escena.
  269. ;; ?????????????
  270. (check-expect (dentro-escena? (make-posn 12 5) (empty-scene 50 50)) #false)
  271. (check-expect (dentro-escena? (make-posn 40 25) (circle 15 "outline" "orange")) #true)
  272. (check-expect (dentro-escena? (make-posn 100 75) (rectangle 20 40 "solid" "red")) #true)
  273.  
  274. (define (dentro-escena? pos image) (let ([x (/ (image-width image) 2)] [y (/ (image-height image) 2)])
  275. (and (>= (posn-x pos) x) (>= (- ANCHO x) (posn-x pos)) (>= (posn-y pos) y) (>= (- ALTO y) (posn-y pos)))))
  276.  
  277.  
  278. ;; posible-pos? : Posn Image -> Boolean
  279. ;; Recibe una posición y una imagen y verifica si está dentro de la escena y si interseca LABERINTO.
  280. (check-expect (posible-pos? (make-posn 30 50) (empty-scene 100 80)) #false)
  281. (check-expect (posible-pos? (make-posn 1 1) (circle 25 "outline" "yellow")) #false)
  282. (check-expect (posible-pos? (make-posn 60 60) (rectangle 300 400 "solid" "blue")) #false)
  283.  
  284. (define (posible-pos? pos image) (and (dentro-escena? pos image) (not (interseca? pos image CENTRO LABERINTO))))
  285.  
  286.  
  287. ;; Eventos del teclado:
  288. ;; ===================
  289. ;; manejador-tecla : Estado Key-Event -> Estado
  290. ;; manejador-tecla es el handler dedicado a la cláusula on-key de la función big-bang.
  291. ;; Si la tecla presionada es:
  292. ;; - la flecha derecha, actualiza la posición de JUGADOR moviéndolo DELTA píxeles a la derecha (si esta es una posición posible).
  293. ;; - la flecha izquierda, actualiza la posición de JUGADOR moviéndolo DELTA píxeles a la izquierda (si esta es una posición posible).
  294. ;; - la flecha hacia arriba, actualiza la posición de JUGADOR moviéndolo DELTA píxeles hacia arriba (si esta es una posición posible).
  295. ;; - la flecha hacia abajo, actualiza la posición de JUGADOR moviéndolo DELTA píxeles hacia abajo (si esta es una posición posible).
  296. ;; Ignora otros eventos del teclado.
  297. (check-expect (manejador-tecla (make-estado (make-posn 15 35) 8 (make-posn 50 50) 2) "right")
  298. (actualizar-jugador (move-x (make-posn 15 35) DELTA +) (make-estado (make-posn 15 35) 8 (make-posn 50 50) 2)))
  299. (check-expect (manejador-tecla (make-estado (make-posn 15 35) 12 (make-posn 80 45) 5) "down")
  300. (actualizar-jugador (move-y (make-posn 15 35) DELTA +) (make-estado (make-posn 15 35) 12 (make-posn 80 45) 5)))
  301. (check-expect (manejador-tecla (make-estado (make-posn 75 80) 25 (make-posn 120 75) 10) "left")
  302. (make-estado (make-posn 75 80) 25 (make-posn 120 75) 10))
  303.  
  304. (define (manejador-tecla e key) (let ([posn (estado-jugador e)])
  305. (cond
  306. [(and (key=? key "right") (posible-pos? (move-x posn DELTA +) JUGADOR)) (actualizar-jugador (move-x posn DELTA +) e)]
  307. [(and (key=? key "left") (posible-pos? (move-x posn DELTA -) JUGADOR)) (actualizar-jugador (move-x posn DELTA -) e)]
  308. [(and (key=? key "up") (posible-pos? (move-y posn DELTA -) JUGADOR)) (actualizar-jugador (move-y posn DELTA -) e)]
  309. [(and (key=? key "down") (posible-pos? (move-y posn DELTA +) JUGADOR)) (actualizar-jugador (move-y posn DELTA +) e)]
  310. [else e])))
  311.  
  312.  
  313. ;; Otros handlers:
  314. ;; ==============
  315. ;; manejador-tick : Estado -> Estado
  316. ;; manejador-tick es el handler dedicado a la cláusula on-tick de la función big-bang.
  317. ;; 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
  318. ;; mover o no FANTASMA y la cantidad de VIDAS disminuye 1.
  319. ;; Caso contrario, actualiza FANTASMA y timer.
  320. (check-expect (manejador-tick (make-estado (make-posn 15 25) 10 (make-posn 30 100) 2))
  321. (actualizar-fantasma (mover-fantasma (make-posn 30 100)) (actualizar-timer (- 10 DELTIEMPO) (make-estado (make-posn 15 25) 10 (make-posn 30 100) 2))))
  322. (check-expect (manejador-tick (make-estado (make-posn 50 60) 20 (make-posn 50 55) 4))
  323. (make-estado POS-INICIAL (- 20 DELTIEMPO) (mover-fantasma (make-posn 50 55)) (- 4 1)))
  324. (check-expect (manejador-tick (make-estado (make-posn 200 180) 6 (make-posn 190 190) 5))
  325. (make-estado POS-INICIAL (- 6 DELTIEMPO) (mover-fantasma (make-posn 190 190)) (- 5 1)))
  326.  
  327. (define (manejador-tick e) (if (interseca-fantasma? e)
  328. (make-estado POS-INICIAL (- (estado-timer e) DELTIEMPO) (mover-fantasma (estado-fantasma e)) (- (estado-vidas e) 1))
  329. (actualizar-fantasma (mover-fantasma (estado-fantasma e)) (actualizar-timer (- (estado-timer e) DELTIEMPO) e))))
  330.  
  331.  
  332. ;; Condiciones de Terminación:
  333. ;; ==========================
  334. ;; interseca-fantasma? : Estado -> Boolean
  335. ;; Recibe un estado y devuelve #true si la posición de JUGADOR interseca con la de FANTASMA, y si no, devuelve #false.
  336. (check-expect (interseca-fantasma? (make-estado (make-posn 200 180) 6 (make-posn 190 190) 5)) #true)
  337. (check-expect (interseca-fantasma? (make-estado (make-posn 80 25) 3 (make-posn 30 110) 7)) #false)
  338. (check-expect (interseca-fantasma? (make-estado (make-posn 45 70) 11 (make-posn 45 75) 3)) #true)
  339.  
  340. (define (interseca-fantasma? e) (interseca? (estado-jugador e) JUGADOR (estado-fantasma e) FANTASMA))
  341.  
  342.  
  343. ;; objetivo? : Estado -> Boolean
  344. ;; Recibe un estado y devuelve #true si la posición de JUGADOR interseca con la de OBJETIVO, y si no, #false.
  345. (check-expect (objetivo? (make-estado (make-posn 10 20) 5 (make-posn 100 35) 3)) #false)
  346. (check-expect (objetivo? (make-estado (make-posn 930 460) 15 (make-posn 350 220) 4)) #true)
  347. (check-expect (objetivo? (make-estado (make-posn 932 465) 2 (make-posn 200 400) 1)) #true)
  348.  
  349. (define (objetivo? x) (interseca? (estado-jugador x) JUGADOR POS-OBJETIVO OBJETIVO))
  350.  
  351.  
  352. ;; fin? : Estado -> Boolean
  353. ;; fin? es el handler dedicado a la cláusula stop-when de la función big-bang.
  354. ;; 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.
  355. (check-expect (fin? (make-estado (make-posn 100 350) 5 (make-posn 400 250) 0)) #true)
  356. (check-expect (fin? (make-estado (make-posn 530 120) 8 (make-posn 640 800) 1)) #false)
  357. (check-expect (fin? (make-estado (make-posn 750 20) -1 (make-posn 220 320) 4)) #true)
  358.  
  359. (define (fin? x) (or (objetivo? x) (<= (estado-timer x) 0) (= (estado-vidas x) 0)))
  360.  
  361.  
  362. ;; La función big-bang incorpora tres manejadores de eventos.
  363. (big-bang estado-inicial
  364. [to-draw grafica]
  365. [on-key manejador-tecla]
  366. [on-tick manejador-tick]
  367. [stop-when fin? grafica_final]
  368. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement