PasteRack.org
Paste # 22047
2024-09-27 22:12:44

Fork as a new paste.

Paste viewed 37 times.


Embed:

  1. #lang racket
  2. (require 2htdp/universe)
  3. (require 2htdp/image)
  4.  
  5. ;; Constants
  6. (define SCENE-WIDTH 200)
  7. (define SCENE-HEIGHT 200)
  8. (define INIT-RECFILL "solid")
  9. (define REC-WIDTH 40)
  10. (define REC-HEIGHT 80)
  11. (define REC-CENTER-Y 100)
  12. (define INIT-REC-X 0)
  13. (define EMPTY-SCENE (place-image (line 0 SCENE-HEIGHT 0 (- SCENE-WIDTH (/ SCENE-WIDTH 2)))
  14.                                  (/ SCENE-WIDTH 2) 0 (empty-scene SCENE-WIDTH SCENE-HEIGHT)))
  15.  
  16. ;; Data Definition: WorldState
  17. ;; WorldState is (make-worldstate Number String)
  18. ;; where x is the x-coordinate of the rectangle
  19. ;; and recfill is either "solid" or "outline"
  20. (define-struct worldstate (x recfill))
  21.  
  22. ;; WorldState-x : WorldState -> Number
  23. ;; Returns the x-coordinate of the rectangle in the world
  24. (define (WorldState-x ws)
  25.   (worldstate-x ws))
  26.  
  27. ;; WorldState-recfill : WorldState -> String
  28. ;; Returns the current fill state of the rectangle ("solid" or "outline")
  29. (define (WorldState-recfill ws)
  30.   (worldstate-recfill ws))
  31.  
  32. ;; toggle-recfill : String -> String
  33. ;; Toggles between "solid" and "outline" fill state
  34. (define (toggle-recfill recfill)
  35.   (cond [(string=? recfill "solid") "outline"]
  36.         [(string=? recfill "outline") "solid"]))
  37.  
  38. ;; get-rec-center-x : Number -> Number
  39. ;; Calculates the center x-coordinate of the rectangle
  40. (define (get-rec-center-x x)
  41.   (+ x (/ REC-WIDTH 2)))
  42.  
  43. ;; render-rec : WorldState -> Image
  44. ;; Draws the rectangle at the current position with the current fill
  45. (define (render-rec ws)
  46.   (place-image
  47.    (cond [(string=? (worldstate-recfill ws) "solid") (rectangle REC-WIDTH REC-HEIGHT "solid" "green")]
  48.          [(string=? (worldstate-recfill ws) "outline") (rectangle REC-WIDTH REC-HEIGHT "outline" "green")])
  49.    (WorldState-x ws) REC-CENTER-Y EMPTY-SCENE))
  50.  
  51. ;; key-handler : WorldState KeyEvent -> WorldState
  52. ;; Handles space key press to toggle between solid and outline when rectangle touches the middle line
  53. (define (key-handler ws key)
  54.   (if (and (key=? key " ")
  55.            (<= (get-rec-center-x (WorldState-x ws)) (/ SCENE-WIDTH 2) (+ 1 (/ SCENE-WIDTH 2))))
  56.       (make-worldstate (WorldState-x ws) (toggle-recfill (WorldState-recfill ws)))
  57.       ws))
  58.  
  59. ;; next-WorldState : WorldState -> WorldState
  60. ;; Updates the world state on each tick by moving the rectangle 2 pixels to the right
  61. (define (next-WorldState ws)
  62.   (let ([new-x (modulo (+ (WorldState-x ws) 2) SCENE-WIDTH)])
  63.     (make-worldstate new-x (WorldState-recfill ws))))
  64.  
  65. ;; render : WorldState -> Image
  66. ;; Draws the entire scene, including the rectangle
  67. (define (render ws)
  68.   (render-rec ws))
  69.  
  70. ;; WorldState? : Any -> Boolean
  71. ;; Predicate to check if a given value is a valid WorldState
  72. (define (WorldState? x)
  73.   (and (struct? x) (worldstate? x)))
  74.  
  75. ;; main : -> Void
  76. ;; Starts the big-bang interactive loop
  77. (define (main)
  78.   (big-bang (make-worldstate INIT-REC-X INIT-RECFILL)
  79.             (on-tick next-WorldState)
  80.             (on-key key-handler)
  81.             (to-draw render)
  82.             (stop-when (lambda (ws) false))))
  83.  
  84. ;; Call main to start the program
  85. (main)

=>