-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.js
More file actions
327 lines (295 loc) · 12.3 KB
/
Copy pathapp.js
File metadata and controls
327 lines (295 loc) · 12.3 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
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
// Query select into a var all tile div's
// ========================================================== //
// =============== DOM ELEMENTS & /G VARIABLES ============== //
// ========================================================== //
// Query select into a var listeners to span's and p's of the bottom menu that will display messages
// Set variables like score and player turn
const tiles = document.querySelectorAll('.game-grid > div')
const gameHeading = document.querySelector('.game-heading')
const subHeading = document.querySelector('.sub-heading')
const resetBtn = document.querySelector('#reset-btn')
const alertMsg = document.querySelector('.alert-messages')
const blueScoreboard = document.querySelector('.blue-score')
const redScoreboard = document.querySelector('.red-score')
const botButton = document.querySelector('.bot-icon')
var randomBotClicked = false;
var cleverBotClicked = false;
var currentPlayersTurn = "red-player"
var blueScore = 0
var redScore = 0
var isThereWinner = false
var gameWinner = ""
var gameLoser = ""
// ========================================================== //
// ======================+ GAME LOGIC +====================== //
// ========================================================== //
// Logc layout for game
// Figure out a way to run conditional tests for gameWinner.. needs to be a function to checkWinner()
// after each player has selected a tile change the color scheme of that tile
// &&
// after the player has selected the tile change to the next player's turn, using CSS change the button selector
// also display a message showing who's turn it is
// &&
// e.g. if 3 successive tiles then show gameWinner message and some glow effect on those tiles?
// TEST: If 3 tiles in a row, column or diagonal add to 15 -> we have a gameWinner?
// Figure out some scoring system that allows us to tally and determine a gameWinner for selections
const checkWinner = (player) => {
// TEST ROWS // any way to include less brackets??
if ((tiles[0].classList.contains(player)) && (tiles[1].classList.contains(player)) && (tiles[2].classList.contains(player))) {
isThereWinner = true
tiles[0].classList.add(`${player}-glow`)
tiles[1].classList.add(`${player}-glow`)
tiles[2].classList.add(`${player}-glow`)
} else if ((tiles[3].classList.contains(player)) && (tiles[4].classList.contains(player)) && (tiles[5].classList.contains(player))) {
isThereWinner = true
tiles[3].classList.add(`${player}-glow`)
tiles[4].classList.add(`${player}-glow`)
tiles[5].classList.add(`${player}-glow`)
} else if ((tiles[6].classList.contains(player)) && (tiles[7].classList.contains(player)) && (tiles[8].classList.contains(player))) {
isThereWinner = true
tiles[6].classList.add(`${player}-glow`)
tiles[7].classList.add(`${player}-glow`)
tiles[8].classList.add(`${player}-glow`)
}
// TEST COLUMNS
if ((tiles[0].classList.contains(player)) && (tiles[3].classList.contains(player)) && (tiles[6].classList.contains(player))) {
isThereWinner = true
tiles[0].classList.add(`${player}-glow`)
tiles[3].classList.add(`${player}-glow`)
tiles[6].classList.add(`${player}-glow`)
} else if ((tiles[1].classList.contains(player)) && (tiles[4].classList.contains(player)) && (tiles[7].classList.contains(player))) {
isThereWinner = true
tiles[1].classList.add(`${player}-glow`)
tiles[4].classList.add(`${player}-glow`)
tiles[7].classList.add(`${player}-glow`)
} else if ((tiles[2].classList.contains(player)) && (tiles[5].classList.contains(player)) && (tiles[8].classList.contains(player))) {
isThereWinner = true
tiles[2].classList.add(`${player}-glow`)
tiles[5].classList.add(`${player}-glow`)
tiles[8].classList.add(`${player}-glow`)
}
// TEST DIAGONAL
if ((tiles[0].classList.contains(player)) && (tiles[4].classList.contains(player)) && (tiles[8].classList.contains(player))) {
isThereWinner = true
tiles[0].classList.add(`${player}-glow`)
tiles[4].classList.add(`${player}-glow`)
tiles[8].classList.add(`${player}-glow`)
} else if ((tiles[6].classList.contains(player)) && (tiles[4].classList.contains(player)) && (tiles[2].classList.contains(player))) {
isThereWinner = true
tiles[6].classList.add(`${player}-glow`)
tiles[4].classList.add(`${player}-glow`)
tiles[2].classList.add(`${player}-glow`)
}
// ASSIGN AND LOSER
assignWinnerLoser()
// CHECK FOR DRAW
checkDraw()
}
const assignWinnerLoser = () => {
// ASSIGNING WINNER
if (isThereWinner) {
gameWinner = currentPlayersTurn
// printing winner to the heading..
let winnerArr = []
winnerArr = gameWinner.split('-')
let winningPlayerH1 = winnerArr[0]
gameHeading.textContent = `${winningPlayerH1} wins!`
disableBoard()
// setTimeout(confetti({
// origin: {
// x: 0.5,
// y: 1.,
// }
// }), 1000)
// ASSIGNING LOSER
if (gameWinner === "red-player") {
redScore += 1
redScoreboard.textContent = redScore
gameLoser = "blue-player"
} else if (gameWinner === "blue-player") {
blueScore += 1
blueScoreboard.textContent = blueScore
gameLoser = "red-player"
}
// SHOOT CONFETTI IF EITHER SIDE SCORE IS === 2
if (blueScore === 2 || redScore === 2) {
confetti({
origin: {
x: 0.5,
y: 1.0
}
})
confetti({
origin: {
x: 0.5,
y: 0.5
}
})
confetti({
origin: {
x: 0.5,
y: 0.7
}
})
confetti({
origin: {
x: 0.5,
y: 0.2
}
})
}
}
}
const checkDraw = () => {
var tileCount = 0
var totalTiles = tiles.length
for (let i = 0; i < tiles.length; i++) {
if (tiles[i].classList.contains('blue-player') || tiles[i].classList.contains('red-player')) {
tileCount++
}
if (totalTiles === tileCount) {
for (let i = 0; i < tiles.length; i++) {
tiles[i].removeEventListener('click', turnHandler)
}
alertMsg.textContent = "It's a draw"
// it's a draw.. print the appropriate messages and animations
}
}
}
const turnHandler = () => {
if (currentPlayersTurn === "blue-player") {
event.target.classList.add('blue-player')
alertMsg.textContent = "Red, its your turn!"
checkWinner(currentPlayersTurn)
// how to push the turn data to the array so bot can know selected tiles tiels ?
currentPlayersTurn = "red-player"
} else if (currentPlayersTurn === "red-player") {
event.target.classList.add('red-player')
alertMsg.textContent = "Blue, go go go!"
checkWinner(currentPlayersTurn)
currentPlayersTurn = "blue-player"
if (randomBotClicked) {
setTimeout(runRandomBot, 1000)
} else if (cleverBotClicked) {
setTimeout(runCleverBot, 1000)
}
}
if (event.target.classList.contains('blue-player') || event.target.classList.contains('red-player')) {
event.target.removeEventListener('click', turnHandler)
}
}
const disableBoard = () => {
for (let i = 0; i < tiles.length; i++) {
tiles[i].removeEventListener('click', turnHandler)
if (!tiles[i].classList.contains(gameWinner)) {
tiles[i].className = "tile-reset"
} else {
alertMsg.textContent = "Reset to start again :)"
}
}
}
const resetBoard = () => {
for (let i = 0; i < tiles.length; i++) {
tiles[i].className = "tile"
tiles[i].classList.add('tile-dwn')
alertMsg.textContent = "Board has been reset"
gameHeading.textContent = "Pick15"
isThereWinner = false
currentPlayersTurn = "red-player"
}
for (let i = 0; i < tiles.length; i++) {
tiles[i].addEventListener('click', turnHandler)
}
gameWinner = ""
gameLoser = ""
// Qns need to somehow reset the checkDraw tileCounter that is locally scoped so after reset there can draw again
}
// ========================================================== //
// ==================++ EVENT LISTENERS ++=================== //
// ========================================================== //
for (let i = 0; i < tiles.length; i++) {
tiles[i].addEventListener('click', turnHandler)
}
resetBtn.addEventListener('click', resetBoard)
// ========================================================== //
// ==================+++ BOT FUNCTIONS +++=================== //
// ========================================================== //
// RANDOM BOT
const initRandomBot = () => {
randomBotClicked = true
alertMsg.textContent = "Random bot activated"
}
const runRandomBot = () => {
let availableTiles = []
for (let i = 0; i < tiles.length; i++) {
if (!tiles[i].classList.contains('blue-player') && !tiles[i].classList.contains('red-player')) {
availableTiles.push(i)
}
}
let botMove = availableTiles[Math.floor(Math.random() * availableTiles.length)]
tiles[botMove].click()
}
botButton.addEventListener('click', initRandomBot)
// CLEVER BOT
const initCleverBot = () => {
cleverBotClicked = true
randomBotClicked = false
alertMsg.textContent = "Clever bot activated"
}
const runCleverBot = () => {
// go for middle tile first if you can sir
if (!tiles[4].classList.contains('blue-player') && !tiles[4].classList.contains('red-player')) {
tiles[4].click()
}
// test for available tiles with a loop and store them in an array
let availableTiles = []
for (let i = 0; i < tiles.length; i++) {
if (!tiles[i].classList.contains('blue-player') && !tiles[i].classList.contains('red-player')) {
availableTiles.push(i)
}
}
// start the calculated logic to pick next tile
// why is the below not working??
let cornerTiles = [0, 8, 2, 6]// compare available tiles to corner tiles - if there is overlap - store the value in a new array - then select a random item from the new array
var cleverBotChoicesArr = []
availableTiles.forEach((t1) => cornerTiles.forEach((t2) => {
if (t1 === t2) {
cleverBotChoicesArr.push(t1)
}
}))
// select a random tile from those corner tiles
let betweenTiles = [1, 3, 5, 7]
}
const comparePlayableArrays = (arr1, arr2) => {
cleverBotChoicesArr = []
}
// below method won't work because when only one of the tested tiles fails the block is exited
// else if (!tiles[0].classList.contains('blue-player') && !tiles[0].classList.contains('red-player') &&
// (!tiles[8].classList.contains('blue-player') && !tiles[8].classList.contains('red-player'))) {
// let randomCornerIndexOne = cornerTilesOne[Math.floor(Math.random() * cornerTilesOne.length)]
// tiles[randomCornerIndexOne].click() // but will not run when one of the first corners is occupied.. limitation
// } else if () {
// }
// .forEeach method, issue is that it bulk selects all the tiles
// cornerTiles.forEach(function (tile) {
// if (!tiles[tile].classList.contains('blue-player') && !tiles[tile].classList.contains('blue-player')) {
// tiles[tile].click()
// }
// })
// how to loop through and checl if each of those positions is occupied?
// for (let i = 0; i < cornerTiles.length; i++) {
// if (tiles[cornerTiles[i]].classList.contains('blue-player') || tiles[cornerTiles[i]].classList.contains('red-player')) {
// tiles[i].click()
// } else // potentially just select a random corner tile?
// then go for the rest of the inbetween tiles [1, 3, 5, 7]
// // go for the middle tile first
// // look to see what outer tiles are occupied
// // store each outer tile
// // else go for the rest of the available tiles
// }
botButton.addEventListener('dblclick', initCleverBot)
$(".bot-icon").on("tripleclick", function () {
randomBotClicked = false
cleverBotClicked = false
alertMsg.textContent = "Bot deactivated"
})