为什么我不能在函数体中进行两次make函数调用?

时间:2012-01-09 01:59:28

标签: scheme racket

所以我将阅读如何设计程序第2版的第一章。我相信我取得了不错的进步。但是有一个“建议”将另一个图形添加到网格中。每次我尝试我都会收到错误。此时,我被困住了。下面是代码和错误。

注意:ROCKET图像在第1章中。我只是将其复制并粘贴到IDE中。

注意:“建议”是:如何更改程序以使火箭落在比场景底部高10个像素的平坦岩床上?别忘了改变风景。

HTDP Chapter 1

这是有效的代码。

(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个额外部分

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 ...))