首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Racket实现GUI

用Racket实现GUI
EN

Code Review用户
提问于 2016-11-06 13:42:40
回答 2查看 196关注 0票数 2

我正在学习球拍的书籍领域。

关于第五章,有一个挑战:

找到一个火车头的形象。创建一个运行机车的动画,从左边的边框到屏幕的右边边距。接下来,修改您的程序,以便机车在通过右边框后绕到屏幕的左侧。

我使用Racket和Dr. . Racket创建了以下代码。

不过,我敢打赌这是可以改进的。

我特别怀疑的是从右侧到左侧的过渡。我认为应该有更好的办法来做到这一点:

代码语言:javascript
复制
#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))

这就是我用过的图像:

EN

回答 2

Code Review用户

回答已采纳

发布于 2016-11-08 05:20:10

--

几点评论

  • 函数add-3-to-state将6添加到状态。这就是幻数或未命名的数值常量的问题。
  • (/ WIDTH 2)是一个常数。不需要每次通过代码计算它。
  • 抽象的两个层次混合在一起。像WIDTHHEIGHT这样的概念在一个层次上。LOCOMOTIVE在一个更高的层次。因为它是那个较高层次上唯一的实体,所以它可以推广到任意的图像。这使得整个代码的抽象级别保持一致。

--一种更广义的

方法

将所有设置卷到一个带有结构的地方。

代码语言:javascript
复制
(require 2htdp/universe 2htdp/image)
(struct settings (image width height increment) #:transparent)

创建一个高阶函数,该函数采用settings结构,并返回一个可用作to-draw参数的函数。返回的函数是特定settings上的闭包。

代码语言:javascript
复制
;; 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上的闭包。

代码语言:javascript
复制
;; 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)))))

动画

的实现

代码语言:javascript
复制
(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类型实现的道路。

票数 0
EN

Code Review用户

发布于 2016-11-06 17:50:20

广义地说,我会说它看起来很不错。我被“1055”弄糊涂了;我猜你是想等到火车完全离开屏幕?也许你可以把这个写成

代码语言:javascript
复制
(+ WIDTH (/ (image-width LOCOMOTIVE) 2))

..。也可以用宽度代替800。或者,您可以返回0或

代码语言:javascript
复制
(- (/ (image-width LOCOMOTIVE) 2))

当火车离开右边的边缘时,它就能平稳地驶入。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/146301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档