Попытка запрограммировать прорыв в Racket - не удалось сбросить состояние мира

Я пытался запрограммировать прорыв в BSL, и в настоящее время я застрял. Я пытаюсь сбросить игру, когда мяч сталкивается с дном, но я не понимаю сообщений об ошибках и сейчас много чего перепробовал. Есть ли у вас какие-либо идеи?

(require 2htdp/image)
(require 2htdp/universe)

(define WIDTH 200)
(define HEIGHT 200)
(define BALL-IMG (circle 10 "solid" "red"))
(define BALL-RADIUS (/ (image-width BALL-IMG) 2))

(define-struct vel (delta-x delta-y))
; a Vel is a structure: (make-vel Number Number)
; interp. the velocity vector of a moving object

(define-struct ball (loc velocity))
; a Ball is a structure: (make-ball Posn Vel)
; interp. the position and velocity of a object 

; Posn Vel -> Posn
; applies q to p and simulates the movement in one clock tick
(check-expect (posn+vel (make-posn 5 6) (make-vel 1 2))
              (make-posn 6 8))
(define (posn+vel p q)
  (make-posn (+ (posn-x p) (vel-delta-x q))
             (+ (posn-y p) (vel-delta-y q))))


; Ball -> Ball
; computes movement of ball in one clock tick
(check-expect (move-ball (make-ball (make-posn 20 30)
                                    (make-vel 5 10)))
              (make-ball (make-posn 25 40)
                         (make-vel 5 10)))
(define (move-ball ball)
  (make-ball (posn+vel (ball-loc ball)
                       (ball-velocity ball))
             (ball-velocity ball)))

; A Collision is either
; - "top"
; - "down"
; - "left"
; - "right"
; - "none"
; interp. the location where a ball collides with a wall

; Posn -> Collision
; detects with which of the walls (if any) the ball collides
(check-expect (collision (make-posn 0 12))  "left")
(check-expect (collision (make-posn 15 HEIGHT)) "down")
(check-expect (collision (make-posn WIDTH 12))  "right")
(check-expect (collision (make-posn 15 0)) "top")
(check-expect (collision (make-posn 55 55)) "none")
(define (collision posn)
  (cond
    [(<= (posn-x posn) BALL-RADIUS) "left"]
    [(<= (posn-y posn) BALL-RADIUS)  "top"]
    [(>= (posn-x posn) (- WIDTH BALL-RADIUS)) "right"]
    [(>= (posn-y posn) (- HEIGHT BALL-RADIUS)) "down"]
    [else "none"]))

; Vel Collision -> Vel  
; computes the velocity of an object after a collision
(check-expect (bounce (make-vel 3 4) "left")
              (make-vel -3 4))
(check-expect (bounce (make-vel 3 4) "top")
              (make-vel 3 -4))
(check-expect (bounce (make-vel 3 4) "none")
              (make-vel 3 4))
(define (bounce vel collision)
  (cond [(or (string=? collision "left")
             (string=? collision "right"))
         (make-vel (- (vel-delta-x vel))
                   (vel-delta-y vel))]
        [(string=? collision "top")
         (make-vel (vel-delta-x vel)
                   (- (vel-delta-y vel)))]
        [(string=? collision "down")  (tick (render INITIAL-BALL))]
        [else vel]))

; WorldState is a Ball

; WorldState -> Image
; renders ball at its position
(check-expect (image? (render INITIAL-BALL)) #true)
(define (render ball)
  (place-image BALL-IMG
               (posn-x (ball-loc ball))
               (posn-y (ball-loc ball))
               (empty-scene WIDTH HEIGHT)))


; WorldState -> WorldState
; moves ball to its next location
(check-expect (tick (make-ball (make-posn 20 12) (make-vel 1 2)))
              (make-ball (make-posn 21 14) (make-vel 1 2)))
(define (tick ball)
  (move-ball (make-ball (ball-loc ball)
                        (bounce (ball-velocity ball)
                                (collision (ball-loc ball))))))

(define INITIAL-BALL (make-ball (make-posn 20 12)
                                (make-vel 1 2)))


 ; start with: (main INITIAL-BALL)
(define (main ws)
  (big-bang ws (on-tick tick 0.01) (to-draw render)))

person Zeth    schedule 11.12.2015    source источник
comment
Какие ошибки вы получаете?   -  person David Merinos    schedule 11.12.2015


Ответы (2)


В вашей функции bounce измените ветку string=? collision down на return

(make-vel (vel-delta-x vel) (- (vel-deltay vel))). Прямо сейчас он возвращает изображение, с которым ваша функция галочки понятия не имеет, как обрабатывать. Ваше здоровье!

person Ty Coghlan    schedule 11.12.2015

Чтобы немного добавить к превосходному ответу Тая Коглана, я хотел бы отметить, что вам не хватает только одного check-expect для вашей функции bounce ... и это то, что доставило вам проблемы!

Один совет: в BSL вы должны получить черно-оранжевую подсветку, показывающую, какие части вы не тестировали.

person John Clements    schedule 12.12.2015