如何使用Racket控制时钟速度?

时间:2017-06-12 17:45:08

标签: racket

我尝试使用Racket编写一个从10倒数到0的程序。它运作但计数过快,是否有办法实现每回合计算一秒的设定时间?我一直在努力,但无论如何都找不到。谢谢你的时间。到目前为止,这是我的代码:

;; Functions:

;; countdown -> countdown
;; start the world with main at CTR-X CTR-Y 
;; 
  (define (main cd)
    (big-bang cd                              ; countdown
              (on-tick advance-countdown)     ; countdown -> countdown
              (to-draw render)                ; countdown -> Image
              (on-key handle-key)             ; countdown KeyEvent ->
                                                countdown
              (on-mouse handle-mouse)))       ; Integer Integer MouseEvent 
                                              ; -> countdown

;; countdown -> countdown
;; produce the next number by decrease by 1 from the previous number 
   (check-expect (advance-countdown 5) 4)
   (check-expect (advance-countdown 0) 0)

;(define (advance-countdown cd) 0)  ; stub
;;<use template from Countdown>
  (define (advance-countdown cd)
    (if (= cd 0)
        0
        (- cd 1)))

;; countdown -> Image
;; render ... 
  (check-expect (render 4) (place-image (text (number->string 4) TEXTSIZE 
                                         TEXT-COLOR) CTR-X CTR-Y MTS))
;(define (render cd) MTS) ; stub

  (define (render cd) 
    (place-image (text (number->string cd) TEXTSIZE TEXT-COLOR)
                 CTR-X
               CTR-Y
               MTS))

;; countdown KeyEvent -> countdown
;; reset countdown to 10
   (check-expect (handle-key 10 " ") 10)
   (check-expect (handle-key 10 "a") 10) 
;(define (handle-key cd ke) 0) ; stub

   (define (handle-key cd ke)
     (cond [(key=? ke " ") 10]
           [else cd]))

1 个答案:

答案 0 :(得分:2)

您正在寻找的是'计时器'。 Racket内置了一些不同的计时器概念,你甚至可以制作自己的计时器。但是其中两个更为突出的内置产品是:

  • timer% - 来自racket/gui/base库和
  • timer - 来自网络服务器库。

或者您可以使用alarm-evtsync自行制作。 (你也可以从更“低级”的原语制作你自己的计时器,但我不建议这样做,因为它很容易犯错误并得错时间。

由于看起来您已经在使用gui(虽然是HTDP2 GUI而不是racket/gui),但请让用户timer%。只需创建一个递减计时器的回调,并在它达到0时停止。

#lang racket
(require racket/gui/base)
(define count 10)
(displayln count)
(define the-timer
  (new timer% [notify-callback
                (lambda ()
                  (set! count (- count 1))
                  (displayln count)
                  (when (= count 0)
                    (send the-timer stop)))]
              [interval 1000]))

现在,当你运行这个程序时,它应该一次从10秒到0秒。我们可以使用current-milliseconds函数对此进行测试。只需抓住开始时间,结束时间,并采取差异。当我在我的机器上运行时,我的总时间为'10138'毫秒,或10.138秒。