所以我将阅读如何设计程序第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)]))
这是不起作用的代码:
(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)]))
我得到的错误是:
define:期望只有一个函数体的表达式,但是找到了 1个额外部分
答案 0 :(得分:5)
place-image
总是需要4个参数 - 要放置的图像,x和y坐标以及放置图像的场景(背景)。代码中的问题是表达式(place-image FLATBED STARTPOSITION 195)
仅向place-image
提供3个输入。
所以,稍微备份并考虑:第一个表达式产生什么? (place-image SHOWNSHIP x y GAMEBOARD)
生成一个游戏板场景,上面有一艘船,对吗?现在,在那个场景之上,您还想放置FLATBED
。因此,不要对场景图像函数调用进行排序,而是考虑编写它们 - 即您认为(place-image FLATBED STARTPOSITION 195 ____)
中缺少的部分是什么?在什么场景下你想放置FLATBED
? (提示:我们刚刚回答了上述内容)。什么表达产生那个场景? (提示:你已经有了这个表达方式)。
如果您理解这个想法,您会看到在场景上放置多个图像,您可以编写或嵌套函数调用(而不是在尝试时对它们进行排序):
(place-image img1 x1 y1 (place-image img2 x2 y2 ...))