这个作业的关键点就是在设定一个函数可以接受键盘的"up"和"donw"键,这个键可以调整开心值,然后设定这个"render"函数,可以根据开心值调整长度,这样就可以了。
(require 2htdp/image)
(require 2htdp/universe)
(define BACKGROUND (empty-scene 100 20))
(check-expect (tock 100) 99.9)
(check-expect (tock 50) 49.9)
(check-expect (tock 0) 0)
;;tock
; HapinessState -> HappinessState
;随着时间增加快乐减少
(define (tock hs)
(cond
[(> hs 0) (- hs .1)]
[else 0]))
(check-expect (pet 100 "down") 100)
(check-expect (pet 50 "down") 60)
(check-expect (pet 0 "down") 0)
(check-expect (pet 100 "up") 100)
(check-expect (pet 30 "up") 40)
(check-expect (pet 0 "up") 0)
;;pet
; HappinessState String -> HappinessState
;上箭头快乐值+1/5,下箭头快乐值+1/3
(define (pet hs ke)
(cond
[(= hs 100) 100]
[(= hs 0) 0]
[else (cond
[(string=? ke "down") (+ hs (/ hs 5))]
[(string=? ke "up") (+ hs (/ hs 3))])]))
;;render
(check-expect (render 0) (place-image/align (rectangle 0 20 "solid" "red") 0 0 "left" "top" BACKGROUND))
(check-expect (render 50) (place-image/align (rectangle 50 20 "solid" "red") 0 0 "left" "top" BACKGROUND))
(check-expect (render 100) (place-image/align (rectangle 100 20 "solid" "red") 0 0 "left" "top" BACKGROUND))
(define (render hs)
(place-image/align (rectangle hs 20 "solid" "red") 0 0 "left" "top" BACKGROUND))
;;stop-when
; HappinessState -> End of Program
; 当快乐值为0时程序终止
;;main
; HappinessState -> HappinessState
; 以快乐值为100开始
(define (gauge-prog hs)
(big-bang 100
[on-tick tock]
[on-draw render]
[on-key pet]
[stop-when zero?]))