2017-06-12 26 views
0

我試圖寫一個使用球拍從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

查看https://stackoverflow.com/editing-help – cat

回答

1

你在找什麼是'計時器'。球拍有一些不同的定時器內置的概念,你甚至可以自己製作。但有兩個比較突出的在建的有:

  • timer% - 從racket/gui/base庫,並
  • timer - 從Web服務器庫。

或者你也可以使用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])) 

現在停止,當您運行此程序時,它應該算我們可以用current-milliseconds這個函數測試一下,只需要抓住開始時間和結束時間,並且改變它們。當我把它運行在我的機器的總時間爲'10138'ms,或10.138秒。

+0

自從我在Racket上寫了一段時間,但是有沒有理由不使用'racket/base'中的'sleep'? – cat

+0

你可以做到。如果你想避免使用球拍/ gui/base這是一個很好的方法來做到這一點。 (雖然在這種情況下,我仍然會推薦'alarm-evt'和'sync',真正的技巧是每次線程喚醒後,它必須抽取當前時間來看看它實際上睡了多久,相應地設置下一個鬧鐘,這是因爲睡眠只能保證一個線程只要你提問就會「至少」睡眠,但它可以(而且經常)會睡得更多。 –