2012-01-09 67 views
4

所以我要通過程序設計方法第2版的第一章。我相信我取得了不錯的進展。但是有一個「建議」在網格中添加另一個圖形。每次嘗試我都會遇到錯誤。在這一點上,我卡住了。以下是代碼和錯誤。爲什麼我不能在函數體中進行兩個make函數調用?

注:火箭圖像是在第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)])) 

而我得到的錯誤是:

定義:預期的函數體只有一個表情,卻發現 1額外部分

回答

4

place-image alw ays需要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 ...)) 
+0

真棒! Nadeem提示你做了訣竅。我的回答是:(定義SPACESHIP-BOTTOM( - BOARDHEIGHT (/(圖像高度SHOWNSHIP)2) (/(圖像高度平板式)2))) (定義(渲染shownship XY) (地方 - 像平板中StartPosition 195 (地方形象SHOWNSHIP XY遊戲鍵盤))) – dotnetN00b 2012-01-09 02:33:14

+0

請隱藏解決這個。這是一個家庭作業問題,如果解決方案就在那裏,問題的關鍵就會受到破壞。 – dyoo 2012-01-09 03:13:27

+0

我不認爲這是。我所做的甚至不是書中的練習。你看過鏈接嗎?此外,這是自學/學習。我沒有上課。但是如果主持人想把我的答案放在擾流標籤中。隨意。 – dotnetN00b 2012-01-09 03:37:17

相關問題