Ich versuche, das Breakout-Spiel (https://www.youtube.com/watch?v=hW7Sg5pXAok) mit DrRacket (BSL) zu programmieren. Ich begann damit, den Code für die vom Spieler kontrollierte Bar zu schreiben. Der Balken sollte sich mit der Maus entlang bewegen, bis er der x-Achse folgt und auf der y-Achse unbeweglich bleibt. Mein Code ist der folgende, der Balken bewegt sich, aber das Mausereignis scheint nicht zu funktionieren. Können Sie es bei der Fehlersuche unterstützen?Programmierung Breakout mit Racket
(require 2htdp/universe)
(require 2htdp/image)
(define-struct playerState (locPlayer))
(define playerRectangle (rectangle 20 10 "solid" "red"))
(define playerScene (empty-scene 200 200))
; WorldState -> Image
; draws a player's state to an image
(check-expect (drawPlayer (make-playerState (make-posn 50 99))) (place-image playerRectangle 50 99 playerScene))
(define (drawPlayer state)
(place-image playerRectangle (posn-x (playerState-locPlayer state)) (posn-y (playerState-locPlayer state)) playerScene))
; WorldState -> WorldState
; computes a new player worldstate after a clock tick
(check-expect (tickPlayer (make-playerState (make-posn 50 99))) (make-playerState (make-posn 51 99)))
(define (tickPlayer state)
(make-playerState (make-posn (+ 1 (posn-x (playerState-locPlayer state))) (posn-y (playerState-locPlayer state)))))
; mouseEvent -> WorldState
; computes a new player worldstate if the mouse is moved
(define (mouse state x y mouse-event)
(cond [(string=? mouse-event "move")
(cond
[(> x (posn-x (playerState-locPlayer state))) (make-playerState (make-posn (+ 1 (posn-x (playerState-locPlayer state))) (posn-y (playerState-locPlayer state))))]
[(< x (posn-x (playerState-locPlayer state))) (make-playerState (make-posn (- 1 (posn-x (playerState-locPlayer state))) (posn-y (playerState-locPlayer state))))])]
[else (make-playerState (make-posn (posn-x (playerState-locPlayer state)) (posn-y (playerState-locPlayer state))))]))
(define (main state)
(big-bang state (to-draw drawPlayer) (on-mouse mouse) (on-tick tickPlayer)))
(define initialPlayer (make-playerState (make-posn 100 199)))
(main initialPlayer)
Ich empfehle, geschachtelte bedingte Anweisungen nicht zu verwenden, da es einfacher ist, komplizierte Fehler zu machen, die schwer zurückzunehmen sind. Zum Beispiel ist der Else-Status, der fehlt, fatal, was ich bereits beschrieben habe. Wenn Sie von der ersten Bedingung zur anderen übergehen würden, würden Sie einen Fehler bekommen, da x nichts anderes ist als die Position von player-state –
was ich anstelle von geschachtelten Bedingungen empfehle, ist die Verwendung von 'und' oder 'oder' diese sind ziemlich cool. –