Scheme 编程突破球拍(BSL)使用大爆炸。放置挡板时遇到错误

Scheme 编程突破球拍(BSL)使用大爆炸。放置挡板时遇到错误,scheme,lisp,racket,breakout,racket-student-languages,Scheme,Lisp,Racket,Breakout,Racket Student Languages,我们的目标是让游戏突破,并逐步做到这一点。我已经在第一步中遇到了问题,那就是实现一个划桨。球和球的反弹已经预定义并给定。我希望将其放在(定义(渲染球)中,如下所示: 然而,我得到了一个错误“画图:一个参数的预期函数作为第一个参数;给定两个参数的函数”我不确定如何才能使代码更好。以下是我的代码到目前为止的样子。球和刻度已经预定义。到目前为止,我甚至无法放置桨,但球会反弹(尚未实施任何砖块) (需要2htdp/image) (需要2htdp/宇宙) (定义宽度200) (定义高度200) (定义球半

我们的目标是让游戏突破,并逐步做到这一点。我已经在第一步中遇到了问题,那就是实现一个划桨。球和球的反弹已经预定义并给定。我希望将其放在(定义(渲染球)中,如下所示:

然而,我得到了一个错误“画图:一个参数的预期函数作为第一个参数;给定两个参数的函数”我不确定如何才能使代码更好。以下是我的代码到目前为止的样子。球和刻度已经预定义。到目前为止,我甚至无法放置桨,但球会反弹(尚未实施任何砖块)

(需要2htdp/image)
(需要2htdp/宇宙)
(定义宽度200)
(定义高度200)
(定义球半径10)
(定义BALL-IMG(圆球半径“实心”“红色”))
(定义场景(空场景宽度高度))
(定义挡板(矩形60 10“实心”“绿色”))
(定义速度4)
(定义结构级别(delta-x delta-y))
;级别是一种结构:(生成级别编号)
;interp.运动物体的速度矢量
(定义结构球(定位速度))
;球是一种结构:(使球处于水平位置)
;解释物体的位置和速度
;Posn Vel->Posn
;将q应用于p,并在一个时钟周期内模拟移动
(检查预期(位置+标高(位置5-6)(标高1-2))
(做出姿势6-8)
(定义(posn+vel p q)
(制作posn(+(posn-xp)(vel-delta-xq))
(+(posn-yp)(vel-delta-yq)))
;球->球
;在一个时钟滴答声中计算球的移动
(检查预期(移动球(制造球)(制造位置20-30)
(使5级10级)
(制造球(制造位置25-40)
(使5级10级)
(定义(移动球)
(制造钢球(位置+水平(钢球定位钢球)
(球速度球)
(球速度球)
;碰撞是
-“顶部”
-“向下”
;-“左”
;-“对”
;-“没有”
;interp.球与墙碰撞的位置
;Posn->碰撞
;检测球与哪一面墙(如果有)碰撞
(选中expect(碰撞(使位置0 12))“左”)
(检查预期(碰撞(使位置15高))“向下”)
(选中expect(碰撞(使位置宽度为12))“右”)
(选中expect(碰撞(使位置15 0))“顶部”)
(选中expect(碰撞(使位置55))“无”)
(定义(碰撞位置)
(续)
[(=(posn-y posn)(-高度球半径))“向下”]
[否则为“无”])
;水平碰撞->水平碰撞
;计算碰撞后对象的速度
(选中expect(反弹(使3-4级变为“左”)
(制造等级-3-4))
(检查预期(反弹(使3-4级为“顶部”)
(3-4级)
(选中expect(反弹(使3-4级为“无”)
(3级4级)
(定义(反弹水平碰撞)
(条件[(或(字符串=?碰撞“左”)
(字符串=?冲突“右”))
(制造标高(-(标高-delta-x标高))
(vel-delta-y vel))]
[(或(字符串=?碰撞“向下”)
(字符串=?碰撞“顶部”))
(制造标高(标高-delta-x标高)
((vel-delta-y vel))]
[其他级别])
世界国家是一个球
;解释球的当前状态
;世界状态->图像
;在其位置渲染球
;(选中expect(图像?(渲染初始球))#true)
(定义(渲染球世界状态)
(将图像球放置在IMG上
(位置N-x(球定位球))
(位置N-y(球定位球))
(场景)
;世界国家->世界国家
;将球移动到下一个位置
(检查期望值(勾选(制造球(制造位置20-12)(制造级别12)))
(制作球(制作位置2114)(制作级别12)))
(定义(勾选球)
(移动球(制造球(球定位球)
(弹跳(球速度球)
(碰撞(球定位球(()())))
(定义结构世界状态(划桨速度球))
;世界状态是一种结构(使世界状态划桨速度球)
(定义示例世界状态(使世界状态变为桨叶速度(使球变为posn 20 12)
(使等级为1级2级)
老鼠
;Worldstate编号MouseeEvent->Worldstate
划桨
(定义(鼠标世界状态x y鼠标事件)
(使世界状态(世界状态速度世界状态)(世界状态球世界状态)
(续)
[(字符串=?鼠标事件“移动”)
(使位置为x y)]
[其他(世界国家划桨世界国家)])
(定义初始球(制造球(制造位置20-12)
(使级别为1级和2级)
(定义初始世界状态初始球)
(定义(主状态)
(大爆炸状态(在刻度0.01上)(绘制渲染)(在鼠标上)))
(主要初始世界国家)

非常感谢您提供的提示!

我注意到您的“渲染”函数签名是

世界状态->图像

但是,render会获得两个参数:

 `(define (render ball worldstate) ...)`
签名用于类型检查和更好地记录您的工作,以便其他人理解,在这种情况下,它帮助我快速找到问题:)

根据您提供的错误:

(绘制渲染)

在函数“main”中,渲染应为仅接收1个参数的函数,而在代码中,它被定义为接受2个参数的函数:

检查渲染并在此处绘制:
渲染功能仅将世界状态作为参数,不能添加更多参数。
您的球拍已处于状态,您可以从中检索球和球拍:

(define (render world)
    (place-image BALL-IMG
           (posn-x (ball-loc (world-state-ball world))
           (posn-y (ball-loc (world-state-ball world))
    ...
您可能希望为组件编写单独的渲染函数:

(define (render-ball ball)
     ...)

(define (render-paddle paddle)
     ...)

(define (render-world world)
    (render-ball (world-state-ball world))
    (render-paddle (world-state-paddle world))

因此,如果我有这些不同的渲染,然后最终将本例中的渲染世界放入我的(定义(主状态)中,所有内容都应该显示出来吗?:D我理解正确吗?@好的,他们应该理解,但我不承诺任何事情;-)(制作单独的函数会很方便,wh
(define (render world)
    (place-image BALL-IMG
           (posn-x (ball-loc (world-state-ball world))
           (posn-y (ball-loc (world-state-ball world))
    ...
(define (render-ball ball)
     ...)

(define (render-paddle paddle)
     ...)

(define (render-world world)
    (render-ball (world-state-ball world))
    (render-paddle (world-state-paddle world))