Blame


1 12687dd9 2023-08-04 jrmu ;; The first three lines of this file were inserted by DrScheme. They record metadata
2 12687dd9 2023-08-04 jrmu ;; about the language level of this file in a form that our tools can easily process.
3 12687dd9 2023-08-04 jrmu #reader(lib "htdp-advanced-reader.ss" "lang")((modname |37.1|) (read-case-sensitive #t) (teachpacks ((lib "draw.ss" "teachpack" "htdp") (lib "arrow.ss" "teachpack" "htdp") (lib "gui.ss" "teachpack" "htdp"))) (htdp-settings #(#t constructor repeating-decimal #t #t none #f ((lib "draw.ss" "teachpack" "htdp") (lib "arrow.ss" "teachpack" "htdp") (lib "gui.ss" "teachpack" "htdp")))))
4 12687dd9 2023-08-04 jrmu ;;Model
5 12687dd9 2023-08-04 jrmu
6 12687dd9 2023-08-04 jrmu ;;Constants
7 12687dd9 2023-08-04 jrmu
8 12687dd9 2023-08-04 jrmu ;;The allowed variety of colors for mastermind as a (listof symbols).
9 12687dd9 2023-08-04 jrmu (define COLORS '(black white red blue green gold pink orange purple navy))
10 12687dd9 2023-08-04 jrmu
11 12687dd9 2023-08-04 jrmu ;;The number of colors. The number of colors must be even.
12 12687dd9 2023-08-04 jrmu (define COL# (length COLORS))
13 12687dd9 2023-08-04 jrmu
14 12687dd9 2023-08-04 jrmu ;;Data Definition
15 12687dd9 2023-08-04 jrmu ;;A color is a symbol found in COLORS.
16 12687dd9 2023-08-04 jrmu
17 12687dd9 2023-08-04 jrmu ;;State Variables
18 12687dd9 2023-08-04 jrmu ;;target1, target2 : colors
19 12687dd9 2023-08-04 jrmu ;;Both target1 and target2 represent the chosen colors for mastermind. They are originally defined to be the first entry in COLORS but their definitions will change after master initializes the state variables.
20 12687dd9 2023-08-04 jrmu (define target1 (first COLORS))
21 12687dd9 2023-08-04 jrmu (define target2 (first COLORS))
22 12687dd9 2023-08-04 jrmu
23 12687dd9 2023-08-04 jrmu ;;guesses : number
24 12687dd9 2023-08-04 jrmu ;;guesses represent the number of guesses taken to reach the answer for mastermind.
25 12687dd9 2023-08-04 jrmu (define guesses 0)
26 12687dd9 2023-08-04 jrmu
27 12687dd9 2023-08-04 jrmu ;;guess1, guess2 : color
28 12687dd9 2023-08-04 jrmu ;;Represents the first or second color guessed.
29 12687dd9 2023-08-04 jrmu
30 12687dd9 2023-08-04 jrmu (define guess1 (first COLORS))
31 12687dd9 2023-08-04 jrmu (define guess2 (first COLORS))
32 12687dd9 2023-08-04 jrmu
33 12687dd9 2023-08-04 jrmu ;;click-number : N
34 12687dd9 2023-08-04 jrmu ;;Determines whether this is the first click in a pair or the second. If the click-number is 2, we will clear the messages that keep track of which guesses have been made for a pair, and write the new guess in guess1-message. If the click-number is 1, we will not clear anything and fill in guess2-message.
35 12687dd9 2023-08-04 jrmu
36 12687dd9 2023-08-04 jrmu (define click-number 2)
37 12687dd9 2023-08-04 jrmu
38 12687dd9 2023-08-04 jrmu ;;master : -> void
39 12687dd9 2023-08-04 jrmu ;;Initializes each of target1 and target2 to a random color in COLORS. Also initializes the number of guesses to 0.
40 12687dd9 2023-08-04 jrmu
41 12687dd9 2023-08-04 jrmu (define (master)
42 12687dd9 2023-08-04 jrmu (begin (set! target1 (random-pick COLORS))
43 12687dd9 2023-08-04 jrmu (set! target2 (random-pick COLORS))
44 12687dd9 2023-08-04 jrmu (set! guesses 0)
45 12687dd9 2023-08-04 jrmu (set! guess1 (first COLORS))
46 12687dd9 2023-08-04 jrmu (set! guess2 (first COLORS))
47 12687dd9 2023-08-04 jrmu (set! click-number 2)))
48 12687dd9 2023-08-04 jrmu
49 12687dd9 2023-08-04 jrmu ;random-pick : (listof X) -> XExercise 37.1.4. Modify the color guessing program so that it
50 12687dd9 2023-08-04 jrmu ;Given alist, randomly choose one item from that list.
51 12687dd9 2023-08-04 jrmu
52 12687dd9 2023-08-04 jrmu (define (random-pick alist)
53 12687dd9 2023-08-04 jrmu (list-ref alist (random (length alist))))
54 12687dd9 2023-08-04 jrmu
55 12687dd9 2023-08-04 jrmu ;; check-guess : color color color color -> symbol
56 12687dd9 2023-08-04 jrmu ;; Given guess1 and guess2, which are symbols representing the color of squares 1
57 12687dd9 2023-08-04 jrmu ;; and 2, respectively, the function lets you check if the guesses are the same
58 12687dd9 2023-08-04 jrmu ;; as target1 and target2.
59 12687dd9 2023-08-04 jrmu
60 12687dd9 2023-08-04 jrmu (define (check-guess guess1 guess2 target1 target2)
61 12687dd9 2023-08-04 jrmu (cond
62 12687dd9 2023-08-04 jrmu [(and (symbol=? guess1 target1)
63 12687dd9 2023-08-04 jrmu (symbol=? guess2 target2)) 'Perfect]
64 12687dd9 2023-08-04 jrmu [(or (symbol=? guess1 target1)
65 12687dd9 2023-08-04 jrmu (symbol=? guess2 target2)) 'OneColorAtCorrectPosition]
66 12687dd9 2023-08-04 jrmu [(or (symbol=? guess1 target2)
67 12687dd9 2023-08-04 jrmu (symbol=? guess2 target1)) 'OneColorOccurs]
68 12687dd9 2023-08-04 jrmu [else 'NothingCorrect]))
69 12687dd9 2023-08-04 jrmu
70 12687dd9 2023-08-04 jrmu ;master-check : color color -> (list symbol number)
71 12687dd9 2023-08-04 jrmu ;Returns a list containing a message and a number. The message either indicates that the game is solved given guess1 and guess2, or it reveals a hint. The number indicates the number of guesses taken.
72 12687dd9 2023-08-04 jrmu ;Effect : Increases the number of guesses by 1 each time.
73 12687dd9 2023-08-04 jrmu (define (master-check guess1 guess2)
74 12687dd9 2023-08-04 jrmu (local ((define return-list
75 12687dd9 2023-08-04 jrmu (begin (set! guesses (add1 guesses))
76 12687dd9 2023-08-04 jrmu (list (check-guess guess1 guess2 target1 target2) guesses))))
77 12687dd9 2023-08-04 jrmu (cond
78 12687dd9 2023-08-04 jrmu [(and (symbol=? guess1 target1)
79 12687dd9 2023-08-04 jrmu (symbol=? guess2 target2)) (begin (master)
80 12687dd9 2023-08-04 jrmu return-list)]
81 12687dd9 2023-08-04 jrmu [else return-list])))
82 12687dd9 2023-08-04 jrmu
83 12687dd9 2023-08-04 jrmu ;;View
84 12687dd9 2023-08-04 jrmu
85 12687dd9 2023-08-04 jrmu (define guess1-message (make-message "Guess 1"))
86 12687dd9 2023-08-04 jrmu (define guess2-message (make-message "Guess 2"))
87 12687dd9 2023-08-04 jrmu (define status-message (make-message "Let's play mastermind!"))
88 12687dd9 2023-08-04 jrmu (define num-guesses-message (make-message "Guesses: 0"))
89 12687dd9 2023-08-04 jrmu
90 12687dd9 2023-08-04 jrmu ;;Controller
91 12687dd9 2023-08-04 jrmu
92 12687dd9 2023-08-04 jrmu ;color-callback : color color -> true
93 12687dd9 2023-08-04 jrmu ;Draws the message associated with the two color guesses (status-message) and also the number of guesses in the appropriate text-box given color1 and color2.
94 12687dd9 2023-08-04 jrmu
95 12687dd9 2023-08-04 jrmu ;;button-callback : event -> true
96 12687dd9 2023-08-04 jrmu ;;Effect: writes guess1 into guess1-message and guess2 into guess2-message. Once the second guess has been made, button-callback will write the hint and number of guesses into status-message and num-guesses-message through color-callback.
97 12687dd9 2023-08-04 jrmu
98 12687dd9 2023-08-04 jrmu (define (color-callback color1 color2)
99 12687dd9 2023-08-04 jrmu (local ((define result-list (master-check color1 color2)))
100 12687dd9 2023-08-04 jrmu (and (draw-message status-message (symbol->string (first result-list)))
101 12687dd9 2023-08-04 jrmu (draw-message num-guesses-message (number->string (second result-list))))))
102 12687dd9 2023-08-04 jrmu
103 12687dd9 2023-08-04 jrmu ;make-color-button : N N -> GUI-Item (button)
104 12687dd9 2023-08-04 jrmu ;Given col and row (0,0 inclusive), make the button for the given color at row, col.
105 12687dd9 2023-08-04 jrmu ;Effect: Accesses click-number, guess1, guess2
106 12687dd9 2023-08-04 jrmu (define (make-color-button col row)
107 12687dd9 2023-08-04 jrmu (local
108 12687dd9 2023-08-04 jrmu ((define index (+ col (* (/ COL# 2) row)))
109 12687dd9 2023-08-04 jrmu (define current-color (list-ref COLORS index))
110 12687dd9 2023-08-04 jrmu (define (button-callback event)
111 12687dd9 2023-08-04 jrmu (cond
112 12687dd9 2023-08-04 jrmu [(= click-number 2)
113 12687dd9 2023-08-04 jrmu (begin (set! guess1 current-color)
114 12687dd9 2023-08-04 jrmu (set! click-number 1)
115 12687dd9 2023-08-04 jrmu (draw-message guess1-message (symbol->string current-color))
116 12687dd9 2023-08-04 jrmu (draw-message guess2-message ""))]
117 12687dd9 2023-08-04 jrmu [(= click-number 1)
118 12687dd9 2023-08-04 jrmu (begin (set! guess2 current-color)
119 12687dd9 2023-08-04 jrmu (set! click-number 2)
120 12687dd9 2023-08-04 jrmu (draw-message guess2-message (symbol->string current-color))
121 12687dd9 2023-08-04 jrmu (color-callback guess1 guess2))])))
122 12687dd9 2023-08-04 jrmu (make-button (symbol->string current-color) button-callback)))
123 12687dd9 2023-08-04 jrmu
124 12687dd9 2023-08-04 jrmu (define buttons-list
125 12687dd9 2023-08-04 jrmu (build-list 2 (lambda (y)
126 12687dd9 2023-08-04 jrmu (build-list (/ COL# 2)
127 12687dd9 2023-08-04 jrmu (lambda (x) (make-color-button x y))))))
128 12687dd9 2023-08-04 jrmu
129 12687dd9 2023-08-04 jrmu ;init-mastermind : -> true
130 12687dd9 2023-08-04 jrmu ;Initiates the game mastermind.
131 12687dd9 2023-08-04 jrmu
132 12687dd9 2023-08-04 jrmu (define (init-mastermind)
133 12687dd9 2023-08-04 jrmu (begin (master)
134 12687dd9 2023-08-04 jrmu (create-window (append buttons-list
135 12687dd9 2023-08-04 jrmu (list (list guess1-message guess2-message)
136 12687dd9 2023-08-04 jrmu (list status-message num-guesses-message))))))
137 12687dd9 2023-08-04 jrmu
138 12687dd9 2023-08-04 jrmu (init-mastermind)