2017-06-12 18 views
0

ラケットを使って10から0までカウントダウンするプログラムを書こうとしました。それは機能しましたが、カウントが速すぎると、1周に1秒をカウントする設定時間を実装する方法がありますか?私はそれに取り組んでいますが、とにかく見つけることができませんでした。あなたの時間をありがとう。これまでのコードは次のとおりです。ラケットを使用してクロック速度を制御するにはどうすればよいですか?

;; 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% - Webサーバのライブラリから - 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機能でこれをテストすることができます。開始時刻と終了時刻を取得して差分を取るだけです。 machine私は '10138' ms、すなわち10.138秒の合計時間を得ました。

+0

私がラケットに書いてから、しばらくしていましたが、ラケット/ベースから「スリープ」を使用しない理由がありますか? – cat

+0

できます。あなたがラケット/ GUI /ベースを使用することを避けたいのであれば、それを行う良い方法の1つです。 (この場合、私はまだ 'alarm-evt'と' sync'をお勧めします。実際のガッチャは、スレッドが起きるたびに、現在の時間をサンプリングして、実際にどれだけ眠っているかを調べる必要があります。これは、スリープでは、スレッドが「少なくとも」スリープ状態になることが保証されているため、スリープ状態になることが保証されているためです。 –

関連する問題