所以我将阅读如何设计程序第2版的第一章.我相信我取得了不错的进步.但是有一个"建议"将另一个图形添加到网格中.每次我尝试我都会收到错误.此时,我被困住了.下面是代码和错误.
注意:ROCKET图像在第1章中.我只是将其复制并粘贴到IDE中.
注意:"建议"是:如何更改程序以使火箭落在比场景底部高10个像素的平坦岩床上?别忘了改变风景.
这是有效的代码.
(define BOARDWIDTH 200)
(define BOARDHEIGHT 200)
(define STARTPOSITION 50)
(define BOARDBKGR "blue")
(define GAMEBOARD (empty-scene BOARDWIDTH BOARDHEIGHT BOARDBKGR))
(define ROCKET .)
(define UFO (overlay (circle 10 "solid" "red")
(rectangle 40 4 "solid" "green")))
(define FLATBED (rectangle 60 10 "outline" "black"))
(define (SPACESHIP option)
(cond
[(= option 1) ROCKET]
[(= option 2) UFO]))
(define SHOWNSHIP (SPACESHIP 1))
(define V 20) ;Velocity
(define A 1) ;Acceleration
(define (distance t) ;t = Time
(- (* V t) (* 1/2 A (sqr t))))
(define SPACESHIP-BOTTOM (- BOARDHEIGHT (/ (image-height SHOWNSHIP) 2)))
(define (render-shownship x y)
(place-image SHOWNSHIP x y GAMEBOARD))
(define (create-rocket-scene.v7 t)
(cond
[(<= (distance t) SPACESHIP-BOTTOM)
(render-shownship STARTPOSITION (distance t))]
[(> (distance t) SPACESHIP-BOTTOM)
(render-shownship STARTPOSITION SPACESHIP-BOTTOM)]))
Run Code Online (Sandbox Code Playgroud)
这是不起作用的代码:
(define BOARDWIDTH 200)
(define BOARDHEIGHT 200)
(define STARTPOSITION 50)
(define BOARDBKGR "blue")
(define GAMEBOARD (empty-scene BOARDWIDTH BOARDHEIGHT BOARDBKGR))
(define ROCKET .)
(define UFO (overlay (circle 10 "solid" "red")
(rectangle 40 4 "solid" "green")))
(define FLATBED (rectangle 60 10 "outline" "black"))
(define (SPACESHIP option)
(cond
[(= option 1) ROCKET]
[(= option 2) UFO]))
(define SHOWNSHIP (SPACESHIP 1))
(define V 20) ;Velocity
(define A 1) ;Acceleration
(define (distance t) ;t = Time
(- (* V t) (* 1/2 A (sqr t))))
(define SPACESHIP-BOTTOM (- BOARDHEIGHT (/ (image-height SHOWNSHIP) 2)))
(define (render-shownship x y)
(place-image SHOWNSHIP x y GAMEBOARD)
(place-image FLATBED STARTPOSITION 195 GAMEBOARD)) ;offender
(define (create-rocket-scene.v7 t)
(cond
[(<= (distance t) SPACESHIP-BOTTOM)
(render-shownship STARTPOSITION (distance t))]
[(> (distance t) SPACESHIP-BOTTOM)
(render-shownship STARTPOSITION SPACESHIP-BOTTOM)]))
Run Code Online (Sandbox Code Playgroud)
而我得到的错误是:
define:期望函数体只有一个表达式,但找到1个额外部分
place-image总是需要4个参数 - 要放置的图像,x和y坐标,以及放置图像的场景(背景).代码中的问题是表达式(place-image FLATBED STARTPOSITION 195)只提供3个输入place-image.
所以,稍微备份并考虑:第一个表达式产生什么?(place-image SHOWNSHIP x y GAMEBOARD)制作一个有船的游戏板场景,对吗?现在在那个场景的顶部你还想放置FLATBED.因此,不是对场景图像函数调用进行排序,而是考虑编写它们 - 即您认为缺失的部分是(place-image FLATBED STARTPOSITION 195 ____)什么?在什么场景你想放置FLATBED?(提示:我们刚刚回答了上述内容).什么表达产生那个场景?(提示:你已经有了这个表达).
如果您理解了这个想法,您会看到在场景中放置多个图像,您可以编写或嵌套函数调用(而不是在尝试时对它们进行排序):
(place-image img1 x1 y1 (place-image img2 x2 y2 ...))
Run Code Online (Sandbox Code Playgroud)