这个程序适用于我的计算机科学课程 到目前为止,它还没有完成,因为我很困惑为什么 (posn-x(vector-ref(level-entities current)0))返回void
我提前道歉,如果这段代码难以理解,或者说很糟糕,我最近才开始学习球拍/计划。
(require picturing-programs)
(require 2htdp/planetcute)
(define WIDTH 707)
(define HEIGHT 400)
(define GRAVITY 10)
(define SPEED 20)
(define gem .)
;entities vector
;INVENTORY
;gem1-posn
;gem2_posn
;gem3_posn
;time_posn
;blocks inside the world
(define grass-land
(overlay/xy grass-block
0 40
dirt-block))
;background of the animation
(define bottom
(beside grass-land
grass-land
grass-land
grass-land
grass-land
grass-land
grass-land))
;animation window
(define world
(overlay/align "middle" "bottom"
bottom
(rectangle WIDTH HEIGHT "solid" "white")))
;model for this game is game
;xy returns a posn showing main characters location
;score returns the amount of stars collected by the end of the game
;time returns the amount of time left in a game
;entitites is a vector that contains all the posn of the gems and game timer
(define-struct level (score time entities))
;make-level: posn
; number
; number
; -> game
;game-score: game
; -> number
;game-time: game
; -> number
;game-entities: game
; -> vector
;entities
;gem1
;gem2
;gem3
;player
(define test (make-level 50 20 (vector (make-posn 72 239) (make-posn 101 128) (make-posn 606 237) (make-posn 33 200))))
;checks to call the game score
(check-expect (level-score test) 50)
;checks to call the vector component in the struct
(check-expect (level-entities test)
(vector (make-posn 72 239) (make-posn 101 128) (make-posn 606 237) (make-posn 33 200)))
;checks to call a posn from the vector component of the struct
(check-expect (vector-ref (level-entities test) 3)
(make-posn 33 200))
;checks to call posn-x from the a posn in the vector component of the struct
(check-expect (posn-x (vector-ref (level-entities test) 3)) 33)
(define game (make-level 0 180 (vector (make-posn 72 239) (make-posn 101 128) (make-posn 606 237) (make-posn 33 200))))
;RANDOMIZER
;takes in a number and returns a set of random coordinates as a posn
;20<=x<=673
;90<=y<=150
;random-posn: number(x)
; posn
(define (random-posn x)
(make-posn (+ 20 (random (- WIDTH 20)))
(+ 90 (random (- HEIGHT 250)))))
(check-random (random-posn 1)
(make-posn (+ 20 (random (- WIDTH 20)))
(+ 90 (random (- HEIGHT 250)))))
;TICK HANDLER
;takes in a game struct and keeps or returns the y value of the 3rd vector component to 200
;randomizes the locations of the 3 gems using the vector component
;subracts 1 second from the time
;handle-tick: current(game)
; -> game
(define (handle-tick current)
(cond [(and (<= (posn-y (vector-ref (level-entities current) 3)) 200)
(and (<= (level-time current) 180)
(> (level-time current) 0)))
(make-level (level-score current)
(- (level-time current) 1)
(vector (vector-set! (level-entities current)
0
(random-posn 1))
(vector-set! (level-entities current)
1
(random-posn 1))
(vector-set! (level-entities current)
2
(random-posn 1))
(vector-set! (level-entities current)
3
(make-posn (posn-x (vector-ref (level-entities current) 3))
(- (posn-y (vector-ref (level-entities current) 3)) GRAVITY)))))]
[else (make-level (level-score current)
(- (level-time current) 1)
(level-entities current))]))
;DRAW HANDLER
;takes in a game struct and draws character-boy based on the entities vector(entities)
;handle-tick: current(game)
; -> img
(define (handle-draw current)
;score
(place-image (text (string-append "SCORE: "
(number->string (level-score current)))
25 "black")
630 60
;time
(place-image (text (string-append "TIME: "
(number->string (level-time current)))
25 "black")
630 25
;gem1
(place-image gem
(posn-x (vector-ref (level-entities current) 0))
(posn-y (vector-ref (level-entities current) 0))
;gem2
(place-image gem
(posn-x (vector-ref (level-entities current) 1))
(posn-y (vector-ref (level-entities current) 1))
;gem3
(place-image gem
(posn-x (vector-ref (level-entities current) 2))
(posn-y (vector-ref (level-entities current) 2))
;character
(place-image character-boy
(posn-x (vector-ref (level-entities current) 3))
(posn-y (vector-ref (level-entities current) 3))
world)))))))
;KEY-HANDLER
;takes in game struct and the "left" "right" "up" keys to move the character
;handle-key: current(game)
; game
;(define (handle-key current key)
; (cond [(key=? "left" key)
; (make-game
(big-bang game
(on-tick handle-tick)
; (on-key handle-key)
(on-draw handle-draw))
答案 0 :(得分:4)
由于这段代码:
(vector (vector-set! (level-entities current)
0
(random-posn 1))
(vector-set! (level-entities current)
1
(random-posn 1))
(vector-set! (level-entities current)
2
(random-posn 1))
(vector-set! (level-entities current)
3
(make-posn (posn-x (vector-ref (level-entities current) 3))
(- (posn-y (vector-ref (level-entities current) 3)) GRAVITY))))
这不是初始化矢量的正确方法。你可能想要的是:
(vector (random-posn 1)
(random-posn 1)
(random-posn 1)
(let ((current-posn (vector-ref (level-entities current) 3)))
(make-posn (posn-x current-posn)
(- (posn-y current-posn) GRAVITY))))