-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmastermind.js
More file actions
218 lines (193 loc) · 7.49 KB
/
Copy pathmastermind.js
File metadata and controls
218 lines (193 loc) · 7.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
const mastermind = {};
//all the possible colors in the game
mastermind.colors = ["red", "blue", "yellow", "green", "pink", "white"];
mastermind.rightAnswer = [];
mastermind.gameStarted = false;
mastermind.attemptNumber = -1;
//Selectors
mastermind._pinButtons;
mastermind._pinButtonLabels;
mastermind._guessHolders;
mastermind._clueHolders;
mastermind._checkButton;
mastermind._startResetButton;
mastermind._rulesButton;
mastermind._closeRulesButton;
mastermind._rulesPage;
mastermind._answerHolders;
mastermind._answerCover;
mastermind.userSelectedPin;
mastermind.board = [
[null,null,null,null],
[null,null,null,null],
[null,null,null,null],
[null,null,null,null],
[null,null,null,null],
[null,null,null,null],
[null,null,null,null],
[null,null,null,null]];
//helper function to generate the random code.
mastermind.getRandomInt = (min, max) => {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random()*(max-min)) + min;
}
//generate the answer combination and store it in mastermind.rightAnswer
mastermind.generateRightAnswer = (colors) => {
mastermind.rightAnswer = [];
for(let i=0; i<4; i++){
mastermind.rightAnswer.push(
colors[mastermind.getRandomInt(0, 6)]
);
}
}
mastermind.revealRightAnswer = () => {
mastermind._answerHolders = [...document.querySelectorAll(".answer-holder .guess-holder")];
for(let i=0; i<mastermind._answerHolders.length; i++){
mastermind._answerHolders[i].classList.add("pin", mastermind.rightAnswer[i])
}
mastermind._answerCover = document.querySelector(".answer-cover");
mastermind._answerCover.classList.add("reveal")
}
mastermind.generateClue = (userPattern, rightAnswer) => {
let blackPegCount = 0;
let whitePegCount = 0;
copyUserPattern = [...userPattern];
copyRightAnswer = [...rightAnswer];
for (let i = 0; i < userPattern.length; i++) {
if (copyUserPattern[i] === copyRightAnswer[i]) {
blackPegCount++;
copyUserPattern[i] = NaN;
copyRightAnswer[i] = NaN;
}
}
for (let i = 0; i < userPattern.length; i++) {
for (let j = 0; j < rightAnswer.length; j++) {
if (copyRightAnswer[i] === copyUserPattern[j]) {
whitePegCount++;
copyUserPattern[j] = NaN;
copyRightAnswer[i] = NaN;
}
}
}
return { blackPegCount: blackPegCount, whitePegCount: whitePegCount };
}
mastermind.holeClickHandler = (e) => {
let currentHole = e.target;
//first remove all the existing color classes
currentHole.classList.remove("pin",...mastermind.colors)
//extract index information from class name
let indexOfHole = [...currentHole.classList][1].slice(-1);
//make sure the current hole position is null
mastermind.board[mastermind.attemptNumber][indexOfHole] = null;
if (mastermind.userSelectedPin) {
//add color string to the class of the currentHole
currentHole.classList.add("pin", mastermind.userSelectedPin);
//update the board with the color
mastermind.board[mastermind.attemptNumber][indexOfHole] =
mastermind.userSelectedPin;
}
}
mastermind.checkButtonClickHandler = () => {
let userPattern = mastermind.board[mastermind.attemptNumber];
if (userPattern.includes(null)) {
window.alert("please fill all the pin holes");
} else {
let pegs = mastermind.generateClue(userPattern, mastermind.rightAnswer);
let blackPegs = pegs.blackPegCount;
let whitePegs = pegs.whitePegCount;
for (let i = 0; i < blackPegs; i++) {
mastermind._clueHolders[i].classList.add("peg", "black");
}
for (let i = 0; i < whitePegs; i++) {
mastermind._clueHolders[i + blackPegs].classList.add("peg", "white");
}
if (blackPegs === 4){
mastermind._checkButton.classList.remove("showButton");
mastermind.revealRightAnswer();
setTimeout(()=>{
window.alert("Congratulations you won!")
}, 2500);
}
else if(mastermind.attemptNumber===7){
mastermind.revealRightAnswer();
setTimeout(() => {
window.alert("Sorry you lost");
}, 2500);
}
else{
//hide current levels check button
mastermind._checkButton.classList.remove("showButton");
//remove the event listener from the current levels holes
for (let i = 0; i < mastermind._guessHolders.length; i++) {
mastermind._guessHolders[i].removeEventListener("click",mastermind.holeClickHandler);
mastermind._guessHolders[i].style.cursor = "default"
}
//go to next attempt.
mastermind.nextAttempt();
}
}
}
mastermind.rulesButtonClickHandler = (e) => {
mastermind._rulesPage.style.display = "flex";
}
mastermind.closeRulesButtonClickHandler = (e) => {
mastermind._rulesPage.style.display = "none";
}
mastermind.startResetClickHandler = (e) => {
if (e.target.innerHTML === "Reset") {
window.location.reload();
}
if(e.target.innerHTML==="Start"){
mastermind._startResetButton.innerText = "Reset";
//enable the radio buttons
mastermind._pinButtons.forEach( pinButton => pinButton.disabled = false);
mastermind._pinButtonLabels.forEach( pinButtonLabel => pinButtonLabel.style.cursor = "pointer");
mastermind.nextAttempt();
}
};
mastermind.nextAttempt = () => {
mastermind.attemptNumber++;
//only select current levels guessHolders and clueHolders by selecting row$
mastermind._guessHolders = [...document.querySelectorAll(`.row${mastermind.attemptNumber} .guess-holder`)];
mastermind._clueHolders = [...document.querySelectorAll(`.row${mastermind.attemptNumber} .clue-holder`)];
//only make current levels check button visible using the showButton class.
mastermind._checkButton = document.querySelector(`.row button.check${mastermind.attemptNumber}`);
mastermind._checkButton.classList.add("showButton");
//add event listener to current rows guessHolder divs.
for (let i = 0; i < mastermind._guessHolders.length; i++) {
mastermind._guessHolders[i].addEventListener("click", mastermind.holeClickHandler);
mastermind._guessHolders[i].style.cursor = "pointer";
}
//add event listener to current levels check button.
mastermind._checkButton.addEventListener("click", mastermind.checkButtonClickHandler);
}
mastermind.pinSelectHandleChange = (e) => {
mastermind.userSelectedPin = e.target.value;
}
mastermind.init = () => {
mastermind._startResetButton = document.querySelector(".start-reset");
mastermind._rulesButton = document.querySelector(".rules-button");
mastermind._rulesPage = document.querySelector('.rules-page');
mastermind._closeRulesButton = document.querySelector(".close-rules-button");
//add event listener for the star-reset button
mastermind._startResetButton.addEventListener("click",mastermind.startResetClickHandler);
mastermind._rulesButton.addEventListener("click", mastermind.rulesButtonClickHandler);
mastermind._closeRulesButton.addEventListener("click", mastermind.closeRulesButtonClickHandler)
//generate the unique answer for the round
mastermind.generateRightAnswer(mastermind.colors);
mastermind._pinButtons = document.querySelectorAll("input[name=pin]");
mastermind._pinButtonLabels = document.querySelectorAll("label.pin");
//add event listener for radio buttons and if user clicks a radio button, store the color in a global variable
mastermind._pinButtons.forEach(pinButton =>
pinButton.addEventListener("change", mastermind.pinSelectHandleChange)
);
mastermind._pinButtons.forEach(pinButton => {
pinButton.disabled = true;
pinButton.checked = false;
});
};
//when page loads, start the game.
document.addEventListener("DOMContentLoaded", function() {
mastermind.init();
});