【问题标题】:Looping in Racket Exercise在球拍练习中循环
【发布时间】:2021-05-14 11:52:01
【问题描述】:

我正在尝试在 How to Design Programs (HTDP) 的第 2 版中的第 3 章练习 45 中做一个练习。

所以这个练习要我让一只猫的形象出现在场景的一侧,然后重新出现在起始侧。基本上是一个循环。我已经坚持这个练习一个多星期了,似乎无法理解正确的逻辑。我到处寻找不同的观点,所以我不必征求意见,但我被困住了。我想完成这个练习,所以我可以从中学习。

(require 2htdp/batch-io)
(require 2htdp/universe)
(require 2htdp/image)

(define cat1 . )

(define WIDTH  300)
(define HEIGHT 100)
(define RESTART-POINT (+ WIDTH (image-width cat1)))
(define BACKGROUND (empty-scene WIDTH HEIGHT))
(define cat1-CENTER-TO-TOP
  (- HEIGHT (/ (image-height cat1) 2)))

(define Y-cat1 cat1-CENTER-TO-TOP)

(define cat1-CENTER-TO-WIDTH
  (/ (image-width cat1) 2))

(define (main x0)
  (big-bang x0
    [on-tick tock]
    [to-draw render]))

(define (tock x)
  (+ x 3))

#old version
(define (render x)
  (cond
    [(>= (tock x)  RESTART-POINT)
      (place-image cat1 (tock(-  (tock x) (tock x))) Y-cat1 BACKGROUND)]
    [(<= (tock x) RESTART-POINT)
    (place-image cat1 (tock x) Y-cat1 BACKGROUND)]))
#new version
(define (render x)
  (cond
    [(< (tock x)  RESTART-POINT)
     (place-image cat1 (tock x) Y-cat1 BACKGROUND)]
    [(>= (tock x) RESTART-POINT)
    (place-image cat1 (modulo(tock x)RESTART-POINT) Y-cat1 BACKGROUND)]))

这会在屏幕上运行一只猫的图片,但这只猫永远不会像我想要的那样重新出现在左侧。

【问题讨论】:

  • 我想你的意思是练习 45,顺便说一句。你告诉它回到起点在哪里?你熟悉modulo 的作用吗?理论上,这应该是对tock 函数的简单修改。
  • @Calculuswhiz 感谢您的提示。我能够让它循环。干杯!

标签: scheme lisp racket


【解决方案1】:

感谢@calculuswhiz 的提示。 这是一个简单的修复,将模数添加到 tock 函数。

(define (render x)
  (cond
    [(< (tock x)  RESTART-POINT)
     (place-image cat1 (tock x) Y-cat1 BACKGROUND)]
    [(>= (tock x) RESTART-POINT)
    (place-image cat1 (modulo(tock x)RESTART-POINT) Y-cat1 BACKGROUND)]))

【讨论】:

    猜你喜欢
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多