You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在DrRacket初学者版本中渲染列表中的ball结构体?

解决方案

你需要两个核心函数:一个负责渲染单个ball到场景,另一个通过递归遍历列表,把所有ball依次叠加到初始场景上。

步骤1:实现单个ball的渲染函数

先写一个render-ball函数,它接收一个ball结构体和当前场景,返回该ball被绘制到场景后的新场景:

(define (render-ball a-ball scene)
  (place-image (ball-img a-ball)
               (pos-x (ball-pos a-ball))
               (pos-y (ball-pos a-ball))
               scene))

步骤2:实现递归的列表渲染函数

render函数需要遍历ball列表,每次取列表的第一个元素,用render-ball把它加到场景里,然后递归处理剩下的列表元素,直到列表为空(此时返回初始场景):

(define (render ball-list)
  (cond
    [(empty? ball-list) SCENE]  ; 列表为空时返回初始场景
    [else (render-ball (first ball-list)  ; 渲染第一个ball
                       (render (rest ball-list)))]))  ; 递归处理剩下的列表

完整代码

把上述函数补充到你的代码里,完整代码如下:

(define SCENE (empty-scene 500 500))
(define-struct pos (x y))
(define-struct ball (img pos))

(define (render-ball a-ball scene)
  (place-image (ball-img a-ball)
               (pos-x (ball-pos a-ball))
               (pos-y (ball-pos a-ball))
               scene))

(define (render ball-list)
  (cond
    [(empty? ball-list) SCENE]
    [else (render-ball (first ball-list)
                       (render (rest ball-list)))]))

(define game (list
               (make-ball (circle 10 "solid" "blue") (make-pos 250 250))
               (make-ball (circle 10 "solid" "red") (make-pos 150 150))))

(big-bang game
  [to-draw render])

逻辑说明

  • 递归终止条件:当ball列表为空时,直接返回初始的SCENE。
  • 递推进程:每次取出列表的第一个ball,先递归处理剩下的所有ball得到一个已渲染部分元素的场景,再把当前ball放到这个场景上,最终得到所有ball都渲染完成的场景。

内容的提问来源于stack exchange,提问作者tim123908

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 08:25:03