diff options
author | rsiddharth <s@ricketyspace.net> | 2020-07-03 15:47:02 -0400 |
---|---|---|
committer | rsiddharth <s@ricketyspace.net> | 2020-07-03 15:47:02 -0400 |
commit | 0f072be231d0bd875d1c87ff127834e60979263a (patch) | |
tree | 19010b72474c14a04891abbe3da0fb5d58067db9 /five/guess.rkt | |
parent | 4f731f11be9d5bbfcd921671852e514e577a0c00 (diff) |
net/ricketyspace/ror -> ./
Diffstat (limited to 'five/guess.rkt')
-rw-r--r-- | five/guess.rkt | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/five/guess.rkt b/five/guess.rkt new file mode 100644 index 0000000..f7a117a --- /dev/null +++ b/five/guess.rkt @@ -0,0 +1,75 @@ +#lang racket +(require 2htdp/universe 2htdp/image) + +(struct interval (small big guesses)) + +;;; constants +(define TEXT-SIZE 12) +(define HELP-TEXT + (text "↑ for larger numbers, ↓ for smaller ones" + TEXT-SIZE + "blue")) +(define HELP-TEXT2 + (text "Press = when your number is guessed; q to quit." + TEXT-SIZE + "blue")) +(define COLOR "red") +(define WIDTH (+ (image-width HELP-TEXT2) 10)) +(define HEIGHT 150) +(define SIZE 72) +(define TEXT-X 3) +(define TEXT-UPPER-Y 10) +(define TEXT-LOWER-Y 135) +(define GUESSES-SIZE 12) +(define GUESSES-COLOR "green") +(define MT-SC + (place-image/align + HELP-TEXT TEXT-X TEXT-UPPER-Y "left" "top" + (place-image/align + HELP-TEXT2 TEXT-X TEXT-LOWER-Y "left" "bottom" + (empty-scene WIDTH HEIGHT)))) + +;; main +(define (start lower upper) + (big-bang (interval lower upper 0) + (on-key deal-with-guess) + (to-draw render) + (stop-when single? render-last-scene))) + +;; key events +(define (deal-with-guess w key) + (cond [(key=? key "up") (bigger w)] + [(key=? key "down") (smaller w)] + [(key=? key "q") (stop-with w)] + [(key=? key "=") (stop-with w)] + [else w])) + +(define (smaller w) + (interval (interval-small w) + (max (interval-small w) (sub1 (guess w))) + (+ 1 (interval-guesses w)))) + +(define (bigger w) + (interval (min (interval-big w) (add1 (guess w))) + (interval-big w) + (+ 1 (interval-guesses w)))) + +(define (guess w) + (quotient (+ (interval-small w) (interval-big w)) 2)) + +(define (render w) + (overlay (overlay/offset + (text (number->string (guess w)) SIZE COLOR) 0 40 + (text (number->string (interval-guesses w)) + GUESSES-SIZE GUESSES-COLOR)) + MT-SC)) + +(define (render-last-scene w) + (overlay (overlay/offset + (text "End" SIZE COLOR) 0 40 + (text (number->string (interval-guesses w)) + GUESSES-SIZE GUESSES-COLOR)) + MT-SC)) + +(define (single? w) + (= (interval-small w) (interval-big w))) |