结构中的值出错

时间:2016-04-09 04:33:45

标签: struct racket let

我已经开始使用2htdp/universe库在球拍中构建一个小游戏。到目前为止我的代码:

#lang racket
(require 2htdp/image 2htdp/universe)

(define BIRD-IMG (scale .2 (object:image% ...)) ; Image URL: http://i.stack.imgur.com/Vz26B.png

(struct world (bird) #:transparent)
(struct pos (x y) #:transparent)
(struct bird (pos img) #:transparent)

(define-values (WIDTH HEIGHT)
  (values 600 600))

(define DEFAULT-STATE (world (bird (pos (/ WIDTH 2) (/ HEIGHT 2)) BIRD-IMG)))

(define (move-bird w x y dir)
  (world
   (bird
    (pos
     (let
         ([new-x (+ (pos-x (bird-pos (world-bird w))) x)]
          [new-y (+ (pos-y (bird-pos (world-bird w))) y)])
       (values
        (cond
          [(> new-x WIDTH) WIDTH]
          [(< new-x 0) 0]
          [else new-x])
        (cond
          [(> new-y HEIGHT) HEIGHT]
          [(< new-y 0) 0]
          [else new-y]))))
    (case dir
      [("up") BIRD-IMG]
      [("down") (rotate 180 BIRD-IMG)]
      [("left") (rotate 90 BIRD-IMG)]
      [("right") (rotate -90 BIRD-IMG)]
      [else (bird-img (world-bird w))]))))

(define (render w)
  (place-image (bird-img (world-bird w))
               (pos-x (bird-pos (world-bird w)))
               (pos-y (bird-pos (world-bird w)))
               (empty-scene WIDTH HEIGHT)))

(define (handle-keys w key)
  (case key
    [("up") (move-bird w 0 -5 key)]
    [("down") (move-bird w 0 5 key)]
    [("left") (move-bird w -5 0 key)]
    [("right") (move-bird w 5 0 key)]
    [else w]))

(big-bang DEFAULT-STATE
          (on-draw render)
          (on-key handle-keys)
          (on-tick (lambda (w) w) 20)
          (name "Bird Simulator 2016"))

我的问题:当我尝试按箭头键向一个方向移动鸟时,'move-bird'功能出错:

result arity mismatch;
 expected number of values not received
  expected: 1
  received: 2
  values...:

通过DrRacket的调试器运行它,我可以看到let中的变量超出了范围,但程序的位置低于最外层的world结构。我很困惑,因为arity不匹配错误没有命名任何特定的地方/功能,我当然没有看到任何地方给出更多的值然后是必需的。 world结构仅传递bird结构,bird结构仅传递posimg。它可能与let结构中的pos有关,但我不确定。请帮忙!

0 个答案:

没有答案