我尝试使用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]))
答案 0 :(得分:2)
您正在寻找的是'计时器'。 Racket内置了一些不同的计时器概念,你甚至可以制作自己的计时器。但是其中两个更为突出的内置产品是:
或者您可以使用alarm-evt
和sync
自行制作。 (你也可以从更“低级”的原语制作你自己的计时器,但我不建议这样做,因为它很容易犯错误并得错时间。
由于看起来您已经在使用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秒。