我正在学习球拍的书籍领域。
关于第五章,有一个挑战:
找到一个火车头的形象。创建一个运行机车的动画,从左边的边框到屏幕的右边边距。接下来,修改您的程序,以便机车在通过右边框后绕到屏幕的左侧。
我使用Racket和Dr. . Racket创建了以下代码。
不过,我敢打赌这是可以改进的。
我特别怀疑的是从右侧到左侧的过渡。我认为应该有更好的办法来做到这一点:
#lang racket
(require 2htdp/universe 2htdp/image)
(define LOCOMOTIVE image-inserted-through-DrRacket )
(define HEIGHT 800)
(define WIDTH 800)
;essa função muda a velocidade com que a figura se mexe
(define (add-3-to-state current-state)
(if (< current-state 1055)
(+ current-state 6)
(- current-state 800)))
(define (locomotive-running current-state)
(place-image LOCOMOTIVE current-state (/ WIDTH 2)
(empty-scene WIDTH HEIGHT)))
(big-bang 0
(on-tick add-3-to-state)
(to-draw locomotive-running))这就是我用过的图像:

发布于 2016-11-08 05:20:10
几点评论
add-3-to-state将6添加到状态。这就是幻数或未命名的数值常量的问题。(/ WIDTH 2)是一个常数。不需要每次通过代码计算它。WIDTH和HEIGHT这样的概念在一个层次上。LOCOMOTIVE在一个更高的层次。因为它是那个较高层次上唯一的实体,所以它可以推广到任意的图像。这使得整个代码的抽象级别保持一致。方法
将所有设置卷到一个带有结构的地方。
(require 2htdp/universe 2htdp/image)
(struct settings (image width height increment) #:transparent)创建一个高阶函数,该函数采用settings结构,并返回一个可用作to-draw参数的函数。返回的函数是特定settings上的闭包。
;; settings->(state->image)
(define (make-draw s)
(define offset (/ (settings-width s) 2))
(define scene (empty-scene (settings-width s)
(settings-height s)))
(lambda (state)
(place-image (settings-image s)
state
offset
scene)))创建一个高阶函数,该函数采用settings结构,并返回一个可用作on-tick参数的函数。返回的函数也是特定settings上的闭包。
;; settings->(state->state)
(define (make-update s)
(define end (+ (settings-width s) (image-width (settings-image s))))
(lambda (state)
(if (< state end)
(+ state (settings-increment s))
(- state (settings-width s)))))动画
的实现
(define my-settings (settings (circle 20 "solid" "blue")
800
800
6))
(define draw (make-draw my-settings)) ; draw is a function
(define update (make-update my-settings)) ; update is a function
(big-bang 0
(on-tick update)
(to-draw draw))有时,对实现进行概括是值得的。这个实现的下一个级别将是一个接受settings并返回big-bang动画的函数。
但有时它不值得这样做,因为这是通向factory-factory-factory类型实现的道路。
发布于 2016-11-06 17:50:20
广义地说,我会说它看起来很不错。我被“1055”弄糊涂了;我猜你是想等到火车完全离开屏幕?也许你可以把这个写成
(+ WIDTH (/ (image-width LOCOMOTIVE) 2))..。也可以用宽度代替800。或者,您可以返回0或
(- (/ (image-width LOCOMOTIVE) 2))当火车离开右边的边缘时,它就能平稳地驶入。
https://codereview.stackexchange.com/questions/146301
复制相似问题