如何在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
相关产品推荐
相关产品推荐

