4

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

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

注意:“建议”是:如何改变程序,使火箭降落在比场景底部高 10 像素的平坦岩床上?也不要忘记改变风景。

HTDP 第 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)]))

我得到的错误是:

定义:函数体只需要一个表达式,但发现了 1 个额外的部分

4

1 回答 1

5

place-image总是需要 4 个参数 - 要放置的图像、x 和 y 坐标以及放置图像的场景(背景)。您的代码中的问题是表达式(place-image FLATBED STARTPOSITION 195)仅提供 3 个输入到place-image.

所以,稍微退后一点,考虑一下:第一个表达式会产生什么?(place-image SHOWNSHIP x y GAMEBOARD)产生一个游戏板场景,上面有一艘船,对吗?现在,在该场景之上,您还想放置FLATBED. 因此,不要对 place-image 函数调用进行排序,而是考虑组合它们——即你认为缺失的部分在什么地方(place-image FLATBED STARTPOSITION 195 ____)?你想把它放在什么场景上FLATBED?(提示:我们刚刚在上面回答了这个问题)。什么表情产生了那个场景?(提示:你已经有了那个表达式)。

如果您理解这个想法,您会发现要将多个图像放置在一个场景中,您可以组合或嵌套函数调用(而不是在尝试时对它们进行排序):

(place-image img1 x1 y1 (place-image img2 x2 y2 ...))
于 2012-01-09T02:15:51.980 回答