4

そこで、プログラムの設計方法第2版の最初の章を読みます。私はかなり良い進歩を遂げたと思います。しかし、グリッドに別のグラフィックを追加するための「提案」があります。試行するたびにエラーが発生します。この時点で、私は立ち往生しています。以下はコードとエラーです。

注: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つの式のみが必要ですが、余分な部分が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 に答える