PasteRack.org
Paste # 94964
2022-09-21 07:30:31

Fork as a new paste.

Paste viewed 414 times.


Embed:

htdp.ex-97

  1. #lang racket
  2. (require 2htdp/image)
  3. (require 2htdp/universe)
  4.  
  5. ; Constants:
  6. ; ==========================
  7. (define WIDTH 640)
  8. (define HEIGHT 480)
  9.  
  10. (define GHEIGHT 100)
  11. (define GROUND (rectangle WIDTH GHEIGHT "solid" "sienna"))
  12. (define SKY (rectangle WIDTH HEIGHT "solid" "lightskyblue"))
  13. (define BACKG (overlay/align "center" "bottom"
  14.                              GROUND
  15.                              SKY))
  16. (define TANK (rectangle 40 10 "solid" "blue"))
  17. (define TANK-Y (- HEIGHT (+ GHEIGHT (/ (image-height TANK) 2))))
  18. (define UFO (overlay (circle 10 "solid" "magenta")
  19.                      (rectangle 60 4 "solid" "magenta")))
  20. (define MISSILE (triangle 10 "solid" "black"))
  21.  
  22. (define TSPEED 5)
  23. (define USPEED 3)
  24. (define RSPEED (* USPEED 2))
  25.  
  26. ; Data Definitions:
  27. ; ==========================
  28.  
  29. (define-struct aim [ufo tank])
  30.  
  31. ; a UFO is a Posn
  32. ; interp. (make-posn x y) is the UFO's location
  33. ; (using top-down, left-to-right convention)
  34.  
  35. (define-struct tank [loc vel])
  36. ; a Tank is a structure:
  37. ; (make-tank Number Number)
  38. ; intepr. (make-tank x dx) specifies the position:
  39. ; (x, TANK-Y) and the tank's speed: dx pixels/tick
  40.  
  41. ; a Missile is a Posn
  42. ; interp. (make-posn x y) is the missile's place
  43.  
  44. ; a SIGS (for space invader game state) is on of:
  45. ; - (make-aim UFO Tank)
  46. ; - (make-fired UFO Tank Missile)
  47. ; interp. represents the complete state of a space invader game
  48.  
  49. (define AIM0 (make-aim (make-posn 200 10) (make-tank 210 -3))) ;tank maneuvering into position to fire the missile
  50.  
  51. (define-struct fired [ufo tank missile])
  52.  
  53. (define FIRED0 (make-fired (make-posn 200 10)
  54.                            (make-tank 210 -3)
  55.                            (make-posn 210 (- HEIGHT TANK-Y 10))))  ;missile just has been fired
  56. (define FIRED1(make-fired (make-posn 200 100)
  57.                           (make-tank 300 3)
  58.                           (make-posn 210 110)))                ;missile is about to collide with the UFO
  59.  
  60.  
  61. ; Functions:
  62. ; ==========================
  63.  
  64. ; SIGS -> Image
  65. ; adds Tank, UFO, and possibly MISSILE to
  66. ; the BACKG scene
  67. ;(define (si-render s) BACKG)          ;stub
  68. (check-expect (si-render AIM0)
  69.               (place-image TANK 210 TANK-Y
  70.                            (place-image UFO 200 10 BACKG)))
  71. (check-expect (si-render FIRED0)
  72.               (place-image TANK 210 TANK-Y
  73.                            (place-image UFO 200 10
  74.                                         (place-image MISSILE 210 (- HEIGHT TANK-Y 10) BACKG))))
  75. (check-expect (si-render FIRED1)
  76.               (place-image TANK 300 TANK-Y
  77.                           (place-image UFO 200 100
  78.                                       (place-image MISSILE 210 110 BACKG))))
  79. #;
  80. (define (si-render s)
  81.   (cond
  82.     [(aim? s) (... (aim-tank s) ... (aim-ufo s) ...)]
  83.     [(fired? s) (... (fired-tank s) ... (fired-ufo s)
  84.                      ... (fired-missile s) ...)]))
  85.  
  86. (define (si-render s)
  87.   (cond
  88.     [(aim? s)
  89.      (tank-render (aim-tank s)
  90.                   (ufo-render (aim-ufo s) BACKG))]
  91.     [(fired? s)
  92.      (tank-render (fired-tank s)
  93.                   (ufo-render (fired-ufo s)
  94.                               (missile-render (fired-missile s)
  95.                                               BACKG)))]))
  96.  
  97. ; Tank Image -> Image
  98. ; adds t to the given image im
  99. ;(define (tank-render t im) im)
  100. (check-expect (tank-render (make-tank 200 3) BACKG)
  101.               (place-image TANK 200 TANK-Y BACKG))
  102. (check-expect (tank-render (make-tank 0 3) BACKG)
  103.               (place-image TANK 0 TANK-Y BACKG))
  104. (check-expect (tank-render (make-tank WIDTH -3) BACKG)
  105.               (place-image TANK WIDTH TANK-Y BACKG))
  106.  
  107. (define (tank-render t im)
  108.   (place-image TANK (tank-loc t) TANK-Y im))
  109.  
  110. ; UFO Image -> Image
  111. ; adds u to the given image im
  112. ;(define (ufo-render u im) im)
  113. (check-expect (ufo-render (make-posn 200 10) BACKG)
  114.               (place-image UFO 200 10 BACKG))
  115. (check-expect (ufo-render (make-posn WIDTH 100) BACKG)
  116.               (place-image UFO WIDTH 100 BACKG))
  117. (check-expect (ufo-render (make-posn WIDTH (- HEIGHT GHEIGHT)) BACKG)
  118.               (place-image UFO WIDTH 380 BACKG))
  119.  
  120. (define (ufo-render u im)
  121.   (place-image UFO (posn-x u) (posn-y u) BACKG))
  122.  
  123. ; Missile Image -> Image
  124. ; adds m to the given image im
  125. ;(define (missile-render m im) im)
  126. (check-expect (missile-render (make-posn 200 200) BACKG)
  127.               (place-image MISSILE 200 200 BACKG))
  128. (check-expect (missile-render (make-posn 0 100) BACKG)
  129.               (place-image MISSILE 0 100 BACKG))
  130. (check-expect (missile-render (make-posn WIDTH 0) BACKG)
  131.               (place-image MISSILE WIDTH 0 BACKG))
  132. (check-expect (missile-render (make-posn (- TANK-Y 10) 120) BACKG)
  133.               (place-image MISSILE 365 120 BACKG))
  134.  
  135. (define (missile-render m im)
  136.   (place-image MISSILE (posn-x m) (posn-y m) BACKG))

=>