首页 > 解决方案 > 在球拍练习中循环

问题描述

我正在尝试在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)]))

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

标签: schemelispracket

解决方案


感谢@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)]))

推荐阅读